一些简单的C语言题目
1.求整数平均值
求整数平均值
本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出4个整数,其间以空格分隔。
输出格式:
在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。
输入样例:
1 2 3 4
输出样例:
Sum = 10; Average = 2.5
1. #include <stdio.h> 2. 3. int main() { 4. int a[4], sum = 0; 5. float average = 0; 6. for (int i = 0; i <= 3; i++) 7. scanf("%d", &a[i]);//输入到数组,只有一句,可以不加大括号 8. for (int i = 0; i <= 3; i++) 9. sum += a[i];//求和 10. average = (float)sum / 4; //强制类型转换,不然报错 11. printf("Sum = %d; Average = %.1f", sum, average); 12. }
2.是不是太胖了
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)
输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。
输入样例:
169
输出样例:
124.2
1. #include <stdio.h> 2. 3. int main(void) { 4. int H; 5. float b; 6. scanf("%d", &H); 7. b = (H - 100) * 0.9 * 2; 8. printf("%.1f", b); 9. return 0; 10. }
3.计算摄氏温度
给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出一个华氏温度。
输出格式:
在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。
输入样例:
150
输出样例:
Celsius = 65
注意:输出格式有空格
1. #include <stdio.h> 2. 3. int main() { 4. int c, f; 5. scanf("%d", &f); 6. c = 5 * (f - 32) / 9; 7. printf("Celsius = %d", c); 8. return 0; 9. }
4.求三角形面积
输入三角形的三边长,求其面积。
输入格式:
在一行中输入能够构成三角形的3个实数,3个数之间用逗号间隔。
输出格式:
对每一组输入,在一行中输出面积值,结果保留两位小数,没有附加字符。
输入样例:
3,3,3
输出样例:
3.90
解题思路:
- 先按照格式输入三个实数a、b、c,(下面应该是float类型?)
- 判断 是否满足三角形判定条件(任意两边之和大于第三边)
- 如果满足,在上述if判断条件中计算三角形面积
- 用高中推导过的海伦公式计算,很方便
- 海伦公式 S = √p(p-a)(p-b)(p-c)
- 打印输出结果
1. #include <stdio.h> 2. #include <math.h> //声明引用到的头文件,调用其中sqrt开平方的函数 3. 4. int main() { 5. int a, b, c; //定义三角形三条边长 6. float s, area, s2; 7. scanf("%d,%d,%d", &a, &b, &c); 8. if (a > 0 && b > 0 && c > 0 && (a + b > c) && (a + c > b) && (b + c > a)) { 9. //(任意两边之和大于第三边) 10. s = (float)(a + b + c) / 2;//必须强制类型转换!不然s为int类型,计算后转为float类型的数据,会造成数据丢失 11. 12. //海伦公式计算三角形面积 13. s2 = s * (s - a) * (s - b) * (s - c); 14. area = sqrt(s2); 15. 16. //打印结果 17. printf("%.2f", area); //保留两位小数 18. } 19. return 0; 20. }
我记得这样写的程序是过了的
5.整数152的各位数字
本题要求编写程序,输出整数152的个位数字、十位数字和百位数字的值。
输入格式:
本题无输入。
输出格式:
按照以下格式输出:
152 = 个位数字 + 十位数字*10 + 百位数字*100
本题考察除法和求余运算,进行数位分离
1. #include <stdio.h> 2. 3. int main() { 4. int a = 152, i, j, k; 5. k = a % 10; //个位数 6. i = a / 100; //百位数 7. j = a / 10 % 10; //十位数 8. printf("152 = %d + %d*10 + %d*100", k, j, i); 9. return 0; 10. }
6.交换a和b的值
交换变量a,b的值,如输入a的值为1,b的值为5,则输出a的值为5,b的值为1。
输入格式:
输入两个整数,之间用一个空格间隔。
输出格式:
在一行中按照“a=x,b=y”的格式输出,其中x和y均是原样输出,不加宽度控制。
输入样例:
1 5
输出样例:
a=5,b=1
思路: 定义一个暂存变量t
1. #include <stdio.h> 2. 3. int main(void) { 4. int a, b, t; 5. scanf("%d%d", &a, &b); 6. t = a; 7. a = b; 8. b = t; 9. printf("a=%d,b=%d", a, b); 10. return 0; 11. }
7.计算分段函数
7-8 计算分段函数[2]
本题目要求计算下列分段函数f(x)的值:
注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。
输入样例1:
10
输出样例1:
f(10.00) = 3.16
输入样例2:
-0.5
输出样例2:
f(-0.50) = -2.75
1. #include <stdio.h> 2. #include <math.h> 3. 4. int main(void) { 5. float x, y; 6. scanf ("%f", &x); 7. 8. if (x >= 0) 9. y = sqrt(x); 10. else 11. y = pow((x + 1), 2) + 2 * x + 1 / x; 12. 13. printf("f(%.2f) = %.2f", x, y); 14. 15. return 0; 16. }
注意最后输出格式保留两位小数 %.2f
8.阶梯电价
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。
输出格式:
在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。
输入样例1:
10
输出样例1:
cost = 5.30
输入样例2:
100
输出样例2:
cost = 55.50
1. #include <stdio.h> 2. 3. int main(void) { 4. float cost, n; 5. scanf("%f", &n); 6. 7. if (n <= 50 && n >= 0) { 8. cost = 0.53 * n; 9. printf("cost = %.2f", cost); 10. } 11. else if (n > 50) { 12. cost = 0.53 * 50 + (0.53 + 0.05) * (n - 50); 13. printf("cost = %.2f", cost); 14. } 15. else 16. printf("Invalid Value!"); 17. 18. return 0; 19. }
本题用到了
if(……) {……}
else if(……) {……}
else {……}
分支结构
9.计算符号函数的值
7-10 计算符号函数的值
对于任一整数n,符号函数sign(n)的定义如下:
请编写程序计算该函数对任一输入整数的值。
输入格式:
输入在一行中给出整数n。
输出格式:
在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。
输入样例1:
10
输出样例1:
sign(10) = 1
输入样例2:
0
输出样例2:
sign(0) = 0
输入样例3:
-98
输出样例3:
sign(-98) = -1
1. #include <stdio.h> 2. 3. int main(void) { 4. int n, sign; 5. scanf("%d", &n); 6. if (n < 0) 7. sign = -1; 8. else if (n == 0) 9. sign = 0; 10. else if (n > 0) 11. sign = 1; 12. 13. printf("sign(%d) = %d", n, sign); 14. 15. return 0; 16. }
10.输出三角形面积和周长
本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
输入格式:
输入为3个正整数,分别代表三角形的3条边a、b、c。
输出格式:
如果输入的边能构成一个三角形,则在一行内,按照area = 面积; perimeter = 周长的格式输出,保留两位小数。否则,输出These sides do not correspond to a valid triangle
输入样例1:
5 5 3
输出样例1:
area = 7.15; perimeter = 13.00
输入样例2:
1 4 1
输出样例2:
These sides do not correspond to a valid triangle
1. #include <stdio.h> 2. #include <math.h> 3. 4. int main() { 5. int a, b, c; //定义三角形三条边长 6. float s, area, perimeter, s2; 7. scanf("%d%d%d", &a, &b, &c); //输入边长 8. if (a > 0 && b > 0 && c > 0 && (a + b > c) && (a + c > b) && (b + c > a)) { 9. //(任意两边之和大于第三边) 10. s = (float)(a + b + c) / 2; //必须强制类型转换 11. 12. s2 = s * (s - a) * (s - b) * (s - c); 13. area = sqrt(s2); 14. 15. perimeter = a + b + c;//周长 16. 17. printf("area = %.2f; perimeter = %.2f", area, perimeter); 18. } 19. else 20. printf("These sides do not correspond to a valid triangle"); 21. 22. return 0; 23. }
11.三天打鱼两天晒网
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
输入格式:
输入在一行中给出一个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
输入样例1:
103
输出样例1:
Fishing in day 103
输入样例2:
34
输出样例2:
Drying in day 34
这里用到了标志位的思想
flag是一个标志位,记录n被5除的余数,判断余数大小即可知道打鱼还是晒网
1. #include <stdio.h> 2. 3. int main(void) { 4. int n, flag; 5. scanf("%d", &n); //输入 6. 7. if (n >= 0 && n <= 1000) //判断数据是否在0~1000内 8. flag = n % 5 ; //flag是一个标志位,记录n被5除的余数 9. 10. if (flag <= 3 && flag >= 1) //余数在1~3之间,就是打鱼日 11. printf("Fishing in day %d", n); 12. else //否则就是晒网子 13. printf("Drying in day %d", n); 14. 15. return 0; 16. }
12.三个数由小到大输出
输入三个整数x,y,z,请把这三个数由小到大输出。
输入格式:
在一行中直接输入3个整数,之间各用一个空格间隔。
输出格式:
在一行中按照“x=最小值,y=次小值, z=最大值”的顺序输出结果,最大值、次大值和最小值均原样输出,没有宽度控制。
输入样例:
2 1 3
输出样例:
x=1,y=2,z=3
1. #include <stdio.h> 2. 3. void swap(int *i, int *k) { //用指针,数据才能改变! 4. int t; 5. t = *i; 6. *i = *k; 7. *k = t; 8. }; 9. 10. int main() { 11. int x, y, z, t; 12. scanf("%d%d%d", &x, &y, &z); 13. if (x > y) 14. swap(&x, &y); 15. if (x > z) 16. swap(&x, &z); 17. if (y > z) 18. swap(&y, &z); 19. printf("x=%d,y=%d,z=%d", x, y, z); 20. return 0; 21. }
13.计算天数
本题要求编写程序计算某年某月某日是该年中的第几天。
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62
一年有12个月份,用if else语句显得代码比较臃肿,选用switch语句更简洁方便
switch语句中的break语句在其中起什么作用呢?它让程序离开switch语句,跳转至switch语句后面的下一条语句。如果没有break语句,就会从匹配标签开始执行到switch末尾!
思路:从大月往小月累加,借助switch语句中break语句的的特点
1. #include <stdio.h> 2. 3. int main() { 4. int year, month, day, sum; 5. scanf("%d/%d/%d", &year, &month, &day); 6. sum += day; //先累加当前月份的日期 7. switch (month - 1) { //month - 1是从上一个月份开始累加 8. case 11: 9. sum += 30; 10. case 10: 11. sum += 31; 12. case 9: 13. sum += 30; 14. case 8: 15. sum += 31; 16. case 7: 17. sum += 31; 18. case 6: 19. sum += 30; 20. case 5: 21. sum += 31; 22. case 4: 23. sum += 30; 24. case 3: 25. sum += 31; 26. case 2: //2月分情况讨论 27. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //闰年条件 28. sum += 29; 29. else 30. sum += 28; 31. case 1: 32. sum += 31; 33. break; 34. } 35. 36. printf("%d", sum); 37. return 0; 38. }
可以注意到只有 case 1:语句(1月份)后面才有break语句,其他月份都不加break语句,这样就可以可以从大的月份一直累加到1月,直到累加到1月才跳出switch语句:
如果是1月几号,month - 1 = 0,不满足switch语句的条件,直接跳转到printf语句
14.两个数的简单计算器
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式:
当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。
输入样例1:
-7 / 2
输出样例1:
-3
输入样例2:
3 & 6
输出样例2:
ERROR
1. #include <stdio.h> 2. 3. int main(void) { 4. int x, y; 5. char c; 6. scanf("%d %c %d", &x, &c, &y); 7. switch (c) { 8. case '+' : 9. printf("%d", x + y); 10. break; 11. case '-' : 12. printf("%d", x - y); 13. break; 14. case '*' : 15. printf("%d", x * y); 16. break; 17. case '/' : 18. printf("%d", x / y); 19. break; 20. case '%' : 21. printf("%d", x % y); 22. break; 23. default: 24. printf("ERROR"); 25. } 26. return 0; 27. }
15.输出闰年
输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。
输入格式:
输入在一行中给出21世纪的某个截止年份。
输出格式:
逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。
输入样例1:
2048
输出样例1:
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
输入样例2:
2000
输出样例2:
Invalid year!
1. #include <stdio.h> 2. 3. int main(void) { 4. int y, flag = 0; 5. scanf("%d", &y); 6. if (y <= 2000 || y > 2100) 7. printf("Invalid year!"); 8. else { 9. for (int i = 2001; i <= y; i++) { 10. if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) { 11. printf("%d\n", i); 12. flag++; 13. } 14. } 15. if (flag == 0) 16. printf("None"); 17. } 18. return 0; 19. }
回忆一下大一下学期被PTA这个破网站支配的恐惧日子