本习题解析只是作为一种参考,代码不唯一!
2. C语言概述 1)习题 2.3编写程序,由键盘输入任意3个数,找出其中最小的数
#includeint main() { int x, y, z,min; printf("请输入第1个数:"); scanf("%d", &x); printf("请输入第2个数:"); scanf("%d", &y); printf("请输入第3个数:"); scanf("%d", &z); if (x < y){ if (x < z){ min = x; } else{ min = z; } } else{ if (y > z){ min = z; } else { min = y; } } printf("3个数的最小值是:%d", min); return 0; }
2)习题 2.4总结:
本质是打擂台!
编写程序,从键盘输入两个整数分别给变量x、y,如果x>y,则输出x及x-y的值;否则,输出y及y-x的值。
#include3)习题 2.5int main(){ int x, y; printf("请输入x:"); scanf("%d", &x); printf("请输入y:"); scanf("%d", &y); if (x > y) { printf("x的值为:%dnx-y的值为:%d", x,x-y); } else { printf("y的值为:%dny-x的值为:%d", y, y-x); } return 0; }
编写程序,求1+3+5+……+99。
#include4)习题 2.6int main() { int sum = 0; for (int i = 1; i < 100; i=i+2) { sum += i; } printf("1+3+5+…+99的和为:%d", sum); return 0; }
编写程序,统计1000以内的自然数中3的倍数之和。
#include5)习题 2.7int main() { int sum = 0,j = 1; for (int i = 3; i < 1000; i = 3 * j) { //printf("i为:%dn", i); sum += i; j++; } printf("1000以内的自然数中3的倍数之和为:%d", sum); return 0; }
编写程序,输出0°~360°中所有度数为5°倍数的角度的正弦值和余弦值,即输出0°、5°、10°、15°、……、360°的正弦值和余弦值。
备注:
使用正余弦函数需要添加头文件math.h
正余弦函数(参数只能接受弧度制)
- double sin(double x);
- double cos(double x);
反余弦函数(参数值为-1-1)
- double acos(double x); 返回以弧度制表示的x的反余弦
#include6)习题 2.8#include int main() { int degree = 0; double Pi = acos(-1); for (int i = 0; degree<= 360; i++) { degree = 5 * i; double y = sin(Pi / 180.0 * degree); double x = cos(Pi / 180.0 * degree); printf("%d度的正弦值为:%f,余弦值为:%fn",degree,y,x); } return 0; }
编写程序,由键盘输入20个整数,统计其中的正整数、负整数、0分别有多少个?并分别计算其中的正整数、负整数之和以及各自的平均值(结果为浮点型,输出时保留2位小数)。
补充:
1.保留2位小数,使用点‘’.”+数字 例如:%.2f(保留2位小数)
2.默认右对齐
#include7)习题 2.9int main() { int posNum = 0, negNum = 0 , zero = 0; double posSum = 0, negSum = 0; //double posAver, negAver = 0; int num; for (int i = 0; i < 20; i++) { printf("请输入整数:"); scanf("%d", &num); if (num > 0) { posNum++; posSum += num; } else if (num < 0) { negNum++; negSum += num; } else { zero++; } } printf("正整数有:%d个,负整数有:%d个,0有:%d个n",posNum,negNum,zero); printf("正整数之和为:%.2f,负整数之和为:%.2fn", posSum, negSum); printf("正整数的平均值为:%.2f,负整数的平均值为:%.2f", posSum / posNum, negSum / negNum); return 0; }
编写程序,由键盘输入20个整数,分别找出其中的最大正整数、最小正整数、最大负整数、最小负整数
#includeint main() { int data[20]; int num; int posAppear = 0, negAppear = 0; int posMax, posMin, negMax, negMin; for (int i = 0; i < 20; i++) { printf("请输入第%d个数:", i + 1); scanf("%d", &num); data[i] = num; } for (int j = 0; j < 20; j++) { if (data[j] > 0) { posAppear++; if (posAppear == 1) { posMax = posMin = data[j]; } else { posMax = posMax > data[j] ? posMax : data[j]; posMin = posMin < data[j] ? posMin : data[j]; } } else if (data[j] < 0) { negAppear++; if (negAppear == 1) { negMax = negMin = data[j]; } else { negMax = negMax > data[j] ? negMax : data[j]; negMin = negMin < data[j] ? negMin : data[j]; } } else { continue; } } if (posAppear != 0 && negAppear != 0) //存在整数也存在负数 { printf("最大正整数为:%d,最小正整数为:%dn", posMax, posMin); printf("最大负整数为:%d,最小负整数为:%dn", negMax, negMin); } else { if (posAppear == 0 && negAppear == 0) { printf("输入全为0,不存在最大最小正负整数!"); } else if (negAppear == 0) { printf("最大正整数为:%d,最小正整数为:%dn", posMax, posMin); printf("不存在最大、最小负整数!"); } else { printf("不存在最大、最小正整数!"); printf("最大负整数为:%d,最小负整数为:%dn", negMin, negMin); } } return 0; }
3. 数据类型与输入输出 1)习题 3.3 程序阅读 (1)若x为int型变量,则执行以下语句后的输出结果是什么?总结:
使用数组完成打擂台,数组是个好工具
数组的创建:int 数组名[长度];
数组不初始化,默认的值是不确定的
全初始化:例 int data[10] = {0},默认值都为0
#includeint main() { int x = 0xDEF; printf("%4d,%4o,%4x", x, x, x); return 0; }
结果:
(2)若x、y为int型变量,则执行以下语句后的输出结果是什么?注意:
1.DEF输出后是小写的
2.%o代表8进制,%x代表16进制
3.记忆:o是October,x是sixteen,d是decimal
#includeint main() { int x, y; x = 015,y = 0x15; printf("%4o%4xn",x,y); printf("%4x%4dn",x,y); printf("%4d%4on",x,y); return 0; }
结果:
补充:
1.0开头代表八进制,0x开头代表16进制
2.程序默认右对齐
3.左对齐可以使用“-”,例如:%-4f
以上两题主要考察进制的转化,要熟悉了解进制的转化规则:
1.二进制转十进制,主要是乘2的几次幂再相加
2.十进制转二进制:除2取余法
3.二进制转八进制:取三合一法(反之亦然)
4.二进制转十六进制:取四合一法(反之亦然)
#includeint main() { char c1 = 'a', c2 = 'b', c3 = 'c', c4 = '101', c5 = '116'; printf("abctdebhrAtgn"); printf("a%cb%ctc%ctabcn",c1,c2,c3); printf("tb%c%c", c4, c5); return 0; }
结果:
总结:
特别注意t和r
区别:
- t是制表符(不一定是8个或者4个),就是空几个格,这里有个公式:spaceNum = |n - 8| % 8(n代表t前的字符个数,包括%等)
- r是回车符(注意几种情况),如果回车后的字符多于前面的原始字符,则进行替换。如果不足则将原始数据进行补充
- t注意光标的位置,和t一起使用时,可能会出现局部替换的情况
- 字符串结束时会添加一个 的结束符
- XXX代表以8进制表示的数
参考资料:
t的详细介绍
r的详细介绍
x-y=-7.3 a-b=-5
c1=A or 65(ASCII)
c2=B or 66(ASCII)
#include(5)若已有说明:int main() { int a = 5, b = 10; float x = 3.5, y = 10.8; char c1 = 'A', c2 = 'B'; printf("x-y=%.1f a-b=%dn", x - y, a - b); printf("c1=%c or %d(ASCII)n", c1, c1); printf("c2=%c or %d(ASCII)n",c2,c2); return 0; }
int a = 123;
float b = 456.78;
double c = -123.45678;
试写出以下各printf语句相应的输出结果
#includeint main() { int a = 123; float b = 456.78; double c = -123.45678; printf("%.3f %.3e %fn",b,b,c); printf("%8.3f %8.3e %gn", b, b, c); printf("%u %-10.3f %-10.3en",a,b,c); return 0; }
结果:
#include
int main() {
int x=0; float y=0.0; char z=‘0’;
scanf(“%3d%f%3c”, &x, &y, &z);
printf(“x的值为:%d,y的值为:%f,z的值为:%c”, x,y,z);
return 0;
}
输入以下数据
12345abc
则x、y和z的值分别是什么?
结果:
写一个程序,首先向数组中输入10个得分,然后去掉一个最高分,去掉一个最低分,计算剩下的平均分,并输出。
使用冒泡排序算法
#includeint main() { float score[10] = { 0 }; for (int i = 0; i < 10; i++) { printf("请输入第%d位同学的得分:", i+1); scanf("%f", &score[i]); } for (int i = 0; i < 10; i++) { for (int j = 0; j < 10 - 1 - i; j++) { if (score[j] > score[j+1]) { float temp = score[j]; score[j] = score[j + 1]; score[j + 1] = temp; } } } //计算剩下的平均分 double sum = 0; for (int k = 1; k < 9; k++) { sum += score[k]; } printf("去掉一个最高分:%.0f,去掉一个最低分:%.0fn", score[9], score[0]); printf("平均分为:%.1f", sum/8); return 0; }
使用选择排序算法
#includeint main() { float score[10] = { 0 }; for (int i = 0; i < 10; i++) { printf("请输入第%d位同学的得分:", i+1); scanf("%f", &score[i]); } for (int i = 0; i < 10; i++) { for (int j = i+1; j < 10; j++) { if (score[i] > score[j]) { float temp = score[i]; score[i] = score[j]; score[j] = temp; } } } //计算剩下的平均分 double sum = 0; for (int k = 1; k < 9; k++) { sum += score[k]; } printf("去掉一个最高分:%.1f,去掉一个最低分:%.1fn", score[9], score[0]); printf("平均分为:%.1f", sum/8); return 0; }
3)习题 3.6总结:
冒泡排序是相邻比,选择排序是和每一个比
编写一个程序,输入一个字符串,输出其中ASCII码最大的字符。
#includeint main() { char s[10] = { ' ' }; printf("请输入一个字符串(长度小于10):"); gets_s(s, 9); int max = s[0]; for (int i = 1; i < 9; i++) { max = max > s[i] ? max : s[i]; } printf("ASCII码最大的字符是:%c", max); return 0; }
4)习题 3.7总结:
- 字符串的输入有3种方式:gets(不安全,已经被替代)、fgets、gets_s
- 推荐使用fgets、gets_s,可以设定输入长度(边界),安全性更高
- fget(数组名,数组长度,文件指针)
- gets_s(数组名,长度)
- fegts会在数组后添加换行符
- 循环输入使用组合键ctrl+Z结束输入
编写一个程序,输入一个字符串,分别统计并输出其中大写字母(A~Z)和小写字母(a ~z)出现的次数。
#includeint main() { char s[40]; int upperNum = 0, lowerNum = 0; printf("请输入一个字符串:"); gets_s(s, 39); for (int i = 0; s[i] != ' '; i++) { if (s[i] >= 'a' && s[i] <= 'z') { lowerNum++; } else if (s[i] >= 'A' && s[i] <= 'Z') { upperNum++; } } printf("大写字母出现的次数:%d,小写字母出现的次数:%d", upperNum, lowerNum); return 0; }
5)习题 3.8总结:
1.空格不等于‘ ’,空格是空串, 是输入语句的结束符
2.判断输入是否完成可以使用 xxx != ‘ ’
想一想,怎么判断一个字符串是否为空串?编写程序,输入一个字符串,如果不是空串,则照原样输出;如果是空串,则输出“空串”。例如,如果输入“hello”(不含引号),则输出“你输入的是:hello”;如果什么都没有输入,则输出“你输入的是空串!”
#includeint main() { char s[40]; printf("请输入一个字符串:"); gets_s(s, 39); if (s[0] == ' ') { printf("你输入的是空串!"); } else { printf("你输入的是:%s", s); } return 0; }
4. 运算符与表达式 1)习题 4.5总结:
输出字符串可以使用%s
若x、y为int型变量,则执行以下语句后结果是什么?
#includeint main() { int x, y; for ( x = 1; x < 5; x+=2) { for (y = 1; y < 5; y++) printf("%3d", x * y); printf("n"); } return 0; }
结果:
程序填空题。零存整取问题:每月同一天存入银行50元钱,单利计息,月利率为5%,求一年以后的本利和。
#include#define M 50 #define R 0.005 int main() { int i; float sum1 = 0, sum2 = 0; for ( i = 1; i <= 12; i++) { sum1 = sum1 + M; sum2 = sum2 + sum1 * R; } printf("sum1=%.2f sum2=%.2f sum1+sum2=%.2fn", sum1, sum2, sum1 + sum2); return 0; }
结果:



