第二章

1.如何判断两个浮点数是否相等?

  1. #include <stdio.h>
  2. int main()
  3. {
  4. float f = 123.45; // 只能保证精度为7位
  5. if (f - 123.45 > -0.0001 && f - 123.45 < 0.0001)
  6. {
  7. printf("f 等于 123.45");
  8. }
  9. else
  10. {
  11. printf("f 不等于 123.45");
  12. }
  13. return 0;
  14. }

2.从键盘上输入字符,将小写字母转换成大写字母,按组合键Ctrl+Z结束程序

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char c;
  5. while (scanf("%c", &c)!=EOF)
  6. {
  7. printf("%c", c - 32);
  8. }
  9. return 0;
  10. }

解析

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char c;
  5. while (scanf("%c", &c)!=EOF)
  6. {
  7. if (c > 'a' && c <= 'Z')
  8. {
  9. c = c - 32;
  10. }
  11. printf("%c", c);
  12. }
  13. return 0;
  14. }

3.如果有”int a=5, b=3”,那么在执行完”!a&&b++;”后,a和b的值是什么?

短路运算 a=5, b=3

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int a = 5;
  6. int b = 3;
  7. !a && b++;
  8. printf("a=%d, b=%d", a, b);
  9. return 0;
  10. }

C语言优先级:
image.png
image.png
4.进制转换。

(1)将十进制数转换成二进制数。输入十进制数,输出对应的二进制数,按组合键Ctrl+Z结束。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 2
  4. int main()
  5. {
  6. int m, r;
  7. int binary[50];
  8. int decimal; //十进制
  9. while (scanf("%d", &decimal) != EOF)
  10. {
  11. int i = 0, m = decimal;
  12. while (m / N != 0)
  13. {
  14. r = m % N;
  15. m = m / N;
  16. binary[i++] = r;
  17. }
  18. binary[i++] = m;
  19. for (int j = i - 1; j >= 0; j--)
  20. printf("%d", binary[j]);
  21. printf("\n");
  22. }
  23. return 0;
  24. }

(2)将二进制数转换成十进制数。输入二进制数,输出对应的十进制数,按组合键Ctrl+Z结束。
二进制数转换为十进制数,就是将二进制数的每一位乘以2的幂次,最低位是2的零次幂
原书答案可能有些小问题,此处break原书为continue

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define N 2
  5. int main()
  6. {
  7. //char c;
  8. //scanf("%c", &c);
  9. //printf("%d", c - '0');
  10. /*int value = 6; 字符型数字变整型
  11. char ch = value - 48;
  12. char ch = value - '0';*/
  13. int decimal = 0; //十进制
  14. char b;
  15. int bw = 1;
  16. int binary[50];
  17. int i = 0;
  18. while (scanf("%c", &b) != EOF)
  19. {
  20. if (b == '\n')
  21. break;
  22. binary[i++] = b - '0';
  23. }
  24. for (int j = i - 1; j >= 0; j--) {
  25. decimal += binary[j] * bw;
  26. bw = bw * N;
  27. }
  28. printf("%d\n", decimal);
  29. return 0;
  30. }

(3)将十进制数转换成十六进制数。输入十进制数,输出对应的十六进制数,按组合键Ctrl+Z结束。
十进制转换成十六进制
将N替换成16

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 16
  4. int main()
  5. {
  6. int m, r;
  7. int binary[50];
  8. int decimal; //十进制
  9. while (scanf("%d", &decimal) != EOF)
  10. {
  11. int i = 0, m = decimal;
  12. while (m / N != 0)
  13. {
  14. r = m % N;
  15. m = m / N;
  16. binary[i++] = r;
  17. }
  18. binary[i++] = m;
  19. for (int j = i - 1; j >= 0; j--)
  20. printf("%d", binary[j]);
  21. printf("\n");
  22. }
  23. return 0;
  24. }

(4)将十六进制数转换成十进制数。输入十六进制数,输出对应的十进制数,按组合键Ctrl+Z结束。
A-F 在ASCII显示为 65-70

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define N 16
  5. int main()
  6. {
  7. //char c;
  8. //scanf("%c", &c);
  9. //printf("%d", c - '0');
  10. /*int value = 6; 字符型数字变整型
  11. char ch = value - 48;
  12. char ch = value - '0';*/
  13. int decimal = 0; //十进制
  14. char b;
  15. int bw = 1;
  16. int binary[50];
  17. int i = 0;
  18. while (scanf("%c", &b) != EOF)
  19. {
  20. if (b == '\n')
  21. break;
  22. if (b >= 65 && b <= 70)
  23. binary[i++] = b - 'A' + 10;
  24. else
  25. binary[i++] = b - '0';
  26. }
  27. for (int j = i - 1; j >= 0; j--) {
  28. decimal += binary[j] * bw;
  29. bw = bw * N;
  30. }
  31. printf("%d\n", decimal);
  32. return 0;
  33. }

