文章目录
- 一、实验一:C语言程序结构及程序运行的全过程
- 1.编程且上机运行,求三个整数的和
- 2.求两个数的和、差、积和商
- 3.输入5个数,求这5个数的平方后的和
- 4.求三个数平方根的和
- 5.输入圆的半径,求圆的面积和周长
- 6.在屏幕上输出
- 二、实验二:数据类型及C语言表达式
- 1.求多项式ax³+bx²+c的值(a=2,b=3,c=4,x=1.414)
- 2.输入a,b两个数,分别求他们的积、商和余数
- 3.已知华氏温度F,根据公式`C=5/9(F-32)`求摄氏温度C(结果保留两位小数)
- 4.使用宏定义定义符号常量PI,其值为3.14159,并使用符号常量,求圆半径r=2.456时的圆周长、圆面积
- 5.若`float c = 3.123456789`后按实型f输出c的值,观察舍入后数值的变化
- 6.求下列格式复合赋值后a的值
- 三、实验三:输入输出函数及格式字符
- 1.若`a=3,b=4,c=5,x=1.414,y=1.732,z=2.712`,编写程序,要求按以下要求的格式输出:
- 2.若`a=3,b=4,c=5,x=1.414,y=1.732,z=2.712`,编写程序,要求用6个scanf()函数完成输出:
- 3.若`a=3,b=4,c=5,x=1.414,y=1.732,z=2.712`,编写程序,要求用1个scanf()函数完成输入,按以下要求的格式输出
- 4.将’A’,’B’,’C’,’D’分别赋给c1,c2,c3,c4,要求用1个scanf()函数完成输入,然后显示这四个字符对应的ASCII码
- 5.将60,61,62,63分别赋给d1,d2,d3,d4,利用d1,d2,d3,d4显示相应的ASCII码字符’A’,’B’,’C’,’D’
- 6.将12345678,3456789分别赋给m,n,然后再将其中的值正确输出
- 7.将20,64,127分别转换成八进制数和十六进制数且输出
- 8.若`a=3,b=4,c=5,x=1.414,y=1.732,z=2.712`,编写程序,要求输出时每个数据的数域宽6位,小数位2位
- 9.计算并输出1/3的小数值,保留6位小数且带%(0.333333%)
- 10.用getchar()分别输入’A’,’B’,’C’,并赋值给a,b,c,然后将其转换成对应的小写字母,用putchar()将其输出
- 四、实验四:选择结构程序设计
- 1.从键盘输入三个整数a,b,c,输出其中最大的数
- 2.有一函数,写一个程序,输入整数x,输出y的值
- 3.给一个百分制成绩,要求输出相应成绩等级’A’,’B’,’C’,’D’,’E’,90分以上为’A’..
- 4.从键盘任意输入一个不多于五位的整数,完成下列任务:
- 5.求方程ax²+bx+c=0的根,其中a,b,c,由键盘输入,有以下几种情况:
- 五、实验五:循环(一)
- 1.计算并输出其结果
- 2.计算并输出结果
- 3.计算下列公式的和,要求最后一项小于 1 0 − 5 10^{-5}10−5
- 4.输入30个字符,分别统计其中数字,字母及字符的个数。
- 5.求出肥波纳气数列前20项
- 六、实验六:循环(二)
- 1.使用双循环结构计算并输出结果。
- 2.循环输出九九乘法表
- 3.分别输出以下图形
- 4.古代数学家巴拉巴拉,百钱买百鸡,鸡翁1!5!,鸡母一三,鸡雏三一
- 5.求 s = 1 + ( 1 + 2 ) + ( 1 + 2 + 3 ) + ⋯s=1+(1+2)+(1+2+3)+\cdotss=1+(1+2)+(1+2+3)+⋯,并输出其结果
- 6.已知x,y,z分别是0~9中的一个数,求x,y,z的值,使得式子成立:xxz+yzz=532.
- 7.某公司每年销售收入均比前一年增长10个百分点,按此增长率,需要多少年可以实现销售收入翻两番的目标?
- 8.求100到999之间最大的三个素数
- 七、实验七:数组(一)
- 1.随机产生10个[50,100]的正整数,求最大值,最小值和平均值,并显示整个数组的值及所求结果
- 2.随机产生20个学生一门课程的成绩,并显示;统计各分数段人数,并显示结果
- 3.随机产生10个50以内的正整数,从小到大排序,并显示排序前和排序后的结果
- 4.随机产生20个100以内正整数存入一位数组,然后分四行输出,每行五个数
- 5.随机产生n个[-10,10]范围内的无序随机数,存放到数组中并显示结果,将数组中相同的数删得只剩一个,并输出删除过后的结果
- 6.求出n名学生某一门课程中最高成绩和最低成绩以及高于平均成绩的人数
- 7.使用数组,求出下列数列前20项
- 8.将一个一位数组反序放置
- 八、实验八:数组(二)
- 1.将一个一位数组a[9]中各元素值按行的顺序放入二维数组b[3×3]
- 2.输出n×n的数字方阵
- 3.将方阵m(n,n)对角线上的元素置为1,其余元素为0
- 4.有一个m×n矩阵,各元素值由随机数产生,将矩阵增加一列,求矩阵每一行的元素值的和,并把和放入增加列,显示结果
- 5.有一个m×n矩阵,找出最大元素值及最大元素值所在行、列位置
- 6.有n名考生,每位考生有考号和一个总分成绩,如果录取m人,确定录取分数线,并输出考生的考号和成绩
- 九、实验九:函数
- 1.利用函数过程计算n ! m ! ( n − m ) ! n! \over m!(n-m)!m!(n−m)!n!
- 2.编写函数过程,计算: 1 ! + 2 + 3 ! + ⋯ + 10 !1!+2+3!+\cdots+10!1!+2+3!+⋯+10!
- 3.判定一个数是否为回文数
- 4.编写函数过程求肥波纳气数列
- 5.编写一个用梯形法求一元函数 f ( x )f(x)f(x)在 ( a , b )(a,b)(a,b)上积分近似值的函数过程。并就 f ( x ) = s i n ( 2 x ) + xf(x)=sin(2x)+xf(x)=sin(2x)+x,当 [ a , b ] = [ 0 , 3.14159 ][a,b]=[0,3.14159][a,b]=[0,3.14159],小区间个数n=10和n=20时,分别计算并输出积分的近似值s1和s2,保留三位小数
- 6.求任意字符串CH中数字字符的个数
- 7.求两个正整数的最大公约数和最小公倍数
- 8.编写函数过程,解一元二次方程 a x2+ b x + c = 0ax^2+bx+c=0ax2+bx+c=0
- 9.用牛顿迭代法求方程 x5+ 2 x3− x2+ x + 1 = 0x^5+2x^3-x^2+x+1=0x5+2x3−x2+x+1=0在 000附近的近似值
- 10.计算正整数n1~n2之间所有素数的和
- *10.用递归方法求肥波纳气数列前20项以及这20项的和
- 十、实验十:编译预处理
- 1.设计一个判断奇数的带参宏,在主函数中连续读取整数,直到输入的整数是奇数时终止程序运行
- 2.用带参数的宏实现求两个数的最大值功能,再利用上述的带参宏设计一个求三个数中最大数的带参宏。在主函数中求下列形式数据中的最大值
- 3.输入两个整数,求它们相除的余数。用带参的宏来实现,并编写主函数调用宏。
- 4.给年份year定义一个宏,以判别该年份是否闰年,并编写主函数调用宏。
- 5.三角形的面积为: a r e a =s ( s − a ) ( s − b ) ( s − c ) area= \sqrt{s(s-a)(s-b)(s-c)}area=s(s−a)(s−b)(s−c),其中, s = 12( a + b + c )s=\frac{1}{2} (a+b+c)s=21(a+b+c), a , b , ca,b,ca,b,c为三角形的三边。定义两个带参宏,一个用来求 sss, 另一个用来求 a r e aareaarea,在程序中用带实参的宏名来求面积 a r e aareaarea。
- 十一、实验十一:指针
- 1.用指针变量按从小到大的顺序输出三个整数
- 2.输入n(不大于20)个单精度数存入一位数组,用指针变量处理数组元素的方式将其逆序存放后输出
- 3.利用指针完成两个变量值互换
- 4.编写一个程序,用12月份英文名称初始化一个字符指针数组,当键盘输入整数1-12时,显示相应月份名,键入其他整数时显示错误信息。
- 5.用选择法对10个整数排序(降序)
- 6.编写一个程序,从键盘上输入一串符号(以回车键结束),将其以字符串形式存入一维字符数组,然后再输出该字符型数组的字符串
- 7.编写一个程序计算一个字符串的长度
- 8.编写一个程序求一个子串在一个字符串中出现的次数,如果该字符不出现则返回0
- 十二、实验十二:结构体与共用体
- 1.设有学生信息如下:学号(长整型)、姓名(字符串型)、年龄(整形)、课程1-7成绩(实型)、总分(实型)、平均分(实型)。编写程序,输入3名学生的上述信息,计算每位学生的总分、平均分,然后输出学号、姓名、总分、平均分
- 2.设有学生信息如下:学号(长整型)、姓名(字符串型)、出生年月 (其中含有年月日均为整形)。输入5名学生上述信息,输出所有学生的 学号姓名年龄
- 3.按“年/月/日”格式输出系统日期,按“时:分:秒.XX”格式输出系统时间
- 4.设有若干人员的数据,其中有教师和学生。学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名,号码,性别,职业,职务。要求输入相关人员数据,然后再输出。
- 5.已知三名学生的学号、姓名、性别及年龄,要求通过直接赋值的方式将数据送给某结构体变量,然后再输出
- 十三、实验十三:文件
- 1.利用文本编辑软件在磁盘上建立一个有n名学生的学号、姓名及英语、数学和计算机三门课程的成绩的数据文件
- 2.将第一题建立的数据文件读入且求出每个学生的平均成绩
- 3.编写程序,将磁盘上两个文本文件合并到第一个文本文件中
- 4.将第3题建立的程序复制一份
- 5.利用产生随机数的方法产生:100个商场的序号(1到500之间)、每个商场一年4个季度每个季度的销售金额(单位万元),将这些数据存于数据文件,然后利用该文件求出每个商场一年的销售总金额。
- 十四、实验十四:综合应用
- 1.编写程序,使用循环生成下列数据且存放到磁盘文件中去
- 2.有n个人参加某专业的公务员考试,其各项成绩已经以文本文件的格式建立并保存在D:\2020目录下,数据文件名字是file_09.dat,其数据建立格式如下:编写程序,求每个人的平均成绩并输出
- 3.编写程序计算两个矩阵相乘
- 4.查询成绩的小软件系统
- 5.编写程序实现对一个文本文件中部分内容的替换
- 结语
注:使用vc6.0以下会报错:
在for循环内声明变量:for(int i=0;...)
改为在循环外声明即可。
上机步骤:(前两个实验要写的)
1.在D/E盘新建文件夹,最好命名为英文/数字
2.打开Visual C++ 6.0,点击左上角'文件',点击'新建'(或按ctrl+N)
点击最左边'文件',选择c++ source file,位置选择刚刚新建的文件夹,文件名命名为题号,点击确定,开始输入代码。
一、实验一:C语言程序结构及程序运行的全过程
1.编程且上机运行,求三个整数的和
#include int main() {int a, b, c;scanf("%d%d%d", &a, &b, &c);// 输入三个整数printf("%d", a + b + c);// 输出三个整数的和return 0;}
2.求两个数的和、差、积和商
#include int main() {float a, b;scanf("%f%f", &a, &b);// 输入两个浮点数printf("%.2f\t%.2f\t%.2f\t%.2f\n", a + b, a - b, a * b, a / b); // 输出和差积商return 0;}
3.输入5个数,求这5个数的平方后的和
#include int main() {float a, b, c, d, e;scanf("%f%f%f%f%f", &a, &b, &c, &d, &e);// 输入5个数printf("%f\n", a * a + b * b + c * c + d * d + e * e);// 输出平方和return 0;}
4.求三个数平方根的和
#include #include int main() {double a, b, c;scanf("%lf%lf%lf", &a, &b, &c);//输入三个数printf("%f", sqrt(a) + sqrt(b) + sqrt(c));// 输出平方根和return 0;}
5.输入圆的半径,求圆的面积和周长
#include #define pi 3.14159// 宏定义π的值int main() {double r;scanf("%lf", &r);// 输入圆的半径printf("s=%f\n", pi * r * r);// 圆的面积printf("c=%f\n", pi * 2 * r);// 圆的周长return 0;}
6.在屏幕上输出
#include int main() {printf("What a beautiful campus!\n");// 这不需要注释了吧printf("I wish you every success!\n");// 是的return 0;}
二、实验二:数据类型及C语言表达式
1.求多项式ax³+bx²+c的值(a=2,b=3,c=4,x=1.414)
这里用pow函数计算幂值,pow(a,b)表示a的b次方,需要引入头文件math.h
#include #include int main() {int a = 2, b = 3, c = 4;double x = 1.414, s;s = a * pow(x, 3) + b * pow(x, 2) + c;// pow(a,b)表示a的b次方printf("%f", s);return 0;}
2.输入a,b两个数,分别求他们的积、商和余数
代码如下(示例):
#include int main() {int a, b, p, r;float q;scanf("%d%d", &a, &b);p = a * b;// p为积q = (float)a / b;// q为商,因为a,b为整形变量,所以将a强制转换成浮点数,可得结果为浮点数的商r = a % b;// r为余数printf("积:%d\n商:%f\n余数:%d\n", p, q, r);return 0;}
3.已知华氏温度F,根据公式C=5/9(F-32)
求摄氏温度C(结果保留两位小数)
#include int main() {double F, C;scanf("%lf", &F);// 输入华氏度C = 5.0 / 9 * (F - 32);// 用公式转为摄氏度,整型变量相除结果仍未整数,故变为浮点数运算printf("C = %0.2f", C);// 输出摄氏度保留两位小数return 0;}
4.使用宏定义定义符号常量PI,其值为3.14159,并使用符号常量,求圆半径r=2.456时的圆周长、圆面积
#include #define PI 3.14159// 宏定义符号常量PIint main() {double r = 2.456, c, s;c = 2 * PI * r;// 圆的周长s = PI * r * r;// 圆的面积printf("C = %f\nS = %f\n", c, s);return 0;}
5.若float c = 3.123456789
后按实型f输出c的值,观察舍入后数值的变化
#include int main() {float c = 3.123456789;printf("%f\n", c);return 0;}
输出结果为3.123457,因为float类型通常占用4个字节,一个数字和一个标点各占一个字节
6.求下列格式复合赋值后a的值
int a = 2; a+=a; a-=2; a*=2+3; a/=a+a;
#include int main() {int a = 2;a += a; // a = a + a = 4a -= 2; // a = a - 2 = 2a *= 2 + 3; // a = a * (2 + 3) = 10a /= a + a; // a = a / (a + a) = 10/20 = 0.5 ∵a为整形,∴结果为 0 printf("%d", a);return 0;}
三、实验三:输入输出函数及格式字符
1.若a=3,b=4,c=5,x=1.414,y=1.732,z=2.712
,编写程序,要求按以下要求的格式输出:
a=3
b=4
c=5
x=1.414
y=1.732
z=2.712
#include int main() {int a = 3, b = 4, c = 5;float x = 1.414, y = 1.732, z = 2.712;printf("a=%-7db=%-7dc=%-7d\nx=%-7.3fy=%-7.3fz=%-7.3f\n", a, b, c, x, y, z);return 0;}
’-’为左对齐,无符号为右对齐,数字为数据的域宽,不足用空格补齐
2.若a=3,b=4,c=5,x=1.414,y=1.732,z=2.712
,编写程序,要求用6个scanf()函数完成输出:
a=3
b=4
c=5
x=1.414
y=1.732
z=2.712
#include int main() {int a, b, c;float x, y, z;scanf("%d", &a);scanf("%d", &b);scanf("%d", &c);scanf("%f", &x);scanf("%f", &y);scanf("%f", &z);printf("a=%-7db=%-7dc=%-7d\nx=%-7.3fy=%-7.3fz=%-7.3f\n", a, b, c, x, y, z);return 0;}
3.若a=3,b=4,c=5,x=1.414,y=1.732,z=2.712
,编写程序,要求用1个scanf()函数完成输入,按以下要求的格式输出
x1=a+b+c= 3+ 4+ 5= 12
x2=a-b-c= 3- 4- 5= -6
#include int main() {int a, b, c;scanf("%d%d%d", &a, &b, &c);printf("x1=a+b+c=%2d+%2d+%2d=%3d\n" "x2=a-b-c=%2d-%2d-%2d=%3d\n", a, b, c, a + b + c, a, b, c, a - b - c);return 0;}
3,4,5为右对齐,宽2,结果为右对齐宽3
4.将’A’,‘B’,‘C’,’D’分别赋给c1,c2,c3,c4,要求用1个scanf()函数完成输入,然后显示这四个字符对应的ASCII码
#include int main() {char c1, c2, c3, c4;scanf("%c%c%c%c", &c1, &c2, &c3, &c4);printf("A=%d\tB=%d\tC=%d\tD=%d\n", c1, c2, c3, c4); // 字符输出为整形格式显示为ASCII码return 0;}
5.将60,61,62,63分别赋给d1,d2,d3,d4,利用d1,d2,d3,d4显示相应的ASCII码字符’A’,‘B’,‘C’,‘D’
#include int main() {int d1 = 60, d2 = 61, d3 = 62, d4 = 63;d1 += 5;d2 += 5;d3 += 5;d4 += 5;// ABCD的ASCII码分别是65.66.67.68printf("%c%c%c%c\n", d1, d2, d3, d4);return 0;}
6.将12345678,3456789分别赋给m,n,然后再将其中的值正确输出
#include int main() {int m = 12345678, n = 3456789;printf("m = %d\nn = %d\n", m, n);// m不对,n是对的,因为的顺子不能带A和2return 0;}
7.将20,64,127分别转换成八进制数和十六进制数且输出
#include int main() {int a = 20, b = 64, c = 127;printf("20的八进制为:%o,十六进制为:%X\n"// %o 表示输出八进制整数 "64的八进制为:%o,十六进制为:%X\n"// %X 表示输出带有大写字母的十六进制整数 "127的八进制为:%o,十六进制为:%X\n", a, a, b, b, c, c);return 0;}
8.若a=3,b=4,c=5,x=1.414,y=1.732,z=2.712
,编写程序,要求输出时每个数据的数域宽6位,小数位2位
#include int main() {float x = 1.414, y = 1.732, z = 2.712;printf("%6.2f%6.2f%6.2f\n", x, y, z);// %m.nf m表示数据域宽,n表示保留小数位数return 0;}
9.计算并输出1/3的小数值,保留6位小数且带%(0.333333%)
#include int main() {double a = 1;printf("%.6f%%", a / 3);// 两个%%输出成一个%。// ∵%通常用作格式化,如果直接输出%,编译器无法确定其含义return 0;}
10.用getchar()分别输入’A’,‘B’,‘C’,并赋值给a,b,c,然后将其转换成对应的小写字母,用putchar()将其输出
#include int main() {char a, b, c;a = getchar();b = getchar();c = getchar();a += 32;b += 32;c += 32;// 小写字母比对应大写字母ASCII码值大32putchar(a);putchar(b);putchar(c);return 0;}
四、实验四:选择结构程序设计
1.从键盘输入三个整数a,b,c,输出其中最大的数
#include int main() {int a, b, c;scanf("%d%d%d", &a, &b, &c);// 输入a,b,cif (b > a) a = b;// a和b比较,b大就把b值赋给aif (c > a) a = c;// a和c比较,c大就把c值赋给aprintf("%d", a);return 0;}
2.有一函数,写一个程序,输入整数x,输出y的值
#include int main() {int x;scanf("%d", &x);if (x < 1)printf("%d\n", x);else if (x < 10)printf("%d\n", 2 * x - 1);elseprintf("%d\n", 3 * x - 11);return 0;}
else if判断的前提是if判断为否,所以此时x>=1,只需判断x<10.
3.给一个百分制成绩,要求输出相应成绩等级’A’,‘B’,‘C’,‘D’,‘E’,90分以上为’A’…
字太多了不打了,懂得都懂
#include int main() {int score;scanf("%d", &score);switch (score / 10) {// 分数除以10,取十位数case 10:// 100case 9:// 90-99printf("A");break;case 8:// 80-89printf("B");break;case 7:// 70-79printf("C");break;case 6:// 60-69printf("D");break;default:// 0-59printf("E");}return 0;}
4.从键盘任意输入一个不多于五位的整数,完成下列任务:
①求它是几位数
②分别输出每一个数字
③按逆序输出各位数字
①求它是几位数
void num(int n) {int sum = 0;while (n) {// 循环直至n=0n /= 10;// n/10相当于去掉n的个位数sum++;// 每去掉一位,计数+1}printf("它是%d位数\n", sum);}
②分别输出每一个数字
void digit(int n) {// 分别输出每一位数字int a[5];// 存放每一位数,不超过5位int i = 0;while (n) {// n=0时退出循环a[i++] = n % 10;// 取出n的个位数n /= 10;// 去掉n的个位数}while (--i >= 0)// ∵个位数在数组首位,∴逆序输出数组printf("%d\n", a[i]);}
③按逆序输出各位数字
void reverse(int n) {//逆序输出数字int re = 0;// 存储逆序后的数字while (n) {int d = n % 10;// 取出n的个位数re = re * 10 + d;// 依次加到re的末尾n /= 10;// 去掉n的个位数}printf("%d\n", re);}
主函数
int main() {void num(int);void digit(int);void reverse(int);int n;scanf("%d", &n);num(n);// 逐个运行函数digit(n);reverse(n);return 0;}
5.求方程ax²+bx+c=0的根,其中a,b,c,由键盘输入,有以下几种情况:
①a=0,不是二次方程;
②b²-4ac=0,有两个相等实根;
③b²-4ac>0,有两个不等实根;
④b²-4ac<0,有两个共轭复根。
#include #include int main() {double a, b, c, x1, x2, D;scanf("%lf%lf%lf", &a, &b, &c);// 输入a,b,cD = b * b - 4 * a * c;// D表示△if (a == 0) {// a=0时求解一次方程x1 = -1.0 * c / b;printf("a=0,不是二次方程,x=%f\n", x1);}if (a != 0) {if (D > 0) {// △> 0, 利用求根公式求方程的解x1 = (-1.0 * b + sqrt(D)) / 2 * a;x2 = (-1.0 * b - sqrt(D)) / 2 * a;printf("有两个不等实根,x1=%.2f\nx2=%.2f\n", x1, x2);} else if (D == 0) {x1 = -1.0 * b / 2 * a;printf("有两个相等实根,x1=x2=%.2f\n", x1);} else {// △< 0,有两个共轭复根,求出实部与虚部,x1表示实部,x2表示虚部x1 = -1.0 * b / 2 * a;x2 = sqrt(-1.0 * D) / 2 * a;printf("有两个共轭复根,x1=%.2f + %.2fi\nx2=%.2f - %.2fi", x1, x2, x1, x2);}return 0;}}
五、实验五:循环(一)
1.计算并输出其结果
s= ∑ n=1100ns=\sum_{n=1}^{100} n s=n=1∑100n
#include int main() {int s = 0;for (int i = 1; i <= 100; i++)// 遍历1到100整数,累加到s中s += i;printf("%d\n", s);return 0;}
2.计算并输出结果
sum= ∑ n=110n!sum=\sum_{n=1}^{10} n! sum=n=1∑10n!
#include int main() {int sum = 0;for (int i = 1; i <= 10; i++) {// 外层遍历1到10的整数int n = 1;// n存储阶乘的值,初始化为1for (int j = 1; j <= i; j++) // 内层循环计算i的阶乘n *= j;// 将1到i依次乘入n中sum += n;// 将当前阶乘累加到s中}printf("%d\n", sum);return 0;}
3.计算下列公式的和,要求最后一项小于 1 0 − 5 10^{-5}10−5
1 − 15+ 110− 117+ ⋯1-\frac{1}{5}+\frac{1}{10}-\frac{1}{17}+\cdots1−51+101−171+⋯ 提示: 通项公式为 ( − 1 ) n − 11 n2+ 1 (-1)^{n-1}\frac{1}{n^{2}+1}(−1)n−1n2+11
#include #include int main() {double s = 1, n = 2, a = 1;// s为级数的和,n为项数,a为每一项的值while (a >= 1e-5) {// 最后一项小于1e-5时退出循环a = pow(-1.0, n - 1) / (n * n + 1);// 公式计算n++;s += a;}printf("%f\n", s);return 0;}
4.输入30个字符,分别统计其中数字,字母及字符的个数。
#include int main() {int C, n = 0, a = 0, c = 0, count = 0;// C存储字符ASCII码,n,a,c统计数字字母字符数量,count计算输入字符总数量while ((C = getchar()) != '\n') {// 循环读取输入字符直到遇见回车if (C >= '0' && C <= '9') n++;// 数字+1else if ((C >= 'A' && C <= 'Z') || (C >= 'a' && C <= 'z')) a++;// 字母+1else c++;// 字符+1count++;// 总数+1if (count >= 30)// 超出30个不统计break;}printf("数字%d\t字母%d\t字符%d\n", n, a, c);return 0;}
5.求出肥波纳气数列前20项
1,1,2,3,5,8,13,21…
#include int main() {int x1 = 1, x2 = 1, x3;// 前两项为1,1printf("1\n1\n");for (int i = 3; i <= 20; i++) { // 从第三项开始循环计算x3 = x1 + x2;// 计算当前项printf("%d\n", x3); // 输出当前项x1 = x2;// 更新前两项x2 = x3;}return 0;}
六、实验六:循环(二)
1.使用双循环结构计算并输出结果。
s= ∑ n=110n!s=\sum_{n=1}^{10} n! s=n=1∑10n!
#include int main() {int sum = 0;// 定义一个变量 sum,用于累加每个数的阶乘for (int i = 1; i <= 10; i++) {int n = 1;// 定义变量 n,用于计算 i 的阶乘,初始值为 1for (int j = 1; j <= i; j++) n *= j;// 将当前数乘上前面所有的数,得到 i 的阶乘sum += n;// 将 i 的阶乘累加到 sum 变量中}printf("%d\n", sum);return 0;}
2.循环输出九九乘法表
#include int main() {for (int i = 1; i <= 9; i++) {for (int j = 1; j <= i; j++)printf("%d×%d=%d\t", j, i, j * i);printf("\n");}return 0;}
3.分别输出以下图形
(1)1
121
12321
1234321
(1)
#include int main() {int k;for (int i = 1; i <= 4; i++) {// 共输出4行for (int j = 4 - i; j > 0; j--)printf(" ");// 每行前的空格for (k = 1; k <= i; k++)printf("%d", k);// 左半边数字 1234for (k = k - 2; k > 0; k--) printf("%d", k);// 右半边数字 321printf("\n");}return 0;}
(2)
A
BBB
CCCCC
DDDDDDD
#include int main() {char c = 65;// 值为'A'的ASCII码for (int i = 1; i <= 4; i++) {// 共4行for (int j = 4 - i; j > 0; j--)printf(" ");// 打印每行前的空格,逐行递减for (int k = 1; k < 2 * i; k++)printf("%c", c);// 打印字母,逐行递增printf("\n");c++;// 字母变量递增,由'A'变为'B'再变'C''D'}return 0;}
(3)
*
* + *
* + * + *
* + * + * + *
#include int main() {for (int i = 1; i <= 4; i++) {// 共4行for (int j = 4 - i; j > 0; j--)printf(" ");// 第一行3个空格,每行前面的空格少1for (int k = 1; k <= 2 * i - 1; k++) // 每行字符数量为2*i-1if (k % 2 == 0)printf("+");// 偶数位 +elseprintf("*");// 奇数位 *printf("\n");}return 0;}
4.古代数学家巴拉巴拉,百钱买百鸡,鸡翁1!5!,鸡母一三,鸡雏三一
#include int main() {for (int x = 0; x <= 20; x++)// 公只因5块一只,100最多买20只for (int y = 0; y <= 33; y++) {//母只因3块一只,100最多买33只int z = 100 - x - y;// 总共能买100只,剩下就都是小只因if (5 * x + 3 * y + z / 3 == 100)printf("鸡翁%d,鸡母%d,鸡雏%d\n", x, y, z);}return 0;}
5.求 s = 1 + ( 1 + 2 ) + ( 1 + 2 + 3 ) + ⋯s=1+(1+2)+(1+2+3)+\cdotss=1+(1+2)+(1+2+3)+⋯,并输出其结果
#include int main() {int s = 0, n;scanf("%d", &n);// 共n项for (int i = 1; i <= n; i++) {int a = 0;for (int j = 1; j <= i; j++)a += j;// a为每一项的值s += a;// s为前n项和}printf("%d\n", s);return 0;}
6.已知x,y,z分别是0~9中的一个数,求x,y,z的值,使得式子成立:xxz+yzz=532.
// xxz+yzz =532#include int main() {int x, y, z;for (x = 1; x <= 9; x++)// x作为首位不能为0for (y = 0; y <= 9; y++)for (z = 0; z <= 9; z++)if (110 * x + 100 * y + 12 * z == 532)// x作了百位和十位,y作了一次百位,z作了一次十位两次个位printf("x=%-3dy=%-3dz=%-3d\n", x, y, z);return 0;}
7.某公司每年销售收入均比前一年增长10个百分点,按此增长率,需要多少年可以实现销售收入翻两番的目标?
翻两番为原来的4倍(有人一开始不知道,是谁我不说)
#include int main() {double x = 1;// 初始收入为100%int year = 0;while (x < 4) {// 当收入达到400%时停止循环x *= 1.1;// 每年增长10%year++;}printf("%d\n", year);return 0;}
8.求100到999之间最大的三个素数
#include #include int main() {int j, a[3];// a[3]存储最大的3个元素for (int i = 101; i <= 999; i += 2) {int k = sqrt(i);for (j = 2; j <= k; j++)if (i % j == 0)break;if (j > k) {// 判断素数for (int i = 1; i < 3; i++)a[i - 1] = a[i];// 将原先三个元素向前移动,最后一位被空出来a[2] = i;// 新的最大的素数放入最后一位,第一位最小的元素被挤出去}// 不断更新最大的素数}for (int i = 0; i < 3; i++)printf("%d\n", a[i]);// 打印出最大的三个素数的数组return 0;}
七、实验七:数组(一)
1.随机产生10个[50,100]的正整数,求最大值,最小值和平均值,并显示整个数组的值及所求结果
#include #include #include int main() {srand(time(NULL));int a[10], t, s = 0;for (int i = 0; i <= 9; i++) { // 随机生成50-100的10个数a[i] = 50 + rand() % 51;s += a[i]; // 求和,后续求平均值printf("%d\n", a[i]);// 显示数组的值}for (int i = 0; i <= 8; i++) // 冒泡法排序for (int j = 0; j <= 8 - i; j++)if (a[j] > a[j + 1]) {t = a[j];a[j] = a[j + 1];a[j + 1] = t;}printf("最小值%d\n最大值%d\n平均值%d\n", a[0], a[9], s / 10);return 0;}
2.随机产生20个学生一门课程的成绩,并显示;统计各分数段人数,并显示结果
#include #include #include int main() {srand(time(NULL));int a[20], A = 0, B = 0, C = 0, D = 0, E = 0;for (int i = 0; i <= 19; i++) { // 生成0-100随机数组a[i] = rand() % 101;printf("%d\n", a[i]);switch (a[i] / 10) {// 每个成绩对应的等级case 10:// 100case 9:// 90-99A++;break;case 8:// 80-89B++;break;case 7:// 70-79C++;break;case 6:// 60-69D++;break;default:// 剩下的,即0-59E++;}}printf("0~59:%d人\n", E);printf("60~69:%d人\n", D);printf("70~79:%d人\n", C);printf("80~89:%d人\n", B);printf("90~100:%d人\n", A);return 0;}
3.随机产生10个50以内的正整数,从小到大排序,并显示排序前和排序后的结果
#include #include #include int main() {srand(time(NULL));int a[10], t;printf("排序前:\n");for (int i = 0; i < 10; i++) {// 随机生成10个成绩a[i] = rand() % 50;printf("%d\n", a[i]);// 显示排序前成绩}for (int i = 0; i <= 8; i++)// 冒泡法排序for (int j = 0; j <= 8 - i; j++)if (a[j] < a[j + 1]) {t = a[j];a[j] = a[j + 1];a[j + 1] = t;}printf("排序后:\n");for (int i = 0; i < 10; i++)printf("%d\n", a[i]);// 显示排序后成绩return 0;}
4.随机产生20个100以内正整数存入一位数组,然后分四行输出,每行五个数
#include #include #include int main() {srand(time(NULL));int a[20];for (int i = 1; i <= 20; i++) {// 随机生成20个数a[i-1] = rand() % 100;printf("%d\t", a[i-1]);if (i % 5 == 0)// 每输出5个数 换行printf("\n");}return 0;}
5.随机产生n个[-10,10]范围内的无序随机数,存放到数组中并显示结果,将数组中相同的数删得只剩一个,并输出删除过后的结果
#include #include #include int main() {srand(time(NULL));int n;printf("输入n:\n");scanf("%d", &n);int a[n], t;printf("原数组:\n");for (int i = 0; i < n; i++) {a[i] = -10 + rand() % 21;// rand()%21生成数的范围[0,20],-10后范围即[-10,10]printf("%d\n", a[i]);// 显示原数组}// 删除数组中重复的数for (int i = 0; i < n; i++)// 循环判断数组中每一个数for (int j = i + 1; j < n; j++)if (a[i] == a[j]) {// 判断a[i]后边的数是否和a[i]相等for (t = j; t < n - 1; t++)a[t] = a[t + 1];// 将a[j]后面的元素全往前移一个位置,将重复的a[j]覆盖j--;// a[j+1]取代a[j]位置,为使下次从a[j+1]开始查找,j-1使j保持不变n--;// 数组长度减一}printf("删除重复后:\n");for (int i = 0; i < n; i++)printf("%d\n", a[i]);// 打印去重后的数组return 0;}
6.求出n名学生某一门课程中最高成绩和最低成绩以及高于平均成绩的人数
#include #include #include int main() {srand(time(NULL));int n;printf("输入n:\n");scanf("%d", &n);int a[n], t, s = 0, count = 0;printf("%d名学生的成绩为:\n", n);for (int i = 0; i < n; i++) {a[i] =rand() % 101;// 随机生成0-100分成绩s += a[i];// 计算成绩总和,求平均成绩printf("%d\n", a[i]);}for (int i = 0; i <= n - 2; i++)//冒泡排序for (int j = 0; j <= n - 2 - i; j++)if (a[j] < a[j + 1]) {t = a[j];a[j] = a[j + 1];a[j + 1] = t; }for (int i = 0; i < n; i++)if (a[i] > (float)s / n) count++;// 计算高于平均成绩的人数printf("最高成绩:%d\n", a[0]);printf("最低成绩:%d\n", a[n - 1]);printf("平均成绩:%f\n", (float)s / n);printf("高于平均:%d", count);return 0;}
7.使用数组,求出下列数列前20项
0,1,1,2,4,7,13
三数版肥波纳气数列
#include int main() {int a[20] = {0, 1, 1};// 0,1,1,2,4,7,13,...每一项为前三项之和printf("0\n1\n1\n");// 先输出前3项for (int i = 3; i < 20; i++) {// 再从数组第4项开始循环,分别输出每一项a[i] = a[i - 1] + a[i - 2] + a[i - 3];printf("%d\n", a[i]);}return 0;}
8.将一个一位数组反序放置
#include #include #include int main() {srand(time(NULL));int n;// 数组中元素个数nscanf("%d", &n);int a[n], b[n];for (int i = 0; i < n; i++) {a[i] = rand();// 随机生成数组ab[n - 1 - i] = a[i];// 数组b从后往前依次等于数组a从前往后}printf("a=(");for (int i = 0; i < n; i++)printf("%d,", a[i]);// 输出a数组printf("\b)\n");// 删除前面的逗号printf("反序放置后:\na=(");for (int i = 0; i < n; i++)printf("%d,", b[i]);// 输出b数组printf("\b)\n");return 0;}
八、实验八:数组(二)
1.将一个一位数组a[9]中各元素值按行的顺序放入二维数组b[3×3]
#include int main() {int a[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8}, b[3][3];for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {b[i][j] = a[i * 3 + j];// b矩阵中的元素(行×3+列)为在a数组中位置printf("%d\t", b[i][j]);// 显示二维数组b}printf("\n");}return 0;}
2.输出n×n的数字方阵
#include int main() {int n;scanf("%d", &n);int a[n][n];for (int i = 0; i < n; i++) {// n行for (int j = 0; j < n; j++) {// n列a[i][j] = (i + 1) * (j + 1); // 每个元素值为行数×列数printf("%d\t", a[i][j]);}printf("\n");}return 0;}
3.将方阵m(n,n)对角线上的元素置为1,其余元素为0
#include int main() {int n;scanf("%d", &n);int m[n][n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i == j || i + j == n - 1) m[i][j] = 1;// i=j时为主对角线上的元素,i+j=n-1为副对角线上元素else m[i][j] = 0;// 其余元素为0printf("%d\t", m[i][j]);}printf("\n");}return 0;}
4.有一个m×n矩阵,各元素值由随机数产生,将矩阵增加一列,求矩阵每一行的元素值的和,并把和放入增加列,显示结果
#include #include #include int main() {srand(time(NULL));int n, m;scanf("%d%d", &m, &n);int a[m][n + 1];// 矩阵增加一列for (int i = 0; i < m; i++) {int s = 0;for (int j = 0; j < n; j++) {a[i][j] = rand();// 生成随机值s += a[i][j];// 计算当前行元素和}a[i][n] = s;//将元素和放入最后一列}for (int i = 0; i < m; i++) {//输出矩阵for (int j = 0; j < n + 1; j++)printf("%d\t", a[i][j]);printf("\n");}return 0;}
5.有一个m×n矩阵,找出最大元素值及最大元素值所在行、列位置
#include #include #include int main() {srand(time(NULL));int m, n;scanf("%d%d", &m, &n);int a[m][n], max = 0;/*for (int i = 0; i < m; i++)//手动输入元素for (int j = 0; j < n; j++)scanf("%d", &a[i][j]);*/for (int i = 0; i < m; i++)//随机生成元素for (int j = 0; j < n; j++)a[i][j] = rand();/*for (int i = 0; i < m; i++) { // 打印矩阵检查for (int j = 0; j < n; j++)printf("%d\t", a[i][j]);printf("\n");}*/for (int i = 0; i < m; i++)//找出矩阵中最大值for (int j = 0; j < n; j++)if (a[i][j] > max)max = a[i][j];printf("最大值为%d\n在", max);for (int i = 0; i < m; i++)//找出最大值位置for (int j = 0; j < n; j++)if (a[i][j] == max)printf("第%d行 第%d列\n", i + 1, j + 1);return 0;}
6.有n名考生,每位考生有考号和一个总分成绩,如果录取m人,确定录取分数线,并输出考生的考号和成绩
#include int main() {int n, m;printf("考生人数:");scanf("%d", &n);printf("录取人数:");scanf("%d", &m);int a[n][2], t, p;// 定义n行2列数组,第一列为考号,第二列为成绩for (int i = 0; i < n; i++) {// 录入成绩printf("输入考号:");scanf("%d", &a[i][0]);printf("输入考号:%d 的考生成绩:", a[i][0]);scanf("%d", &a[i][1]);}for (int i = 0; i < n - 1; i++)// 冒泡法成绩排序for (int j = 0; j <= n - 2 - i; j++)if (a[j][1] < a[j + 1][1]) {t = a[j][1];a[j][1] = a[j + 1][1];a[j + 1][1] = t;// 按成绩排序p = a[j][0];a[j][0] = a[j + 1][0];a[j + 1][0] = p;// 排序成绩对应的考号}/*for (int i = 0; i < n; i++)for (int j = 0; j < 2; j++)printf("%d\t", a[i][j]);//打印排序后成绩printf("\n");*/printf("录取分数线为:%d\n", a[m - 1][1]);printf("录取考生为:");for (int i = 0; i < m; i++) {printf("考号:%d\t", a[i][0]);printf("成绩:%d\n", a[i][1]);}return 0;}
只说录取m人,所以不考虑并列,并列按考号小的录取,命运就是这么的不可捉摸
九、实验九:函数
1.利用函数过程计算n ! m ! ( n − m ) ! n! \over m!(n-m)!m!(n−m)!n!
#include int fact(int n) {// 计算阶乘if (n < 0)return 0;if (n == 0 || n == 1)// 0和1的阶乘为1return 1;elsereturn n * fact(n - 1); // 递归}int main() {int n, m;scanf("%d%d", &n, &m);printf("%d", fact(n) / fact(m) / fact(n - m));return 0;}
2.编写函数过程,计算: 1 ! + 2 + 3 ! + ⋯ + 10 !1!+2+3!+\cdots+10!1!+2+3!+⋯+10!
#include int fact(int n) {// 又是阶乘,直接抄if (n < 0)return 0;if (n == 0 || n == 1)return 1;elsereturn n * fact(n - 1);}int main() {int s = 0;for (int i = 1; i <= 10; i++)s += fact(i);printf("%d", s);}
3.判定一个数是否为回文数
回文数:指对称位置的数字相同,如121,12321
#include #include void palindrome(char c[]) {int len, flag = 1;len = strlen(c);// strlen获取输入字符串的长度for (int i = 0; i <= len / 2; i++)if (c[i] != c[len - 1 - i]) {flag = 0;// 从左右两端依次向内判断字符是否相同,不同则不是回文数,结束循环break;}if (flag == 1)printf("是回文数\n");elseprintf("不是回文数\n");}int main() {char a[100];gets(a);palindrome(a);return 0;}
4.编写函数过程求肥波纳气数列
(1)前n项和FS
(2)前n项平均值V
并就n=20计算并输出FS与大名鼎鼎的V
#include int FS(int n) {// 求斐波那契数列前n项和int f1 = 1, f2 = 2, f3, s = 2;if (n == 0) return 0;else if (n == 1) return 1;// 前1项和为1else if (n == 2) return 2;// 前2项和为2else {for (int i = 3; i <= n; i++) {f3 = f1 + f2;f1 = f2;f2 = f3;s += f3;}return s;}}double V(int n){// 求前n项平均值double v;v=FS(n)/(float)n;return v;}int main(){int n;scanf("%d",&n);printf("前n%d和为%d\n",n,FS(n));printf("前n%d平均值为%f\n",n,V(n));return 0;}
5.编写一个用梯形法求一元函数 f ( x )f(x)f(x)在 ( a , b )(a,b)(a,b)上积分近似值的函数过程。并就 f ( x ) = s i n ( 2 x ) + xf(x)=sin(2x)+xf(x)=sin(2x)+x,当 [ a , b ] = [ 0 , 3.14159 ][a,b]=[0,3.14159][a,b]=[0,3.14159],小区间个数n=10和n=20时,分别计算并输出积分的近似值s1和s2,保留三位小数
#include #include #define pi 3.14159#define f(x) sin(2*x*pi/180)+x// 将x转为弧度制double integral(double x1, double x2, int n) {// x1,x2为积分上下限,n为分成的梯形小区间个数double s = 0, b1, b2, h;h = (x2 - x1) / n;for (int i = 0; i < n; i++) {b1 = f(x1 + i * h);//b1,b2为梯形上下底,即小区间左右端点对应函数值b2 = f(x1 + (i + 1) * h);s += (b1 + b2) * h / 2;//将所有梯形面积相加为积分近似值}return s;}int main() {double x1 = 0, x2 = pi, s1, s2;int n1 = 10, n2 = 20;s1 = integral(x1, x2, n1);s2 = integral(x1, x2, n2);printf("s1=%.3f\ns2=%.3f\n",s1, s2);}
6.求任意字符串CH中数字字符的个数
#include #include char CH(char c[]) {int count = 0;// 计数for (int i = 0; i < (int)strlen(c); i++)if (c[i] >= '0' && c[i] <= '9')//数字ASCII码在0-9之间count++;return count;//返回计数器}int main() {char c[100] = {0};gets(c);CH(c);printf("%d", CH(c));return 0;}
7.求两个正整数的最大公约数和最小公倍数
#include int dvi(int m, int n) { // 辗转相除法 求最大公约数int r;r = m % n;while (r != 0) {m = n;n = r;r = m % n;}return n;}int main() {int m, n;scanf("%d%d", &m, &n);printf("最大公约数:%d\n", dvi(m, n));printf("最小公倍数:%d\n", m * n / dvi(m, n)); // 乘积除以最大公约数得到最小公倍数return 0;}
8.编写函数过程,解一元二次方程 a x2+ b x + c = 0ax^2+bx+c=0ax2+bx+c=0
要求:a,b,c及解x1,x2均以参数形式与调用过程交换数据
#include #include int Equation(double a, double b, double c, double *x1, double *x2) { // 用x1,x2的指针作为参数,在函数调用过程中计算x1,x2,根据返回值的不同判断x1,x2作为什么类型的根doubleD = pow(b, 2) - 4 * a * c;if (a == 0) {// 当a=0时按一次方程求解if (b == 0) {// 当b也等于0时,方程无解return 0; // 返回0 无解}*x1 = -c / b;*x2 = *x1;return 1;// 返回1,一次方程只有一个解}if (D >= 0) {*x1 = (-1.0 * b + sqrt(D)) / 2 * a;*x2 = (-1.0 * b - sqrt(D)) / 2 * a;return 2;// 返回2,两个解} else {*x1 = -1.0 * b / 2 * a;// 共轭复根实部*x2 = sqrt(-1.0 * D) / 2 * a;// 共轭复根虚部return -1; // 返回-1,无实数解,得两个共轭复根}}int main() {double a, b, c, x1, x2;scanf("%lf%lf%lf", &a, &b, &c);int r = Equation(a, b, c, &x1, &x2);if (r == 0)printf("a, b都为0,方程无解\n");else if (r == 1)printf("a = 0为一次方程\nx = %.3f\n", x1);else if (r == 2)printf("方程有两个实数解\nx1 = %.3f\nx2 = %.3f\n", x1, x2);else if (r == -1)printf("方程无实数解\nx1 = %.3f + %.3fi\nx2 = %.3f - %.3fi", x1, x2, x1, x2);return 0;}
9.用牛顿迭代法求方程 x5+ 2 x3− x2+ x + 1 = 0x^5+2x^3-x^2+x+1=0x5+2x3−x2+x+1=0在 000附近的近似值
#include #include #define f(x) pow(x,5)+2*pow(x,3)-pow(x,2)+x+1#define d(x) 5*pow(x,4)+6*pow(x,2)-2*x+1//定义f(x)和f'(x)double newton(double x) {double fx, dx, delta_x = f(x) / d(x);// 计算△xwhile (fabs(delta_x) > 1e-6) {// △x<1e-6时退出循环x -= delta_x; // 更新xfx = f(x);dx = d(x);delta_x = fx / dx;// 更新△x}return x;}int main() {printf("%f\n", newton(0));return 0;}
10.计算正整数n1~n2之间所有素数的和
#include #include int Primes(int n1, int n2) {int sum = 0, k, j;for (int i = n1; i <= n2; i++) {if (i == 1) // 如果n1 = 1,跳过i++;k = sqrt(i);for (j = 2; j <= k; j++)if (i % j == 0)break;//如果i能被比他开方值小的数整除,他不是素数,则退出循环if (j > k)// 当循环结束之后还没有被整除,为素数sum += i;}return sum;}int main() {int n1, n2;scanf("%d%d", &n1, &n2);printf("%d\n", Primes(n1, n2));return 0;}
*10.用递归方法求肥波纳气数列前20项以及这20项的和
#include #include int Fibonacci(int n) {// 递归函数,计算第n项斐波那契数列的值if (n <= 0)return 0;else if (n == 1)return 1;elsereturn Fibonacci(n - 1) + Fibonacci(n - 2);}int main() {int s = 0;printf("前20项为:\n");for (int i = 1; i <= 20; i++) {printf("%d\n", Fibonacci(i));// 输出第i项斐波那契数列的值s += Fibonacci(i); // 累加前i项斐波那契数列的和}printf("和为:%d\n", s);return 0;}
十、实验十:编译预处理
1.设计一个判断奇数的带参宏,在主函数中连续读取整数,直到输入的整数是奇数时终止程序运行
#include #define odd(n) n % 2 == 0// 定义带参宏,当n%2为0时,返回值为TURE,否则为FALSEint main() {int n;do {scanf("%d", &n); // 连续读取输入整数n} while (odd(n)); // 当输入n为偶数时继续,为奇数时退出循环printf("%d是奇数\n", n);return 0;}
2.用带参数的宏实现求两个数的最大值功能,再利用上述的带参宏设计一个求三个数中最大数的带参宏。在主函数中求下列形式数据中的最大值
(1)(a,b) (2)(a,b,c) (3)(a-2,b+2) (4)(a-2,b,c+2)
#include #define max_two(a, b) (a > b) " />: b// 判断,若a>b,返回a,否则返回b#define max_three(a, b, c) (max_two(a, b) > c) ? max_two(a, b) : c//判断a,b两者最大值和c的大小int main() {float a, b, c;scanf("%f%f%f", &a, &b, &c);printf("%f\n", max_two(a, b));printf("%f\n", max_three(a, b, c));printf("%f\n", max_two(a - 2, b + 2));printf("%f\n", max_three(a - 2, b, c + 2));return 0;}
3.输入两个整数,求它们相除的余数。用带参的宏来实现,并编写主函数调用宏。
#include #define mod(a, b) a % b// 输入a,b,返回a%bint main() {int a, b;scanf("%d%d", &a, &b);printf("%d\n", mod(a, b));return 0;}
4.给年份year定义一个宏,以判别该年份是否闰年,并编写主函数调用宏。
#include #define Leap(year) (year % 4 == 0 && year % 100 != 0) || year % 400 == 0// 判断是否闰年,是闰年则返回True,否则返回Falseint main() {int year;scanf("%d", &year);if (Leap(year))printf("%d是闰年\n", year);elseprintf("%d不是闰年\n", year);return 0;}
5.三角形的面积为: a r e a =s ( s − a ) ( s − b ) ( s − c ) area= \sqrt{s(s-a)(s-b)(s-c)}area=s(s−a)(s−b)(s−c),其中, s = 12( a + b + c )s=\frac{1}{2} (a+b+c)s=21(a+b+c), a , b , ca,b,ca,b,c为三角形的三边。定义两个带参宏,一个用来求 sss, 另一个用来求 a r e aareaarea,在程序中用带实参的宏名来求面积 a r e aareaarea。
#include #include #define s(a, b, c) 1.0 / 2 * (a + b + c)// 求s#define area(s, a, b, c) sqrt(s * (s - a) * (s - b) * (s - c))// 求areaint main() {double a, b, c, s;scanf("%lf%lf%lf", &a, &b, &c);s = s(a, b, c);printf("%f\n", area(s, a, b, c));return 0;}
十一、实验十一:指针
1.用指针变量按从小到大的顺序输出三个整数
#include int main() {void sort(int *p, int *q);// 声明排序函数int a, b, c;scanf("%d%d%d", &a, &b, &c);sort(&a, &b);// 将a,b,c的地址输入函数进行排序sort(&a, &c);sort(&b, &c);printf("%d %d %d", a, b, c);return 0;}void sort(int *p, int *q) {int temp;// 定义临时变量if (*p > *q) {// 如果指针p地址中的值大于q的,交换p和q地址中的值temp = *p;*p = *q;*q = temp;}}
2.输入n(不大于20)个单精度数存入一位数组,用指针变量处理数组元素的方式将其逆序存放后输出
#include int main() {int n;scanf("%d", &n);// 输入数组位数nfloat a[n], re_a[n], *p = &a[n - 1];// 定义指针p为数组a的最后一个元素for(int i=0;i<n;i++)scanf("%f",&a[i]);// 输入数组a的元素for (int i = 0; i < n; i++) {re_a[i] = *p--;// 将指针指向的最后一个元素存入数组re_a中,完成将数组a逆序存放,并将指针向前移动一位printf("%f\n", re_a[i]);// 输出逆序存放的元素}return 0;}
3.利用指针完成两个变量值互换
#include int main() {int a = 1, b = 2, t;int *p = &a, *q = &b;t = *p;// 用临时变量存放a的值*p = *q;// 将b的值赋给a*q = t;// 将临时变量中a的值赋给bprintf("%d %d", a, b);return 0;}
4.编写一个程序,用12月份英文名称初始化一个字符指针数组,当键盘输入整数1-12时,显示相应月份名,键入其他整数时显示错误信息。
#include int main() {char *months[] = {"January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December" }; // 定义字符指针数组int n;scanf("%d", &n); // 输入月份数if (n >= 1 && n <= 12) // 判断输入是否正确printf("%s\n", months[n - 1]);elseprintf("Error\n");return 0;}
5.用选择法对10个整数排序(降序)
#include int main() {int a[10] = {3, 7, 6, 4, 9, 5, 6, 2, 7, 4}, j, m, t;int *p = a; // 定义指针p指向数组a的首地址for (int i = 0; i < 9; i++) {// 选择法排序m = i; // m表示未排序序列中最大的数的索引for (j = i + 1; j < 10; j++)// 在未排序序列中找最大的数if (*(p + m) > *(p + j))m = j;if (m != i) {// 将最大的数与当前的数交换位置t = *(p + i);*(p + i) = *(p + m);*(p + m) = t;}}for (int i = 0; i < 10; i++, p++)printf("%d\n", *p); // 输出排序后数列return 0;}
6.编写一个程序,从键盘上输入一串符号(以回车键结束),将其以字符串形式存入一维字符数组,然后再输出该字符型数组的字符串
#include #include int main(){char a[100];fgets(a,100,stdin);// 获取键盘输入并存入数组puts(a); // 输出该数组中的字符串return 0;}
7.编写一个程序计算一个字符串的长度
#include #include int main(){char a[100];gets(a); // 键盘输入字符串int cnt = 0; // 计数器while (a[cnt] != '\0') // 当读取到末尾标记时结束循环cnt++;printf("%d\n", cnt);printf("%d\n", strlen(a)); // 直接用strlen计算字符串长度return 0;}
8.编写一个程序求一个子串在一个字符串中出现的次数,如果该字符不出现则返回0
#include #include int main() {int substr(char*, char*);char str[100], sub[100];gets(str);// 输入字符串gets(sub);// 输入子字符串int num = substr(str, sub);// 调用函数计算出现次数printf("%d", num);return 0;}int substr(char *str, char *substr) {// 计算子字符串出现次数int count = 0;while (*str != '\0') {// 当读取到字符串末尾时退出循环char *p1 = str, *p2 = substr;// 定义指针指向字符串首地址while (*p2 != '\0' && *p1 == *p2) {// 当子字符串指针p2没有移动到末尾时,与原字符串指针取的值相等,// 即表示子字符串有字符和原字符串相等, 指针依次后移继续判断下一位是否相等p1++;p2++;}if (*p2 == '\0')// 若子字符串指针移动到了末尾,即说明上一步完整循环了子字符串,子字符串在原字符串中出现了一次count++;str++;// 原字符串后移,从下一位继续判断子字符串是否出现}return count;}
十二、实验十二:结构体与共用体
关于long long:
vc6.0用 __int64定义,%I64d输出
图片来源:c/c++下 long long与__int64不同编译环境的比较 作者:Violet-Guo
1.设有学生信息如下:学号(长整型)、姓名(字符串型)、年龄(整形)、课程1-7成绩(实型)、总分(实型)、平均分(实型)。编写程序,输入3名学生的上述信息,计算每位学生的总分、平均分,然后输出学号、姓名、总分、平均分
#include struct Student {// 定义结构体long long ID;// 学号vc6.0改为__int64 ID;char name[20];// 姓名int age;// 年龄double course[7];// 7门课程成绩double total, average;// 总成绩,平均成绩};int main() {struct Student s[3];// 创建名为s的结构体数组,分别存储3名学生的信息for (int i = 0; i < 3; i++) {s[i].total = 0;// 初始化总成绩printf("输入第%d名学生的:学号姓名年龄\n",i + 1);scanf("%I64d %s %d", &s[i].ID, s[i].name, &s[i].age);// 循环输入学号姓名年龄for (int j = 0; j < 7; j++) {// 循环输入7门课程成绩printf("输入该学生课程%d成绩: ", j + 1);scanf("%lf", &s[i].course[j]);s[i].total += s[i].course[j];// 成绩加和计算总成绩}s[i].average = s[i].total / 7;// 计算平均成绩}// 输出学生信息表格printf("%-14s%-10s%-8s%-7s\n", "学号", "姓名", "总分","平均分");// 左对齐输出 学号等字符串,并对其输出学生信息内容for (int i = 0; i < 3; i++)printf("%-14I64d%-10s%-8.2f%-7.2f\n", s[i].ID, s[i].name, s[i].total, s[i].average);return 0;}
2.设有学生信息如下:学号(长整型)、姓名(字符串型)、出生年月 (其中含有年月日均为整形)。输入5名学生上述信息,输出所有学生的 学号姓名年龄
#include #include #include struct Student {// 定义结构体学生long long ID;// 长整型学号(__int64)char name[20];// 姓名int year, month, day, age;// 出生年月日和年龄};int main() {SYSTEMTIME sys;// 定义结构体变量名GetLocalTime(&sys);// 获取系统时间,计算当前年龄struct Student s[5];// 定义学生结构体数组,表示5个学生的信息for (int i = 0; i < 1; i++) {printf("请输入第%d名学生的学号和姓名:\n", i + 1);scanf("%I64d%s", &s[i].ID, s[i].name);// 输入学生的学号姓名printf("请输入%s的出生年月日:(yyyy-mm-dd)\n", s[i].name);scanf("%d-%d-%d", &s[i].year, &s[i].month, &s[i].day);// 输入出生年月日以-分隔s[i].age = sys.wYear - s[i].year;// 生日比当前日期小if ((s[i].month == sys.wMonth && s[i].day > sys.wDay) || s[i].month > sys.wMonth )s[i].age--;// 如果生日比当前日期大,年龄-1else if (s[i].year > sys.wYear || (s[i].year == sys.wYear && s[i].month > sys.wMonth) || (s[i].year == sys.wYear && s[i].month == sys.wMonth && s[i].day > sys.wDay))s[i].age = 0;// 输入的日期大于当前日期,年龄无效输出0}printf("%-14s%-10s%-3s\n", "学号","姓名","年龄");for (int j = 0; j < 5; j++)// 输入学生信息printf("%-14I64d%-10s%-3d\n", s[j].ID, s[j].name, s[j].age);return 0;}
3.按“年/月/日”格式输出系统日期,按“时:分:秒.XX”格式输出系统时间
#include #include int main() {SYSTEMTIME sys;// 定义结构体变量名GetLocalTime(&sys);// 获取系统时间printf("%d/%02d/%02d\t", sys.wYear, sys.wMonth, sys.wDay);// 输出系统时间日期,宽2位不足用0补齐printf("%02d:%02d:%02d.%02d", sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);return 0;}
4.设有若干人员的数据,其中有教师和学生。学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名,号码,性别,职业,职务。要求输入相关人员数据,然后再输出。
#include #include struct person {// 学生和教师共有的结构体成员char name[20];// 姓名long long num;// 号码char gen[10];// 性别};struct student {struct person p;char cla[20];// 学生班级};struct teacher {struct person p;char pos[20];// 教师职务};int main() {struct student s[100];// 建立学生结构体数组,存放学生数据struct teacher t[100];// 建立教师结构体数组,存放教师数据char m[10], n;// 数组m存储输入的职业,判断学生还是教师int i_s = 0, i_t = 0;// 学生和教师的数组索引for (int i = 0; i < 100; i++) {printf("请选择录入人员职业(学生/教师)\n");scanf("%s", m);if (strcmp(m, "学生") == 0) {// 比较输入的字符串是否与"学生"相等printf("请输入姓名,号码,性别和班级:\n");scanf("%s%I64d%s%s", s[i_s].p.name, &s[i_s].p.num, s[i_s].p.gen, s[i_s].cla);// 录入学生信息i_s++;} else if (strcmp(m, "教师") == 0) {printf("请输入姓名,号码,性别和职务:\n");scanf("%s%I64d%s%s", t[i_t].p.name, &t[i_t].p.num, t[i_t].p.gen, t[i_t].pos);// 录入教师信息i_t++;} else {printf("输入错误\n");// 输入错误i退回i--;}printf("是否继续录入?(Y/N)\n");loop:fflush(stdin);// 清空输入缓冲区scanf("%c", &n);if (n == 'Y' || n == 'y')continue;// 输入y则跳过当前循环开始下一次循环else if (n == 'N' || n == 'n')break;// 输入n则结束循环输出信息else {printf("输入有误(Y/N)\n");goto loop;// 输入有误则回到loop重新输入}}printf("学生信息:\n");printf("%-10s%-12s%-6s%s\n", "姓名", "号码", "性别", "班级");for (int j = 0; j < i_s; j++)printf("%-10s%-12I64d%-6s%s\n", s[j].p.name, s[j].p.num, s[j].p.gen, s[j].cla);// 输出学生信息printf("\n教师信息:\n");printf("%-10s%-12s%-6s%s\n", "姓名", "号码", "性别", "职务");for (int j = 0; j < i_t; j++)printf("%-10s%-12I64d%-6s%s\n", t[j].p.name, t[j].p.num, t[j].p.gen, t[j].pos);// 输出教师信息return 0;}
5.已知三名学生的学号、姓名、性别及年龄,要求通过直接赋值的方式将数据送给某结构体变量,然后再输出
#include #include struct Student {// 定义结构体long long ID;char name[20];char gender[3];int age;};int main() {struct Student s[3];char names[][20]={"张三","李四","王二麻子"};// 姓名char genders[][3]={"男","男","男"};// 性别printf("%-5s%-10s%-5s%s\n","学号","姓名","性别","年龄");for (int i = 0; i < 3; i++) {s[i].ID = i + 1;// 学号为序号strncpy(s[i].name,names[i],sizeof(s[i].name));// 将数组中的元素赋给结构体变量strncpy(s[i].gender,genders[i],sizeof(s[i].gender));s[i].age = 18+i;printf("%-5I64d%-10s%-5s%d\n",s[i].ID,s[i].name,s[i].gender,s[i].age);// 输出}return 0;}
十三、实验十三:文件
1.利用文本编辑软件在磁盘上建立一个有n名学生的学号、姓名及英语、数学和计算机三门课程的成绩的数据文件
右键->新建->文本文档
(下一题按照此格式读取文件内容)
输入数据->左上角文件->另存为->编码选择ANSI->保存
(我用UTF-8编码在输出中文的时候会乱码)
2.将第一题建立的数据文件读入且求出每个学生的平均成绩
#include #include struct Student {// 建立结构体用来存储数据long long ID;// 学号char name[20];// 姓名double English, math, computer, sum, avg;// 各科,总,平均成绩};int main() {struct Student s[100];// 定义结构体数组FILE *fp = fopen("13-1.txt", "r");// 打开文件并让指针指向文件if (!fp) { // 如果失败perror("qvq文件打开失败");// 用于显示错误信息exit(0); // 退出程序}char f[100];// 每行输入储存的数组int i = 0;printf("%-14s%-10s%-8s\n", "学号", "姓名", "平均成绩");while (fgets(f, 200, fp) != NULL) {sscanf(f, "%I64d%s%lf%lf%lf", &s[i].ID, s[i].name, &s[i].English, &s[i].math, &s[i].computer);// 把文件中的数据存入结构体数组s[i].sum = s[i].English + s[i].math + s[i].computer;s[i].avg = s[i].sum / 3;// 计算平均成绩printf("%-14I64d%-10s%-6.2f\n", s[i].ID, s[i].name, s[i].avg);// 输出i++;// 循环下一行}fclose(fp);// 关闭文件return 0;}
3.编写程序,将磁盘上两个文本文件合并到第一个文本文件中
要新建两个用于合并的文件
#include #include int main() {FILE *fpa, *fpb, *fpc;char ch;fpa = fopen("13-3-1.txt", "r"); // 打开文件1,注意三个文件编码格式要相同fpb = fopen("13-3-2.txt", "r");// 打开文件2fpc = fopen("13-1.txt", "a+");// 打开合并后的文件,"a"为追加,将文件1,2内容追加文件中,若要清除文件内原有内容重新写入,改为"w"if (!fpa || !fpb || !fpc) {perror("qwq文件打开失败");exit(0);// 如果打开失败退出程序}fprintf(fpc,"\n");while ((ch = fgetc(fpa)) != EOF)fputc(ch, fpc);// 写入1文件内容while ((ch = fgetc(fpb)) != EOF)fputc(ch, fpc);// 写入2文件内容printf("^o^文件合并成功\n");fclose(fpc);fclose(fpb);fclose(fpa);return 0;}
4.将第3题建立的程序复制一份
#include #include int main() {char ch;FILE* fp1 = fopen("13-3.c", "r");// 打开第三题程序FILE* fp2 = fopen("copy13-3.c", "w");// 复制的第三题文件命名为copy13-3if (!fp1 || !fp2)perror("qaq文件打开失败");exit(0);while ((ch = fgetc(fp1)) != EOF)// 循环读取直到结束fputc(ch, fp2);// 将内容写入副本中printf("程序复制成功!(′ヮ`)");fclose(fp1);// 关闭文件fclose(fp2);return 0;}
5.利用产生随机数的方法产生:100个商场的序号(1到500之间)、每个商场一年4个季度每个季度的销售金额(单位万元),将这些数据存于数据文件,然后利用该文件求出每个商场一年的销售总金额。
#include #include #include #include struct MALL {// 商场结构体int id;// 商场编号double q1, q2, q3, q4;// 四个季度营业额double sum;// 营业总额};int cmp(const void *a, const void *b) {return *(int*)a - *(int*)b;}// qsort比较函数int main() {srand((unsigned int)time(NULL));struct MALL m[100];int a[100], k = 0, j, r;// a数组储存商场编号while (k < 100) {// 生成100个不重复的随机数r = rand() % 500 + 1;//生成一个1-500的随机数,临时存放在rSleep(1);// 休眠1毫秒,不然会输出不全for (j = k; j >= 0; j--) {if (r == a[j])//与之前已存的随机数比较break;}if (j < 0) {//没有重复即保存到数组中a[k] = r;k++;}}qsort(a, 100, sizeof(int), cmp);// 排序编号数组for (int i = 0; i < 100; i++) {m[i].id = a[i];// 用排好序的编号赋给商场idm[i].q1 = rand();// 四个季度营业额赋随机值m[i].q2 = rand();m[i].q3 = rand();m[i].q4 = rand();m[i].sum = m[i].q1 + m[i].q1 + m[i].q3 + m[i].q4;m[i].sum *= (double)rand() / RAND_MAX;// RAND_MAX是随机数最大值,rand()/RAND_MAX就是一个0-1的数,乘上总额可以变为浮点数,看起来比较真实(但没卵用,反正是随机数)printf("商场%-4d销售总额%8.2f万元\n", m[i].id, m[i].sum);}return 0;}
十四、实验十四:综合应用
1.编写程序,使用循环生成下列数据且存放到磁盘文件中去
234567891011121314151617\begin{matrix}2 & 3& 4&5 \\6& 7 & 8&9 \\10 & 11 & 12&13\\14&15&16&17\end{matrix}261014371115481216591317
#include int main() {FILE *fp = fopen("14-1.txt", "w");// 打开写入文件for (int i = 1; i < 17; i++) {// 循环输入数字fprintf(fp, "%d\t", i + 1);// 从2开始输出if (i % 4 == 0)// 每4个数字换一行fprintf(fp, "\n");}fclose(fp);// 关闭文件return 0;}
2.有n个人参加某专业的公务员考试,其各项成绩已经以文本文件的格式建立并保存在D:\2020目录下,数据文件名字是file_09.dat,其数据建立格式如下:编写程序,求每个人的平均成绩并输出
考号 姓名 行政职业能力 公共基础知识 申论 专业知识 面试成绩
没有这个dat文件,写一个函数建立
void input_info() {// 录入dat成绩文件FILE *fp = fopen("file_09.dat", "w");// 打开一个写入文件long long id;// 考号char name[20];// 姓名double score[5];// 五科的成绩printf("输入录入人数:");int n;scanf("%d",&n);fprintf(fp,"考号 姓名 行政职业能力 公共基础知识 申论 专业知识 面试成绩\n");// 输入标头while (n--) {// 循环输入姓名和成绩printf("请输入考号姓名:");scanf("%I64d%s", &id, name);fprintf(fp, "%I64d %s ", id, name);printf("请输入成绩:");for (int i = 0; i < 5; i++) {scanf("%lf", &score[i]);fprintf(fp, "%.2f ", score[i]);}fprintf(fp, "\n");}fclose(fp);}
建立好文件是这样婶的
可以用记事本打开
在主函数中查询成绩
#include #include #define MAX 100typedef struct { // 存储公务员信息结构体long long id;char name[20];double score[5];double avg;} gwy;int main() {//input_info();// 建立成绩dat文件gwy g[MAX];FILE *fp = fopen("file_09.dat", "r");while (1) {// 读取第一行标头,将指针移到下一行char c = fgetc(fp);if (c == '\n') break;}int count = 0;// 计数录入了多少个数据while (!feof(fp)) {double sum = 0;// 总成绩和,为求平均成绩fscanf(fp, "%I64d %s", &g[count].id, g[count].name);// 将数据存入结构体for (int i = 0; i < 5; i++) {fscanf(fp, "%lf", &g[count].score[i]);sum += g[count].score[i];}g[count].avg = sum/5;// 平均成绩count++;}printf("%-16s%-10s%-6s\n","考号","姓名","平均成绩");// 输出结果for (int i = 0; i < count - 1; i++) printf("%-16I64d%-10s%-6.2f\n", g[i].id, g[i].name, g[i].avg);return 0;}
3.编写程序计算两个矩阵相乘
#include int main() {int r1, c1, r2, c2, i, j;// r,c表示矩阵的行,列printf("输入第一个矩阵的行,列数:");scanf("%d%d", &r1, &c1);printf("输入第一个矩阵的元素:\n");int m1[r1][c1];for (i = 0; i < r1; i++)// 循环录入第一个矩阵的所有元素for (j = 0; j < c1; j++)scanf("%d", &m1[i][j]);printf("输入第二个矩阵的行,列数:");scanf("%d%d", &r2, &c2);if (c1 != r2) {// 判断矩阵是否能相乘printf("矩阵无法相乘\n");return -1;}printf("输入第二个矩阵的元素:\n");int m2[r2][c2];for (i = 0; i < r2; i++)for (j = 0; j < c2; j++)scanf("%d", &m2[i][j]);int re[r1][c2];// 相乘结果矩阵for (i = 0; i < r1; i++)// 矩阵相乘for (j = 0; j < c2; j++) {int sum = 0;// 第一个矩阵的行分别乘第二个矩阵的列之和for (int k = 0; k < c1; k++)sum += m1[j][k] * m2[k][j];re[i][j] = sum;}printf("矩阵相乘的结果为:\n");for (i = 0; i < r1; i++) {for (j = 0; j < c2; j++)printf("%d\t", re[i][j]);printf("\n");}}
4.查询成绩的小软件系统
同样是写了一个类似的录入成绩文件的函数
#include #include #define MAX 100typedef struct { // 存储学生信息结构体char name[20];double score;} Students;void input_info() {FILE *fp = fopen("14-4.txt", "w");char name[20];double score;while (1) {// 循环输入姓名和成绩printf("请输入姓名(输入*退出):");scanf("%s", name);if (strcmp(name, "*") == 0)// 判断如果输入的字符串和*相等,退出循环,停止录入break;printf("请输入成绩:");scanf("%lf", &score);// 将数据写入文件fprintf(fp, "%s %.2f\n", name, score);}fclose(fp);}int main() {//input_info(); // 若无"学生姓名 成绩" 格式的文件,用input_info函数录入生成文件Students s[MAX];FILE *fp = fopen("14-4.txt", "r");int count = 0;// 计数录入了多少个学生的数据while (!feof(fp)) {fscanf(fp, "%s %lf", s[count].name, &s[count].score);count++;}while (1) {// 循环查询学生成绩char a[20];printf("请输入要查询的学生姓名:(输入*退出)\n");scanf("%s", a);if (strcmp(a, "*") == 0)break;int flag = 1, i;// 遍历数组后若未找到姓名,则flag为1,输出未找到该学生for (i = 0; i < count; i++) {if (strcmp(s[i].name, a) == 0) {// 遍历数组,寻找输入的学生姓名printf("%s的成绩为%.2f.\n", a, s[i].score);// 输出成绩flag = 0;break;}}if (flag)printf("没有找到该学生\n");}return 0;}
5.编写程序实现对一个文本文件中部分内容的替换
#include #include #include int main() {FILE *fp;char fileName[100], search[100], replace[100];char temp[1000], str[1000];printf("请输入文件名: ");// 提示用户输入文件名(14-5.txt)scanf("%s", fileName);fp = fopen(fileName, "r");// 打开文件if (fp == NULL) {// 如果文件打开失败,输出错误信息并退出程序printf("无法打开该文件\n");exit(0);}printf("文件内容:\n\n");while (fgets(temp, 1000, fp) != NULL) {// 逐行读取文件内容,并将其存储在temp字符串中printf("%s", temp);// 输出当前行的内容strcat(str, temp);// 将当前行的内容添加到str字符串中}fclose(fp);// 关闭文件replace:printf("\n\n请输入需要替换的单词或短语: ");scanf("%s", search);// 获取需要替换的单词或短语char *pos = strstr(str, search);// 在str字符串中查找search字符串,并返回第一次出现的位置if (pos == NULL) {// 如果未找到匹配项,输出错误信息并重新录入printf("未找到匹配项\n是否继续(y/n)" />);char c;fflush(stdin);scanf("%c", &c);if (c == 'y' || c == 'Y') {// 如果用户选择继续,则清空缓冲区并跳转至replace标签重新录入fflush(stdin);goto replace;} elseexit(0);}printf("请输入替换成的单词或短语: ");scanf("%s", replace);// 获取替换成的单词或短语int index = pos - str;// 计算匹配项在str中的位置memmove(&str[index + strlen(replace)], &str[index + strlen(search)], strlen(str) - index - strlen(search) + 1);// 将匹配项后面的内容向后移动,为替换后的单词或短语腾出空间memcpy(&str[index], replace, strlen(replace));// 在匹配项的位置处插入替换后的单词或短语fp = fopen(fileName, "w");fputs(str, fp);// 将修改后的内容重新写入文件fclose(fp);printf("替换完成。文件内容为:\n\n");fp = fopen(fileName, "r");// 打开替换后的文件,读取文件内容并输出while (fgets(temp, 1000, fp) != NULL) {printf("%s", temp);}fclose(fp);return 0;}
结语
如有错误和不足请指正,感谢支持。