第1章 第一个C程序
第2章 C语言基础
第3章 变量和数据类型
第4章 顺序结构程序设计
第5章 条件结构程序设计
第6章 循环结构程序设计
第7章 数组
第8章 指针
第9章 函数
第10章 结构型、共用型、枚举型及用户自定义型数据
第12章 文件
第14章 预处理宏命令
第1章 第一个C程序
习题答案
一、选择题
- C
二、填空题
- 补全下面的程序,让其完整。
#include<stdio.h> void main() { int a=1; printf("%d\n", a); }
三、编程题
- 参照例题,编写一个程序输出如下所示的一个倒三角形。
********************* ***************** ************* ********* ***** *
#include<stdio.h> void main() { printf("*********************\n"); printf(" ***************** \n"); printf(" ************* \n"); printf(" ********* \n"); printf(" ***** \n"); printf(" * \n"); }
- 从键盘输入一个数,输出该数的相反数。
#include<stdio.h> void main() { int x = 0; scanf("%d", &x); if (x < 0) { x = -x; } printf("%d\n", x); }
- 编写一个程序,实现两个数相加并将结果输出至屏幕。
#include<stdio.h> void main() { int x, y, z; scanf("%d%d", &x, &y); z = x + y; printf("%d\n", z); }
- 从键盘输入一个数,判断其是否能被 3 和 5 整除,若能整除则输出“yes”,否则输出“no”。
#include<stdio.h> void main() { int x = 0; scanf("%d", &x); if (x % 3 == 0 && x % 5 == 0) { printf("yes\n"); } else { printf("no\n"); } }
- 从键盘输入一个数,通过 printf() 函数输出该数的 2 倍数。
#include<stdio.h> void main() { int x = 0; scanf("%d", &x); printf("%d\n", 2 * x); }
- 从键盘输入两个数,求这两个数的乘积并输出至屏幕。
#include<stdio.h> void main() { int x, y, z; scanf("%d%d", &x, &y); z = x * y; printf("%d\n", z); }
- 编写一个程序,判断一个数是否为偶数。
#include<stdio.h> void main() { int x = 0; scanf("%d", &x); if (x % 2 == 0) { printf("该数是偶数\n"); } else { printf("该数是奇数\n"); } }
第2章 C语言基础
C语言特点
- 简单、方便灵活
- 9中控制语句
- 32个关键字
- 运算符种类丰富
- 34种运算符
- 数据结构类型丰富
- 7种类型
- 绘图功能强大
- 结构式语言
- 对语法限制不严格
- 生成代码质量高、执行效率高
- 可移植性好
C程序编译执行过程
- 编辑
- 编译
- 词法分析
- 语法分析
- 语义分析
- 中间代码生成
- 中间代码优化
- 目标代码生成
- 链接
- 执行
习题答案
一、填空题
- 5,6
- 4,4
- 4,3
- 9
二、编程题
- 求1~100的和。
#include<stdio.h> void main() { int sum = 0; sum = (float)(1 + 100) / 2 * 100; printf("%d\n", sum); }
- 从键盘输入两个数,求出这两个数中的小者并将结果输出,要求比较操作单独编写一个函数。
#include<stdio.h> int min(int x, int y) { int z; if (x > y) { z = y; } else { z = x; } return z; } void main() { int x, y; int z = 0; scanf("%d%d", &x, &y); z = min(x, y); printf("%d\n", z); }
- 从键盘输入两个数,将这两个数交换后输出。
#include<stdio.h> void main() { int x, y; int z = 0; scanf("%d%d", &x, &y); z = x; x = y; y = z; printf("%d %d\n", x, y); }
- 从键盘输入一个数,编写程序输出该数的绝对值至屏幕。
#include<stdio.h> #include<math.h> void main() { int x; scanf("%d", &x); printf("%d\n", (int)fabs(x)); }
- 编写程序,从键盘输入两个数,求出其中的大者。
#include<stdio.h> void main() { int x, y; int max; scanf("%d%d", &x, &y); if (x > y) { max = x; } else { max = y; } printf("%d\n", max); }
- 编写程序,求 1~100 中的素数。
#include<stdio.h> void main() { for (int i = 1; i < 100; i++) { int count = 0; for (int j = 1; j <= i; j++) { if (i % j == 0) { count++; } } if (count < 3) { printf("%d\n", i); } } }
- 编写程序,从键盘输入一个数并求其阶乘值。
#include<stdio.h> void main() { int x = 0; int y = 1; scanf("%d", &x); for (; x >= 1; x--) { y *= x; } printf("%d\n", y); }
- 编写程序,求 1~100 中所有奇数的和。
#include<stdio.h> void main() { int x = 0; for (int i = 1; i <= 100; i++) { if (i % 2 != 0) { x += i; } } printf("%d\n", x); }
- 编写程序,要求从键盘键入n, 求 1/3+2/4+3/5+...+n-2/n的值。
#include<stdio.h> void main() { int n = 0; double sum = 0; scanf("%d", &n); for (int i = 3; i <= n; i++) { sum += (double)(i - 2) / i; } printf("%lf\n", sum); }
第3章 变量和数据类型
C语言的基本数据类型
- 基本类型
- 整型
- 短整型(short)
- 整型(int)
- 长整型(long)
- 浮点型
- 单精度浮点(float)
- 双精度浮点(double)
- 字符型(char)
- 整型
- 构造类型
- 数组
- 结构体(struct)
- 共用体(union)
- 枚举类型(enum)
- 指针类型
- 空类型(void)
习题答案
一、选择题
- B
- B
- B
二、填空题
- (1)10 (2)10 (3)20 (4)0 (5)100
- z=0,t=1074087854
- 备注:一定要用正确的格式控制符输出对应的数据类型,否则会输出一个垃圾值,这是一个悲伤的故事。。。
- 34,40,30,39
- 97,98
- 7,7
- 32,45
- 5,14
- 6,6
- 4,5,5,5
- 11,8
- 57,9
- 2,1,c,g
三、编程题
- 从键盘输入 3 个数,判断其是否能构成直角三角形,若能则输出该直角三角形的面积,否则输出不能构成三角形的提示信息。
#include<stdio.h> void main() { double a, b, c; // 三角形的三条边 double area = 0; // 三角形的面积 printf("请输入三角形的三边的边长:"); scanf("%lf%lf%lf", &a, &b, &c); // 判断是否能构成直角三角形 if (a * a + b * b == c * c) { area = 1.0 / 2 * a * b; printf("直角三角形的面积是:%lf\n", area); } else if (a * a + c * c == b * b) { area = 1.0 / 2 * a * c; printf("直角三角形的面积是:%lf\n", area); } else if (b * b + c * c == a * a) { area = 1.0 / 2 * b * c; printf("直角三角形的面积是:%lf\n", area); } else { printf("不能构成直角三角形\n"); } }
- 编写一个程序,输入一个华氏温度,按照公式 C=5/9*(F-32) 输出摄氏温度。
#include<stdio.h> void main() { double f = 0; double c = 0; printf("请输入华氏温度值:"); scanf("%lf", &f); c = (double)5 / 9 * (f - 32); printf("对应的摄氏温度是:%lf\n", c); }
- 输入一个年份,判断该年是否为闰年,若为闰年则输出“yes”,否则输出“no”。
#include<stdio.h> void main() { int year = 0; scanf("%d", &year); if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { printf("yes\n"); } else { printf("no\n"); } }
- 从键盘输入一个学生的5门科目成绩,计算其平均值并输出。
#include<stdio.h> void main() { int score1 = 0; int score2 = 0; int score3 = 0; int score4 = 0; int score5 = 0; double average = 0; printf("请输入5门课程的成绩:"); scanf("%d%d%d%d%d", &score1, &score2, &score3, &score4, &score5); average = (double)(score1 + score2 + score3 + score4 + score5) / 5; printf("平均成绩是:%.2lf\n", average); }
- 从键盘输入3个数,输出其中的最大者。
#include<stdio.h> void main() { int a = 0, b = 0, c = 0; int max = 0; printf("请输入3个整数:"); scanf("%d%d%d", &a, &b, &c); max = a; if (max < b) { max = b; } if (max < c) { max = c; } printf("最大者是:%d\n", max); }
- 从键盘输入3个数,将其从小到大排序后输出。
#include<stdio.h> #define ARR_LEN 3 void main() { int arr[ARR_LEN] = { 0 }; int temp = 0; // 读入三个数 for (int i = 0; i < ARR_LEN; i++) { printf("请输入第%d个数的值:", i + 1); scanf("%d", &arr[i]); } // 排序 for (int i = 0; i < ARR_LEN - 1; i++) { for (int j = 0; j < ARR_LEN - 1 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // 输出结果 for (int i = 0; i < ARR_LEN; i++) { printf("arr[%d] = %d\n", i, arr[i]); } }
- 编写程序,输出1~1000之间的偶数。
#include<stdio.h> #define ARR_LEN 3 void main() { for (int i = 1; i <= 1000; i++) { if (i % 2 == 0) { printf("%4d ", i); } // 十个数字一行 if (i % 20 == 0) { printf("\n"); } } }
- 从键盘输入一串字符,输出至屏幕。
#include<stdio.h> #define ARR_LEN 3 void main() { char arr[100] = "\0"; scanf("%s", arr); printf("%s\n", arr); }
- 编写一个程序,输入半径,求圆的面积和体积。
#include<stdio.h> #define PI 3.14 void main() { double r = 0; printf("请输入圆的半径:"); scanf("%lf", &r); printf("圆的周长:%.2lf\n", 2 * PI * r); printf("圆的面积:%.2lf\n", PI * r * r); }
- 从键盘输入两个数,对其进行加减乘除操作并将结果输出至屏幕。
#include<stdio.h> void main() { int a = 0; int b = 0; printf("请输入两个整数:"); scanf("%d%d", &a, &b); printf("%d + %d = %d\n", a, b, a + b); printf("%d - %d = %d\n", a, b, a - b); printf("%d * %d = %d\n", a, b, a * b); printf("%d / %d = %d\n", a, b, a / b); }
第4章 顺序结构程序设计
常用输入输出函数
- scanf()
- printf()
- getchar():用户输入的数据会被放入键盘缓冲区,当按下回车键时,系统就会从缓冲区中每次读入一个字符。
- putchar()
习题答案
一、选择题
- A
- C
- C
- B
- B
- D
- A
- A
- B
- C 注意:printf()函数中的表达式时按照从右往左的顺序进行计算的。
二、填空题
- 0,3
- 10
- 0
- 如下:
x=35,y=32 x=#,y= c=104,d=115 m=0,n=0
- 5,1
- a
- 456,78
- 80
- h,104
- a,g
- 12,7
- a=5,b=5
- a,,
- e
- a,g
三、编程题
- 计算一元二次方程的 x²+4x+1=0 的根,结果保留两位小数。
#include<stdio.h> #include<math.h> void main() { double x1, x2; x1 = (-4 - sqrt(4 * 4 - 4 * 1 * 1)) / (2 * 1); x2 = (-4 + sqrt(4 * 4 - 4 * 1 * 1)) / (2 * 1); printf("x1 = %.2lf, x2 = %.2lf\n", x1, x2); }
- 已知三角形的三边,计算三角形的面积,结果保留3位小数。
#include<stdio.h> #include<math.h> void main() { float a = 0.0f; float b = 0.0f; float c = 0.0f; float s = 0.0f; float area = 0.0f; printf("请输入三角形的三边:"); scanf("%f%f%f", &a, &b, &c); s = (float)1 / 2 * (a + b + c); area = (float)sqrt(s * (s-a) * (s - b) * (s - c)); printf("面积位:%.2f\n", area); }
- 已知一个圆的周长,编写一个程序求其面积。要求从键盘输入圆的周长,将计算得出的面积输出至屏幕。
#include<stdio.h> #include<math.h> void main() { double length = 0.0; double r = 0.0; double area = 0.0; printf("请输入圆的周长:"); scanf("%lf", &length); r = length / 2 / 3.14; area = 3.14 * r * r; printf("面积位:%lf\n", area); }
- 编写一个程序,从键盘输入一个字符,实现输出临近该字符的5个字符(包括该字符,并以该字符为中心)。
#include<stdio.h> void main() { char c = '\0'; c = getchar(); printf("%c%c%c%c%c\n", c -2, c - 1, c, c + 1, c + 2); }
- 编写一个程序,从键盘输入一个梯形的上底、下底和高,求其面积并将结果输出至屏幕。
#include<stdio.h> void main() { double top_len = 0.0; double bottom_len = 0.0; double height = 0.0; double area = 0.0; printf("请输入梯形的上底下底和高:"); scanf("%lf%lf%lf", &top_len, &bottom_len, &height); area = (double)1 / 2 * (top_len + bottom_len) * height; printf("面积为:%.2lf\n", area); }
- 从键盘输入一串字符,从该字符串中统计字符a的个数。
#include<stdio.h> void main() { int count = 0; char c = '\0'; while ((c = getchar()) != '\n') { if (c == 'a') { count++; } } printf("字母a出现的次数为:%d\n", count); }
- 从键盘输入3个数,编写一个程序计算其总和及平均值。
#include<stdio.h> void main() { int a = 0; int b = 0; int c = 0; int sum = 0; float average = 0.0f; printf("请输入三个整数:"); scanf("%d%d%d", &a, &b, &c); sum = a + b + c; average = (float)sum / 3; printf("总和是:%d, 平均值是:%.2f\n", sum , average); }
- 编写程序将时间转化为秒后输出,例如8时20分45秒转化过程为83600+2060+45。
#include<stdio.h> void main() { int hour = 0; int minute = 0; int second = 0; int result = 0; printf("请输入时分秒:"); scanf("%d%d%d", &hour, &minute, &second); result = hour * 3600 + minute * 60 + second; printf("等价于%d秒\n", result); }
- 从键盘输入两个数,交换两个数的值,再输出至屏幕。
#include<stdio.h> void main() { int a = 0; int b = 0; int temp = 0; printf("请输入两个整数:"); scanf("%d%d", &a, &b); printf("交换之前的值是:a=%d, b=%d\n", a, b); temp = a; a = b; b = temp; printf("交换后的值是:a=%d, b=%d\n", a, b); }
- 现有函数 y=5x+3,从键盘输入一个数,输出对应的 y 值。
#include<stdio.h> void main() { int x = 0; int y = 0; printf("请输入x的值:"); scanf("%d", &x); y = 5 * x + 3; printf("y的值是:%d\n", y); }
- 从键盘输入一个小写字母,要求将其转换为大写字母后输出。
#include<stdio.h> void main() { char c = '\0'; c = getchar(); if ('a' <= c && c <= 'z') { c -= 32; printf("对应的大写字母为:%c\n", c); } else { printf("输入不合法\n"); } }
第5章 条件结构程序设计
分类
- if-else
- switch-case
习题答案
一、选择题
- D
- C
- C
- D
- C
- D
- D
- B
- B
- B
- A
- B
- B
- A
- C
二、填空题
- second
- 2,3,2
- 1,2
- 2
- 0,1,1
-
&x
,x > 0
,%d
,y
-
a
,1 <= a && a <= 7
,case 5
,else
- 20,30
- zerofive
- 0
- 9或3
- 1,1,1
- 5
- 5
- 11
- 5
- 1
- 7
- $$16
三、编程题
- 输入三个数,输出其中的最大数和最小数。
#include<stdio.h> void main() { int a = 0; int b = 0; int c = 0; int max = 0; int min = 0; printf("请输入三个整数:"); scanf("%d%d%d", &a, &b, &c); // 计算最大数 max = a; if (max < b) { max = b; } if (max < c) { max = c; } // 计算最小数 min = a; if (min > b) { min = b; } if (min > c) { min = c; } // 输出最大数和最小数 printf("最大数是:%d\n最小数是:%d\n", max, min); }
- 用*号输出字母C的团。
#include<stdio.h> void main() { printf("*****\n"); printf("*\n"); printf("*\n"); printf("*\n"); printf("*****\n"); }
- 某班进行学习成绩评估,若学习成绩大于或等于90分的同学用A表示,60~89分之间的同学用B表示,60分以下的同学用C表示。利用条件运算符的嵌套来完成此题。
#include<stdio.h> void main() { int score = 0; printf("请输入成绩:"); scanf("%d", &score); if (score >= 90) { printf("A"); } else if (score >= 60) { printf("B"); } else { printf("C"); } }
- 输入一个年份,判断该年是否为闰年。
#include<stdio.h> void main() { int year = 0; printf("请输入年份:"); scanf("%d", &year); if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { printf("%d年是闰年\n", year); } else { printf("%d年不是闰年\n", year); } }
- 输入某年某月某日,判断并输出这一天是这一年的第几天。
#include<stdio.h> #include<stdbool.h> void main() { int year = 0; int month = 0; int day = 0; int sum = 0; bool flag = false; printf("请输入年月日:"); scanf("%d%d%d", &year, &month, &day); switch (month) { case 1: sum = 0; break; case 2: sum = 31; break; case 3: sum = 50; break; case 4: sum = 90; break; case 5: sum = 120; break; case 6: sum = 151; break; case 7: sum = 181; break; case 8: sum = 212; break; case 9: sum = 243; break; case 10: sum = 273; break; case 11: sum = 304; break; case 12: sum = 334; break; default: break; } sum += day; if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { flag = true; } if (flag && month > 2) { sum += 1; } printf("对应的天数是:%d\n", sum); }
- 输入一个数,判断其为奇数还是偶数。
#include<stdio.h> int main() { int a = 0; printf("请输入一个整数:"); scanf("%d", &a); // 判断是否是偶数 if (a % 2 == 0) { printf("%d 是偶数\n", a); } else { printf("%d 是奇数\n", a); } return 0; }
- 从键盘输入两个数,调换这两个数的值。
#include<stdio.h> int main() { int a = 0; int b = 0; int temp = 0; // 从键盘输入两个整数 printf("请输入两个整数:"); scanf("%d%d", &a, &b); // 输出交换前的值 printf("交换前:a=%d, b=%d\n", a, b); // 交换这两个数 temp = a; a = b; b = temp; // 输出交换后的结果 printf("交换后:a=%d, b=%d\n", a, b); return 0; }
- 输入一个不超过5位的数字,求:(1)求其是几位数;(2)分别输出这几位数字;(3)把这几位数分别加1再输出。
#include<stdio.h> int main() { long a = 0; // 输入的数字 int count = 0; // 数字的位数 long temp = 0; // 用于保存输入的数字的副本 int i = 0; // 循环变量 // 输入一个不超过5位的数字 printf("请输入一个不超过5位的整数:"); scanf("%ld", &a); // 求该数是几位数并输出至屏幕 if (a > 9999) { count = 5; } else if (a > 999) { count = 4; } else if (a > 99) { count = 3; } else if (a > 9) { count = 2; } else { count = 1; } printf("该数是%d位数\n", count); // 分别输出各个位的数字 printf("\n该数的各个位的数字是:\n"); i = count; temp = a; while (i) { printf("%d 位数字是:%d\n", i, temp % 10); temp /= 10; i--; } // 各个位的数字加1后输出 printf("\n该数的各个位的数字加1是:\n"); i = count; temp = a; while (i) { printf("%d 位数字是:%d\n", i, temp % 10 + 1); temp /= 10; i--; } return 0; }
- 编写一个程序输入一个学生三次的成绩,并判断该学生三次是否都及格。若不及格则输出“有不及格科目”,若都及格则输出三次的平均成绩。
#include<stdio.h> int main() { int a = 0; int b = 0; int c = 0; float average = 0.0f; // 输入三门成绩 printf("请输入三门课程的成绩:"); scanf("%d%d%d", &a, &b, &c); // 判断是否存在不及格的科目 if (a >= 60 && b >= 60 && c >= 60) { average = (float)(a + b + c) / 3; printf("三门课程的平均分是:%.2f\n", average); } else { printf("存在不及格的科目\n"); } return 0; }
- 输出特殊图案,把下面代码在C环境中运行看看,Very Beautiful!
#include<stdio.h> int main() { char a = 176, b = 219; printf("%c%c%c%c%c\n", b, a, a, a, b); printf("%c%c%c%c%c\n", a, b, a, b, a); printf("%c%c%c%c%c\n", a, a, b, a, a); printf("%c%c%c%c%c\n", a, b, a, b, a); printf("%c%c%c%c%c\n", b, a, a, a, b); return 0; }
第6章 循环结构程序设计
分类
- for
- while
- do-while
习题答案
一、选择题
- B
- B
- D
- B
- B
- B
- A
- B
- B
- A
二、填空题
- 12
-
main
,int
,%d
- 4,8
- 0,3
-
x >= 0
,max < x
,%d
,%d
- 7
- 3
- 运行结果是:
***** **** *** ** *
- ***27
- 1
- 6
- 1,2
- 4
- 18
- 1.283333
- 27
- 运行结果为:
# ## ###
- 24
三、编程题
- 编写一个程序,求出1000以内的完全数。
#include<stdio.h> int main() { int sum = 0; // 存放因子之和 for (int i = 1; i < 1000; i++) { sum = 0; for (int j = 1; j < i; j++) { if (i % j == 0) { sum += j; } } if (sum == i) { printf("%3d\n", i); } } return 0; }
- 百马百担问题:现有100匹马,100担货,大马驼3担,中马驼2担,两匹小马驼1担,问大马、中马、小马各应需多少匹。
#include<stdio.h> int main() { for (int i = 0; i <= 33; i++) { for (int j = 0; j <= 50; j++) { for (int k = 0; k <= 200; k += 2) { if ((i + j + k == 100) && (3 * i + 2 * j + k / 2 == 100)) { printf("需大马%d匹、中马%d匹、小马%d匹\n", i, j, k); } } } } return 0; }
- 编写程序求出0~200中能被4整除余3的数。
#include<stdio.h> int main() { for (int i = 0; i <= 200; i++) { if (i % 4 == 3) { printf("%d\n", i); } } return 0; }
- 从键盘输入一个数n,求其阶乘n!。
#include<stdio.h> int main() { int num = 0; int sum = 1; printf("请输入一个整数:"); scanf("%d", &num); for (int i = num; i > 1; i--) { sum *= i; } printf("%d! = %d\n", num, sum); return 0; }
- 现有100元,用来买7元、8元、9元的商品,问将100元花完总共有多少种方式。
#include<stdio.h> int main() { int count = 0; for (int i = 0; i <= 14; i++) { for (int j = 0; j < 12; j++) { for (int k = 0; k < 11; k++) { if (7 * i + 8 * j + 9 * k == 100) { printf("7元商品%d件、8元商品%d件、9元商品%d件\n", i, j, k); count++; } } } } printf("总共有%d种花法\n", count); return 0; }
- 猜数游戏:游戏中随机产生一个1~100之间的数,请用户猜数。若10次之内猜中则提示成功,若10次之内没有猜中则提示失败。
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<stdbool.h> int main() { int guess = 0; bool flag = false; int num = 0; // 用户输入的数字 srand((unsigned)time(NULL)); guess = rand() % 101; for (int i = 0; i < 10; i++) { printf("猜第 %d 次:", i + 1); scanf("%d", &num); if (num == guess) { flag = true; break; } else { printf("哎呀,猜错了,再猜一次吧!\n"); } } if (flag) { printf("恭喜您猜对啦\n"); } else { printf("您已经猜了10次,都没有猜对哦\n"); } return 0; }
- 求出100~400中满足条件的所有数,要求三个数字之积为24,三个数字之和为12。
#include<stdio.h> int main() { for (int i = 100; i <= 400; i++) { // 计算各个位数字之和 int sum = i % 10 + i % 100 / 10 + i / 100; // 计算各个位数字之积 int temp = (i % 10) * (i % 100 / 10) * (i / 100); // 判断是否是要找的数字 if (temp == 24 && sum == 12) { printf("%d\n", i); } } return 0; }
- 从键盘输入20个数,求出其中正数的个数及其平均值。
#include<stdio.h> int main() { int num = 0; // 每次输入的数字 int count = 0; // 正数的个数 int sum = 0; // 所有正数的和 // 输入20个数字 for (int i = 0; i < 20; i++) { printf("请输入第 %d 个数字:", i+1); scanf("%d", &num); if (num > 0) { count++; sum += num; } } // 求平均数并输出 printf("正数的个数是 %d 个,其平均值是 %.2f\n", count, (float)sum / count); return 0; }
- 编写一个程序,打印出所有的水仙花数。
#include<stdio.h> int main() { int a = 0; // 保存个位数 int b = 0; // 保存十位数 int c = 0; // 保存百位数 int d = 0; // 保存各个位的平方之和 for (int i = 100; i < 1000; i++) { a = i % 10; b = i % 100 / 10; c = i / 100; d = a * a * a + b * b * b + c * c * c; if (d == i) { printf("%d\n", i); } } return 0; }
- 输入一串字符,统计其中的字母、空格、数字及其他字符的个数。
#include<stdio.h> #define STR_LEN 100 int main() { char str[STR_LEN] = { '\0' }; int alpha = 0; int blank = 0; int digit = 0; int other = 0; // 输入一串字符 printf("请输入一个字符串:\n"); gets_s(str, STR_LEN); // 计算每种类型的字符的个数 for (int i = 0; i < STR_LEN && str[i] != '\0'; i++) { if (('a' <= str[i] && str[i] <= 'z') || ('A' <= str[i] && str[i] <= 'Z')) { alpha++; } else if ('0' <= str[i] && str[i] <= '9') { digit++; } else if (str[i] == ' ') { blank++; } else { other++; } } // 输出统计的结果 printf("字母有 %d 个\n空格有 %d 个\n数字有 %d 个\n其他有 %d 个\n", alpha, blank, digit, other); return 0; }
- 编写程序,从键盘输入一个数,判断是否为素数并输出相应的信息至屏幕。
#include<stdio.h> #include<stdbool.h> int main() { int num = 0; bool flag = true; printf("请输入一个整数:"); scanf("%d", &num); for (int i = 2; i < num / 2; i++) { if (num % i == 0) { flag = false; } } if (flag) { printf("%d是素数\n", num); } else { printf("%d不是素数\n", num); } return 0; }
- 编写程序,打印九九乘法表。
#include<stdio.h> int main() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { printf("%d*%d=%-2d\t", i, j, i * j); } printf("\n"); } return 0; }
第7章 数组
习题答案
一、选择题
- A
- B
- C
- A
- A
- B
- B
- C
- A
二、填空题
- abcdef
- 10101010101010101010
-
min > a[i]
,k = i
,a[k]
-
gets(s[i])
,strcpy(c, s[i])
- 运行结果如下:
1234 5678 9000
- 6
- aceg
- 1471013
- 02345078
- 1-11-11
- Hello world!
- 80
- 运行结果如下:
第1个元素为1 第2个元素为2 第3个元素为3 第4个元素为4 第5个元素为5 第6个元素为6 第7个元素为7 第8个元素为8 第9个元素为9 第10个元素为10
三、编程题
- 设有以下10个数(4,2,7,8,9,10,11,24,5,6),编写程序用选择排序法使这10个数按升序排序,并输出排序后的结果。
#include<stdio.h> int main() { int num[10] = { 4, 2, 7, 8, 9, 10, 11, 24, 5, 6 }; int k = 0; int temp = 0; for (int i = 0; i < 9; i++) { k = i; for (int j = i + 1; j < 10; j++) { if (num[i] > num[j]) { k = j; } } if (k != i) { temp = num[i]; num[i] = num[k]; num[k] = temp; } } for (int i = 0; i < 10; i++) { printf("%3d", num[i]); } printf("\n"); return 0; }
- 从键盘输入30个整数,统计并输出这些数字中正数的个数。
#include<stdio.h> #define STR_LEN 30 int main() { int num[STR_LEN] = { 0 }; int count = 0; // 从键盘输入数据 for (int i = 0; i < STR_LEN; i++) { scanf("%d", &num[i]); } for (int i = 0; i < STR_LEN; i++) { if (num[i] > 0) { count++; } } printf("正数的个数是%d\n", count); return 0; }
- 从键盘输入一个字符串,编写一个程序实现从键盘输入一个数,可删除字符串该位置上的字符并输出改变后的字符串。
#include<stdio.h> #define STR_LEN 100 int main() { char str[STR_LEN] = { '\0 ' }; int position = 0; printf("请输入一个字符串:\n"); gets(str, STR_LEN); printf("请输入一个整数:\n"); scanf("%d", &position); // 删除制定位置的字符 for (int i = position - 1; i < STR_LEN - 1; i++) { str[i] = str[i + 1]; } // 输出结果 puts(str); return 0; }
- 编写一个程序,实现从键盘输入10个整数,将其逆序输出。
#include<stdio.h> #define ARR_LEN 10 int main() { int num[ARR_LEN] = { 0 }; // 从键盘输入ARR_LEN个数字 for (int i = 0; i < ARR_LEN; i++) { printf("请输入第%d个数字:", i + 1); scanf("%d", &num[i]); } // 逆序输出 for (int i = ARR_LEN - 1; i >= 0; i--) { printf("%d ", num[i]); } printf("\n"); return 0; }
- 现有一个长度为4X5的二维数组,要求将该数组的行和列元素互换,保存至另外一个数组中,并输出交换后的结果。
#include<stdio.h> int main() { int num[4][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}, {16, 17, 18, 19, 20} }; int result[5][4] = { 0 }; // 行列元素互换保存到另一个数组里 for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { result[j][i] = num[i][j]; } } // 输出结果 for (int i = 0; i < 5; i++) { for (int j = 0; j < 4; j++) { printf("%4d", result[i][j]); } printf("\n"); } printf("\n"); return 0; }
- 编写一个程序,实现两个字符串的合并。
#include<stdio.h> int main() { char str1[50] = "hello world!"; char str2[50] = " hello code!"; char result[100] = ""; int i = 0; for (int j = 0; str1[j] != '\0'; i++, j++) { result[i] = str1[j]; } for (int j = 0; str2[j] != '\0'; i++, j++) { result[i] = str2[j]; } result[i] = '\0'; puts(result); return 0; }
- 编写一个程序,将字符串倒序并输出至屏幕。
#include<stdio.h> #include<string.h> int main() { char str[100] = ""; // 从键盘输入字符串 gets(str, 100); // 倒序输出 for (int i = strlen(str) - 1; i >= 0; i--) { putchar(str[i]); } putchar('\n'); return 0; }
- 从键盘输入10个数据,利用冒泡排序法对其从小到大排序后输出至屏幕。
#include<stdio.h> int main() { int num[10] = { 0 }; int temp = 0; // 从键盘输入10个整数 for (int i = 0; i < 10; i++) { printf("请输入第%d个整数:", i + 1); scanf("%d", &num[i]); } // 冒泡排序(从小到大) for (int i = 0; i < 10; i++) { for (int j = 0; j < 9 - i; j++) { if (num[j] > num[j + 1]) { temp = num[j]; num[j] = num[j + 1]; num[j + 1] = temp; } } } // 输出至屏幕 for (int i = 0; i < 10; i++) { printf("%d ", num[i]); } printf("\n"); return 0; }
- 从键盘输入一串字符,以#为结束标志,统计其中字符的个数。
#include<stdio.h> int main() { char str[100] = ""; int count = 0; // 从键盘输入一个字符串 printf("请输入一个字符串:\n"); gets(str, 100); // 统计#前面的字符的个数 for (int i = 0; str[i] != '#' && str[i] != '\0'; i++) { count++; } // 输出结果 printf("字符个数为:%d\n", count); return 0; }
- 现有一个字符串,删除特定位置上的字符串,输出至屏幕。
#include<stdio.h> #include<string.h> int main() { char str[100] = "Hello World! Hello Beijing!"; int position = 3; char *p = NULL; p = str; strcpy((p + 2), (p + 3)); printf("%s\n", str); return 0; }
第8章 指针
习题答案
一、选择题
- C
- D
- B
- D
- C
- B
- B
- B
- B
- B
- B
- C
- B
- B
- A
二、填空题
- 3
- a,b
- Hello, happy
- abcdshkg
-
s
,%s
,*p++
- 1 2 3 4 5 6
- 4
- He
- 1 4 7 10 13 16 19 22
- 7
- 6,8,9
- 45
- C LanguageP
- 5,6
三、编程题
- 编写一个函数,实现字符串的复制功能。
#include<stdio.h> #define ARR_LEN 100 int main() { char str1[ARR_LEN] = "hello world!"; char str2[ARR_LEN] = "hello c program."; char *p1 = NULL; char *p2 = NULL; p1 = str1; p2 = str2; while (*p2) { *p1 = *p2; p1++; p2++; } *p1 = '\0'; printf("str1 = %s\n", str1); return 0; }
- 从键盘输入5个字符串,对这5个字符串从小到大排列并输出排列结果。
#include<stdio.h> #include<string.h> #define STR_LEN 100 int main() { char s[5][STR_LEN] = { '\0' }; char *str[5] = { NULL }; char *p = NULL; // 从键盘输入5个字符串 for (int i = 0; i < 5; i++) { gets(s[i], STR_LEN); str[i] = s[i]; } // 排序 for (int i = 0; i < 4; i++) { for (int j = i + 1; j < 5; j++) { if (strcmp(str[i], str[j]) > 0) { p = str[i]; str[i] = str[j]; str[j] = p; } } } // 输出排序后的结果 for (int i = 0; i < 5; i++) { puts(str[i]); } return 0; }
- 编写一个函数,通过指针实现两个数的交换。
#include<stdio.h> void swap(int *pa, int *pb) { int temp = 0; temp = *pa; *pa = *pb; *pb = temp; } int main() { int a = 3; int b = 5; int *pa = &a; int *pb = &b; void(*pswap)() = swap; // 交换之前 printf("交换之前 a=%d, b=%d\n", a, b); // 交换 pswap(pa, pb); // 交换之后 printf("交换之后 a=%d, b=%d\n", a, b); return 0; }
- 从键盘输入一个字符串,分别统计字符串中字母、数字及其他字符的个数并输出。
#include<stdio.h> int main() { char str[100] = { '\0' }; char *p = str; int alpha = 0; int digit = 0; int other = 0; // 从键盘上输入一个字符串 gets(p, 100); // 统计字符个数 while (*p) { if ('0' <= *p && *p <= '9') { digit++; } else if (('a' <= *p && *p <= 'z') || ('A' <= *p && *p <= 'Z')) { alpha++; } else { other++; } p++; } // 输出统计结果 printf("字母有%d个,数字有%d个,其他有%d个\n", alpha, digit, other); return 0; }
- 从键盘输入一个字符串和一个数字n,要求从字符串第n个字符开始至字符串的末尾重新组成一个字符串输出。
#include<stdio.h> int main() { char str[100] = { '\0' }; char str2[100] = { '\0' }; char *p = NULL; char *p2 = NULL; int n = 0; // 从键盘上输入一个字符串 gets(str, 100); scanf("%d", &n); p = str; p += n - 1; p2 = str2; while (*p2++ = *p++) { ; } // 输出结果 puts(str2); return 0; }
- 编写一个程序,要求利用指针求任意数据的绝对值。
#include<stdio.h> int main() { int num = 0; int *p = NULL; // 从键盘输入一个整数 printf("请输入一个整数:"); scanf("%d", &num); // 求num的绝对值 p = # if (*p < 0) { *p = -*p; } // 输出num的绝对值 printf("%d\n", *p); return 0; }
- 从键盘输入10个数至数组中,然后将其中的元素进行逆序存放后输出。
#include<stdio.h> #define ARR_LEN 10 int main() { int num[ARR_LEN] = { 0 }; int num_other[ARR_LEN] = { 0 }; int *p1 = NULL; int *p2 = NULL; // 从键盘输入ARR_LEN个数字 for (int i = 0; i < ARR_LEN; i++) { printf("请输入第 %2d 个数:", i + 1); scanf("%d", &num[i]); } // 逆序存入另一个数组 p1 = num; p2 = num_other; for (int i = 0; i < ARR_LEN; i++) { *(p2 + ARR_LEN - 1 - i) = *(p1 + i); } // 输出逆序后的数组 for (int i = 0; i < ARR_LEN; i++) { printf("%d ", *(p2 + i)); } return 0; }
- 从键盘输入一个字符串,将其逆序输出。
#include<stdio.h> #include<string.h> #define ARR_LEN 100 int main() { char str[ARR_LEN] = { '\0' }; char *p = NULL; // 从键盘输入一个字符串 gets(str, ARR_LEN); // 逆序输出 p = str; p += strlen(str) - 1; for (int i = 0; i < strlen(str); i++) { putchar(*p); p--; } return 0; }
- 从键盘输入两个字符串s1和s2,将s2连接至s1后输出。
#include<stdio.h> #include<string.h> #define ARR_LEN 100 int main() { char s1[ARR_LEN] = { '\0' }; char s2[ARR_LEN] = { '\0' }; char *p1 = NULL; char *p2 = NULL; // 从键盘输入连个字符串 gets(s1, ARR_LEN); gets(s2, ARR_LEN); // 连接字符串 p1 = s1; p2 = s2; while (*p1) { p1++; } while (*p1 = *p2) { p1++; p2++; } *p1 = '\0'; // 输出连接后的字符串 puts(s1); return 0; }
- 从键盘输入两个字符串,编写一个程序拍段两个字符串是否相等。
#include<stdio.h> #include<stdbool.h> #define ARR_LEN 100 int main() { char s1[ARR_LEN] = { '\0' }; char s2[ARR_LEN] = { '\0' }; char *p1 = NULL; char *p2 = NULL; // 从键盘输入两个字符串 gets(s1, ARR_LEN); gets(s2, ARR_LEN); // 比较字符串 p1 = s1; p2 = s2; while (true) { if (*p1 > *p2) { printf("s1 > s2\n"); break; } else if (*p1 < *p2) { printf("s1 < s2\n"); } else { p1++; p2++; continue; } } return 0; }
第9章 函数
习题答案
一、选择题
- B
- B
- D
- A
- D
- B
- A
二、填空题
- 10
- 10,20
- 运行结果如下:
1, 2, 3, 4, 6, 7, 8, 9, 6, 7, 8, 9,
- 246
- 1,2
- 1346869105
- 10,20,30,40
- 6,1
- -5,5
- 7,3,11
- 8
- 3,9
- 5,5
- 23456
- gggggggh
三、编程题
- 编写一个函数,从键盘输入一个字符串,将其反序输出。
#include <stdio.h> #include<string.h> int reverse(char str[]) { int len = strlen(str); for (int i = len - 1; i >= 0; i--) { printf("%c", str[i]); } printf("\n"); } int main() { char str[100] = ""; printf("请输入一个字符串:\n"); gets(str, 100); reverse(str); return 0; }
- 从键盘输入一个数n,求1+2+3+...+n的值,要求用递归的方式求解。
#include<stdio.h>
int iterate(int n)
{
if (n == 1)
{
return 1;
}
else
{
return n + iterate(n - 1);
}
}
int main()
{
int n = 0;
printf("请输入一个整数:");
scanf("%d", &n);
printf("值为:%d\n", iterate(n));
return 0;
}
- 从键盘输入一个字符串,要求从该字符串的第n个位置开始至末位组成一个新的字符串并将结果输出至屏幕。
#include<stdio.h> int main() { char str[100] = ""; int n = 0; char *p = NULL; scanf("%s", str); scanf("%d", &n); p = str; p += n - 1; printf("%s\n", p); return 0; }
- 从键盘输入一个字符串,统计其中字母的个数。
#include<stdio.h> int count(char *p) { int n = 0; while (*p) { if (('a' <= *p && *p <= 'z') || ('A' <= *p && *p <= 'Z')) { n++; } p++; } return n; } int main() { char str[100] = ""; gets(str); printf("%d\n", count(str)); return 0; }
- 编写一个函数,判断一个数是否为素数。
#include<stdio.h> #include<stdbool.h> bool sushu(char num) { bool flag = true; for (int i = 2; i <= num / 2; i++) { if (num % 2 == 0) { flag = false; } } return flag; } int main() { int n = 0; printf("请输入一个整数:"); scanf("%d", &n); printf("%d %s是素数\n", n, sushu(n) ? "" : "不"); return 0; }
- 从键盘输入多个字符串,编写一个函数对这些字符串从大到小排序,并输出排序结果。
#include<stdio.h> #include<string.h> void sort(char *p[]) { char *temp = NULL; for (int i = 0; i < 4; i++) { for (int j = i + 1; j < 5; j++) { if (strcmp(p[i], p[j]) < 0) { temp = p[i]; p[i] = p[j]; p[j] = temp; } } } for (int i = 0; i < 5; i++) { printf("%s\n", p[i]); } } int main() { char str[5][100] = { "" }; char *p[5] = { NULL }; for (int i = 0; i < 5; i++) { gets(str[i]); p[i] = str[i]; } sort(p); return 0; }
- 编写一个程序,求1!+2!+3!+4!的值。
#include<stdio.h> int sum(int n) { int a = 1; int sum = 0; for (int i = 1; i <= n; i++) { a *= i; sum += a; } return sum; } int main() { int n = 4; printf("%d\n", sum(n)); return 0; }
- 编写一个函数,判断一个字母是否为小写字母,若为小写字母则转化成大写字母后输出。
#include<stdio.h> char touppercase(char c) { if ('a' <= c && c <= 'z') { c -= 32; } return c; } int main() { char c = 'a'; printf("%c\n", touppercase(c)); return 0; }
- 编写一个函数,将字符串逆序输出至屏幕。
#include<stdio.h> #include<string.h> void fun(char *p) { for (int i = (int)strlen(p) - 1; i >= 0; i--) { printf("%c", *(p + i)); } printf("\n"); } int main() { char str[100] = "Hello World!"; fun(str); return 0; }
- 编写一个函数,实现字符串的连接功能。
#include<stdio.h> #include<string.h> void fun(char *str1, char *str2) { char *temp = NULL; temp = str1; while (*str1) { str1++; } while ((*str1 = *str2)) { str1++; str2++; } *str1 = '\0'; printf("%s\n", temp); } int main() { char str1[100] = "Hello World!"; char str2[100] = " Hello C!"; fun(str1, str2); return 0; }
第10章 结构型、共用型、枚举型及用户自定义型数据
结构体类型
- 定义
struct 结构体名 { 结构体成员 };
- 引用
结构体变量名.成员名;
结构指针
- 定义
struct 结构体类型 *指针名;
- 引用
(*指针名).成员名; 指针名->成员名;
共用体
- 定义
union 共用体名 { 成员表 };
枚举型
- 定义
enum 枚举类型名 {枚举元素表};
用户自定义类型
- 定义
typedef 类型名 标识名;
习题答案
一、填空题
- D
- C
- D
- A
- A
- B
- A
- B
- B
- 262
二、填空题
- 9
- 8
- abcdef
- 3,8
- 17
- 16
- W
- 5,6,0
- 1,3,5,7,9,11,13,15,17,19,
- 8
- 0,1,2,3
- 4
- yangwu,90
- 运行结果如下:
5,89.5 8,91.7
- 20,Marry10,Marry
三、编程题
- 编写一个程序,用来记录一个学生的信息。
#include <stdio.h> int main() { struct student { char name[10]; // 姓名 int num; // 学号 int age; // 年龄 char sex; // 性别 int score; // 成绩 }; struct student stu; printf("请输入学生的信息:"); scanf("%s %d %d %c %d", stu.name, &stu.num, &stu.age, &stu.sex, &stu.score); printf("%s, %d, %d, %c, %d\n", stu.name, stu.num, stu.age, stu.sex, stu.score); return 0; }
- 现有5名学生,要求编写程序从键盘输入这5名学生的信息,其中包括学号、姓名、性别、成绩等信息,再将其输出。
#include <stdio.h> int main() { struct student { char name[10]; // 姓名 int num; // 学号 int age; // 年龄 char sex; // 性别 int score; // 成绩 }; struct student stu[5]; printf("请输入学生的信息:\n"); for (int i = 0; i < 5; i++) { printf("str[%d] -> ", i); scanf("%s %d %d %c %d", stu[i].name, &stu[i].num, &stu[i].age, &stu[i].sex, &stu[i].score); } for (int i = 0; i < 5; i++) { printf("str[%d] -> ", i); printf("%s, %d, %d, %c, %d\n", stu[i].name, stu[i].num, stu[i].age, stu[i].sex, stu[i].score); } return 0; }
- 编写程序,利用结构体输入若干个学生的信息,将其写至文件中。
#include <stdio.h> int main() { struct student { char name[10]; // 姓名 int num; // 学号 int age; // 年龄 char sex; // 性别 int score; // 成绩 }; struct student stu[5]; FILE *fp = NULL; printf("请输入学生的信息:\n"); for (int i = 0; i < 5; i++) { printf("str[%d] -> ", i); scanf("%s %d %d %c %d", stu[i].name, &stu[i].num, &stu[i].age, &stu[i].sex, &stu[i].score); } fp = fopen("students.txt", "w"); fwrite(stu, sizeof(struct student), 5, fp); fclose(fp); return 0; }
- 创建一个链表,输入若干个学生的信息,其中包括学号、姓名、成绩,将结果输出至屏幕。
#include <stdio.h> #include <stdlib.h> struct student { int num; // 学号 char name[20]; // 姓名 int score; // 成绩 struct student *next; }; int main() { int n = 0; // 学生的数量 struct student *head = NULL; struct student *tail = NULL; struct student *temp = NULL; printf("请输入学生的数量:"); scanf("%d", &n); for (int i = 0; i < n; i++) { temp = malloc(sizeof(struct student)); printf("请输入第 %d 个学生的信息:\n", i + 1); scanf("%d%s%d", &temp->num, temp->name, &temp->score); if (i == 0) { head = temp; tail = temp; tail->next = NULL; } else { temp->next = NULL; tail->next = temp; tail = temp; } } temp = head; while (temp) { printf("%d, %s, %d\n", temp->num, temp->name, temp->score); temp = temp->next; } return 0; }
- 编写一个函数,在链表的任意位置上插入一个结点。
/* 在第4题基础上增加了插入功能 */ #include <stdio.h> #include <stdlib.h> struct student { int num; // 学号 char name[20]; // 姓名 int score; // 成绩 struct student *next; }; void print_stu(struct student *stu) { struct student *temp = NULL; temp = stu; while (temp) { printf("%d, %s, %d\n", temp->num, temp->name, temp->score); temp = temp->next; } } int main() { int n = 0; // 学生的数量 int p = 1; // 在某一位置之后插入节点(编号从1开始) int i = 0; // 计数器 struct student *head = NULL; struct student *tail = NULL; struct student *temp = NULL; struct student *temp2 = NULL; printf("请输入学生的数量:"); scanf("%d", &n); for (int i = 0; i < n; i++) { temp = malloc(sizeof(struct student)); printf("请输入第 %d 个学生的信息:\n", i + 1); scanf("%d%s%d", &temp->num, temp->name, &temp->score); if (i == 0) { head = temp; tail = temp; tail->next = NULL; } else { temp->next = NULL; tail->next = temp; tail = temp; } } print_stu(head); // 在第p个位置之后插入节点 printf("\n请输入位置:"); scanf("%d", &p); i = 1; temp = head; while (temp) { if (i == p) { temp2 = malloc(sizeof(struct student)); printf("请输入学生的信息:\n"); scanf("%d%s%d", &temp2->num, temp2->name, &temp2->score); temp2->next = temp->next; temp->next = temp2; break; } temp = temp->next; i++; } print_stu(head); return 0; }
- 编写一个程序,打印出5名学生的信息至屏幕,要求输出单独编写成一个函数。
#include <stdio.h> struct student { char name[10]; // 姓名 int num; // 学号 int age; // 年龄 char sex; // 性别 int score; // 成绩 }; void print_stu(struct student stu) { printf("%s, %d, %d, %c, %d\n", stu.name, stu.num, stu.age, stu.sex, stu.score); } int main() { struct student stu[5]; printf("请输入学生的信息:\n"); for (int i = 0; i < 5; i++) { printf("str[%d] -> ", i); scanf("%s %d %d %c %d", stu[i].name, &stu[i].num, &stu[i].age, &stu[i].sex, &stu[i].score); } for (int i = 0; i < 5; i++) { printf("str[%d] -> ", i); print_stu(stu[i]); } return 0; }
第12章 文件
文件
- 文件指针
FILE *指针名;
- 打开文件
fopen(文件名, 打开方式);
- 关闭文件
fclose(文件指针名);
- 文件读写函数
fputc(); fgetc(); fread(); fwrite(); fprintf(); fscanf();
- 文件定位函数
feof(); rewind(); fseek(); ftell();
- 出错检查函数
ferror(); clearerr();
习题答案
一、选择题
- C
- C
- D
- A
- D
- C
- C
- B
二、填空题
- ajig
- abcd
- abcdef
- Hello 15
- Beijing shanghai tianjin
- 0123456789
- 7
- 运行结果如下:
Lili,89 Wangming,90 Yanghua,78 Zhangxiao,88
- abcsade
- aajkcnal
三、编程题
- 编写程序,将磁盘文件中的内容显示在屏幕上。
#include <stdio.h> int main() { FILE *fp = NULL; fp = fopen("test.txt", "r"); if (fp == NULL) { printf("打开文件失败\n"); return 1; } while (!feof(fp)) { putchar(fgetc(fp)); } printf("\n"); fclose(fp); return 0; }
- 编写一个程序,由键盘输入5个学生的信息,并将数据保存在名为student.txt的文本文件中。
#include <stdio.h> struct student { char name[20]; int score; }; int main() { struct student stu[5]; FILE *fp = NULL; fp = fopen("student.txt", "w"); if (fp == NULL) { printf("打开文件失败\n"); return 1; } // 从键盘上输入5个学生的信息 for (int i = 0; i < 5; i++) { scanf("%s%d", &stu[i].name, &stu[i].score); } // 将信息写入文件中 for (int i = 0; i < 5; i++) { fwrite(&stu[i], sizeof (struct student), 1, fp); } fclose(fp); return 0; }
- 编写一个程序,实现文件的复制功能。
#include <stdio.h> int main() { FILE *fp1 = NULL; FILE *fp2 = NULL; fp1 = fopen("student.txt", "r"); fp2 = fopen("studentcopy.txt", "w"); if (fp1 == NULL) { printf("打开 student.txt 失败\n"); return 1; } if (fp2 == NULL) { printf("打开 studentcopy.txt 失败\n"); return 1; } while (!feof(fp1)) { fputc(fgetc(fp1), fp2); } fclose(fp1); fclose(fp2); return 0; }
- 编写程序,实现两个文件的合并,即将两个文件中的内容复制到其中一个文件中。
#include <stdio.h> int main() { FILE *fp1 = NULL; FILE *fp2 = NULL; fp1 = fopen("student.txt", "r"); fp2 = fopen("studentcopy.txt", "a"); if (fp1 == NULL) { printf("打开 student.txt 失败\n"); return 1; } if (fp2 == NULL) { printf("打开 studentcopy.txt 失败\n"); return 1; } while (!feof(fp1)) { fputc(fgetc(fp1), fp2); } fclose(fp1); fclose(fp2); return 0; }
- 编写程序,从文件中隔一个字符进行读取,例如文件中内容为“jajasiddeb”,则输出jjsdc至屏幕上。
#include <stdio.h> int main() { FILE *fp1 = NULL; fp1 = fopen("test.txt", "r"); if (fp1 == NULL) { printf("打开 test.txt 失败\n"); return 1; } while (!feof(fp1)) { putchar(fgetc(fp1)); fgetc(fp1); } putchar('\n'); fclose(fp1); return 0; }
第14章 预处理宏命令
宏
- 不带参数的宏
#define 用户标识符 字符串 #undef 用户标识符
- 带参数的宏
#define 宏名 字符串
- 带参数的宏和函数的关系
- 函数调用参数传递的过程中会产生一个中间值,而带参数的宏只是进行字符串的替换,不会产生中间值。
- 函数中实参要与形参的类型一致,而宏定义不要求一致。
- 函数只能返回一个值,而宏定义可以返回多个值。
文件包含
#define <文件名称>
或
#include "文件名称"
条件编译
#ifdef 标识符
程序1
#else
程序2
#endif
不同存储类型的变量
- 自动类型变量
[auto] 类型 变量名;
- 静态变量
static 类型 变量名;
- 寄存变量
rigister 类型 变量名;
- 外部变量
extern 类型 变量名;
习题答案
一、选择题
- B
- B
- A
- A
- A
- A
- C
- B
- C
- B
- A
- B
二、填空题
- 28
- 4
- 4,17
- 52
- 29
- 4
- 5,0
- 95 24
- 20,-16
- 4
- 5,49
- 3,3,5
- acjaahnldne
三、编程题
- 编写函数求出1~100中的素数。
#include <stdio.h> #include <stdbool.h> int main() { bool flag = true; for (int i = 1; i <= 100; i++) { flag = true; for (int j = 2; j <= i / 2; j++) { if (i % j == 0) { flag = false; } } if (flag) { printf("%d\n", i); } } return 0; }
- 利用带参数的宏,从三个数中找出最大值。
#include <stdio.h> #define MIN(x, y, z) x < y ? (x < z ? x : z) : (y < z ? y : z) #define MAX(x, y, z) x > y ? (x > z ? x : z) : (y > z ? y : z) int main() { int a = 34; int b = 23; int c = 54; printf("min = %d, max = %d\n", MIN(a, b, c), MAX(a, b, c)); return 0; }
- 从键盘输入一个数,利用宏求出其平方值及其平方根。
#include <stdio.h> #include <math.h> #define H(x) (x)*(x) #define S(x) sqrt(x) int main() { double num = 0; printf("请输入一个整数:"); scanf("%lf", &num); printf("%lf, %lf\n", H(num), S(num)); return 0; }
- 从键盘输入一个圆锥的半径和高度,通过宏定义求出圆锥体积。
#include <stdio.h> #define PI 3.14 #define S(r, h) PI*(r)*(r)*(h)/3.0 int main() { double r = 0.0; double h = 0.0; printf("请输入圆锥的半径和高度:"); scanf("%lf%lf", &r, &h); printf("圆锥的表面积是:%lf\n", S(r, h)); return 0; }