5.统计一个整数对应的二进制数的1的个数。输入一个整数(可正可负),输出该整数的二进制数中包含1的个数,按组合键Ctrl+Z结束。
位运算

第三章

2.编写如下程序实现相应的功能。
(1)编写程序,输入年、月、日,输出该日期是当年的第几天。
(2)编写程序,输入两个日期(年、月、日,年、月、日),输出这两个日期之间相隔多少天。
(3)编写程序,输入一个日期,输出该日期是周几。提示:a.days % 7 b.(7 - days% 7) % 7
(4)编写程序,输入一个日期和一个整数n,输出从该日期起经过n天后的日期。(5)编写程序,输入一个年份和一个月份,输出月份在该年份的日历。

3.编写程序,输入一个年份,打印该年份的日历,输出结果示例如题图3所示。
image.png

第四章

1.本章实现了mystrlen函数,请参照strcpy函数、strcmp函数、strcat函数实现自己的mystrcpy函数、mystrcmp函数和mystrcat函数,实现过程中不可使用str系列字符串操作函数。
strcpy函数逐个地复制字符,一直到结束符’\0’,同时需要把结束符复制给目标数组;
strcmp函数逐个地比较字符,即比较字符对应的ASCII码值的大小,如果发现某个位置对应字母的ASCII码值不同,那么返回;
strcat函数首先找到目标字符串的结束符,然后从原字符串的开头依次向目的字符串尾部赋值,最后把结束符也复制过去。

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. // strcopy
  5. int mystrcopy(char a[], char b[])
  6. {
  7. int i = 0;
  8. while (b[i])
  9. {
  10. a[i] = b[i];
  11. i++;
  12. }
  13. a[i] = 0;
  14. return 0;
  15. }
  16. //strcmp
  17. int mystrcmp(char a[], char b[])
  18. {
  19. int i = 0;
  20. while (!(a[i] == 0 && b[i] == 0))
  21. {
  22. if (a[i] < b[i])
  23. return -1;
  24. else if (a[i] > b[i])
  25. return 1;
  26. i++;
  27. }
  28. return 0;
  29. }
  30. //strcat
  31. int mystrcat(char a[], char b[])
  32. {
  33. int i, j = 0;
  34. while (a[i]) {
  35. i++;
  36. }
  37. while (b[j]) {
  38. a[i] = b[j];
  39. i++;
  40. j++;
  41. }
  42. a[i] = 0;
  43. }
  44. int main()
  45. {
  46. return 0;
  47. }

2.输入一行字符串(单词和若干空格),输出该行单词的个数(下画线表示单词之间存在空格)。
image.png

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int main()
  6. {
  7. int num ;
  8. char c[100];
  9. while (gets(c) != NULL)
  10. {
  11. num = 0;
  12. for (int i = 0; i <= strlen(c); i++)
  13. {
  14. if (i != 0 && c[i - 1] != ' ' && c[i] == ' ')
  15. {
  16. num++;
  17. }
  18. }
  19. if (c[i - 1] != ' ')
  20. num++;
  21. printf("the number of word is %d", num);
  22. }
  23. return 0;
  24. }

3.输入一行字符串(单词和若干空格),输出该行单词(每个单词一行),要求把识别的每个单词首先存为二维字符数组中的一行,然后遍历二维数组打印。
image.png

4.输入一行字符串,把字符串翻转。
image.png
5.在一个二维数组中,每行都按照从左至右递增的顺序排列,每列都按照从上到下递增的顺序排列。请编写一个函数,输入一个如上所述的二维数组和一个整数,判断数组中是否含有该整数。例如,下面的二维数组就是每行、每列都递增排列的。如果在这个数组中查找数字7,那么返回true;如果查找数字5,那么由于该数组中不含有该数字,返回false。
image.png
6.输入数字n,按顺序打印从1到最大的n位十进制数,比如输入3,则打印1, 2,3,直到最大的3位数999(注意考虑溢出问题)。