第二章
1.如何判断两个浮点数是否相等?
#include <stdio.h>
int main()
{
float f = 123.45; // 只能保证精度为7位
if (f - 123.45 > -0.0001 && f - 123.45 < 0.0001)
{
printf("f 等于 123.45");
}
else
{
printf("f 不等于 123.45");
}
return 0;
}
2.从键盘上输入字符,将小写字母转换成大写字母,按组合键Ctrl+Z结束程序
#include <stdio.h>
int main()
{
char c;
while (scanf("%c", &c)!=EOF)
{
printf("%c", c - 32);
}
return 0;
}
解析
#include <stdio.h>
int main()
{
char c;
while (scanf("%c", &c)!=EOF)
{
if (c > 'a' && c <= 'Z')
{
c = c - 32;
}
printf("%c", c);
}
return 0;
}
3.如果有”int a=5, b=3”,那么在执行完”!a&&b++;”后,a和b的值是什么?
短路运算 a=5, b=3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 5;
int b = 3;
!a && b++;
printf("a=%d, b=%d", a, b);
return 0;
}
C语言优先级:
4.进制转换。
(1)将十进制数转换成二进制数。输入十进制数,输出对应的二进制数,按组合键Ctrl+Z结束。
#include <stdio.h>
#include <stdlib.h>
#define N 2
int main()
{
int m, r;
int binary[50];
int decimal; //十进制
while (scanf("%d", &decimal) != EOF)
{
int i = 0, m = decimal;
while (m / N != 0)
{
r = m % N;
m = m / N;
binary[i++] = r;
}
binary[i++] = m;
for (int j = i - 1; j >= 0; j--)
printf("%d", binary[j]);
printf("\n");
}
return 0;
}
(2)将二进制数转换成十进制数。输入二进制数,输出对应的十进制数,按组合键Ctrl+Z结束。
二进制数转换为十进制数,就是将二进制数的每一位乘以2的幂次,最低位是2的零次幂
原书答案可能有些小问题,此处break原书为continue
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 2
int main()
{
//char c;
//scanf("%c", &c);
//printf("%d", c - '0');
/*int value = 6; 字符型数字变整型
char ch = value - 48;
char ch = value - '0';*/
int decimal = 0; //十进制
char b;
int bw = 1;
int binary[50];
int i = 0;
while (scanf("%c", &b) != EOF)
{
if (b == '\n')
break;
binary[i++] = b - '0';
}
for (int j = i - 1; j >= 0; j--) {
decimal += binary[j] * bw;
bw = bw * N;
}
printf("%d\n", decimal);
return 0;
}
(3)将十进制数转换成十六进制数。输入十进制数,输出对应的十六进制数,按组合键Ctrl+Z结束。
十进制转换成十六进制
将N替换成16
#include <stdio.h>
#include <stdlib.h>
#define N 16
int main()
{
int m, r;
int binary[50];
int decimal; //十进制
while (scanf("%d", &decimal) != EOF)
{
int i = 0, m = decimal;
while (m / N != 0)
{
r = m % N;
m = m / N;
binary[i++] = r;
}
binary[i++] = m;
for (int j = i - 1; j >= 0; j--)
printf("%d", binary[j]);
printf("\n");
}
return 0;
}
(4)将十六进制数转换成十进制数。输入十六进制数,输出对应的十进制数,按组合键Ctrl+Z结束。
A-F 在ASCII显示为 65-70
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 16
int main()
{
//char c;
//scanf("%c", &c);
//printf("%d", c - '0');
/*int value = 6; 字符型数字变整型
char ch = value - 48;
char ch = value - '0';*/
int decimal = 0; //十进制
char b;
int bw = 1;
int binary[50];
int i = 0;
while (scanf("%c", &b) != EOF)
{
if (b == '\n')
break;
if (b >= 65 && b <= 70)
binary[i++] = b - 'A' + 10;
else
binary[i++] = b - '0';
}
for (int j = i - 1; j >= 0; j--) {
decimal += binary[j] * bw;
bw = bw * N;
}
printf("%d\n", decimal);
return 0;
}
5.统计一个整数对应的二进制数的1的个数。输入一个整数(可正可负),输出该整数的二进制数中包含1的个数,按组合键Ctrl+Z结束。
位运算
第三章
2.编写如下程序实现相应的功能。
(1)编写程序,输入年、月、日,输出该日期是当年的第几天。
(2)编写程序,输入两个日期(年、月、日,年、月、日),输出这两个日期之间相隔多少天。
(3)编写程序,输入一个日期,输出该日期是周几。提示:a.days % 7 b.(7 - days% 7) % 7
(4)编写程序,输入一个日期和一个整数n,输出从该日期起经过n天后的日期。(5)编写程序,输入一个年份和一个月份,输出月份在该年份的日历。
3.编写程序,输入一个年份,打印该年份的日历,输出结果示例如题图3所示。
第四章
1.本章实现了mystrlen函数,请参照strcpy函数、strcmp函数、strcat函数实现自己的mystrcpy函数、mystrcmp函数和mystrcat函数,实现过程中不可使用str系列字符串操作函数。
strcpy函数逐个地复制字符,一直到结束符’\0’,同时需要把结束符复制给目标数组;
strcmp函数逐个地比较字符,即比较字符对应的ASCII码值的大小,如果发现某个位置对应字母的ASCII码值不同,那么返回;
strcat函数首先找到目标字符串的结束符,然后从原字符串的开头依次向目的字符串尾部赋值,最后把结束符也复制过去。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
// strcopy
int mystrcopy(char a[], char b[])
{
int i = 0;
while (b[i])
{
a[i] = b[i];
i++;
}
a[i] = 0;
return 0;
}
//strcmp
int mystrcmp(char a[], char b[])
{
int i = 0;
while (!(a[i] == 0 && b[i] == 0))
{
if (a[i] < b[i])
return -1;
else if (a[i] > b[i])
return 1;
i++;
}
return 0;
}
//strcat
int mystrcat(char a[], char b[])
{
int i, j = 0;
while (a[i]) {
i++;
}
while (b[j]) {
a[i] = b[j];
i++;
j++;
}
a[i] = 0;
}
int main()
{
return 0;
}
2.输入一行字符串(单词和若干空格),输出该行单词的个数(下画线表示单词之间存在空格)。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int num ;
char c[100];
while (gets(c) != NULL)
{
num = 0;
for (int i = 0; i <= strlen(c); i++)
{
if (i != 0 && c[i - 1] != ' ' && c[i] == ' ')
{
num++;
}
}
if (c[i - 1] != ' ')
num++;
printf("the number of word is %d", num);
}
return 0;
}
3.输入一行字符串(单词和若干空格),输出该行单词(每个单词一行),要求把识别的每个单词首先存为二维字符数组中的一行,然后遍历二维数组打印。
4.输入一行字符串,把字符串翻转。
5.在一个二维数组中,每行都按照从左至右递增的顺序排列,每列都按照从上到下递增的顺序排列。请编写一个函数,输入一个如上所述的二维数组和一个整数,判断数组中是否含有该整数。例如,下面的二维数组就是每行、每列都递增排列的。如果在这个数组中查找数字7,那么返回true;如果查找数字5,那么由于该数组中不含有该数字,返回false。
6.输入数字n,按顺序打印从1到最大的n位十进制数,比如输入3,则打印1, 2,3,直到最大的3位数999(注意考虑溢出问题)。