第二章
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 2int 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 2int 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 16int 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 16int 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;elsebinary[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>// strcopyint mystrcopy(char a[], char b[]){int i = 0;while (b[i]){a[i] = b[i];i++;}a[i] = 0;return 0;}//strcmpint 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;}//strcatint 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(注意考虑溢出问题)。
