【郑州大学C语言实验报告册答案2023】

文章目录

  • 一、实验一: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} 105
    • 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)+\cdots s=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!(nm)!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 ) + x f(x)=sin(2x)+x f(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 x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0
    • 9.用牛顿迭代法求方程 x 5 + 2 x 3 − x 2 + x + 1 = 0 x^5+2x^3-x^2+x+1=0 x5+2x3x2+x+1=0 0 0 0附近的近似值
    • 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(sa)(sb)(sc) ,其中, s = 1 2 ( a + b + c ) s=\frac{1}{2} (a+b+c) s=21(a+b+c), a , b , c a,b,c a,b,c为三角形的三边。定义两个带参宏,一个用来求 s s s, 另一个用来求 a r e a area area,在程序中用带实参的宏名来求面积 a r e a area area
  • 十一、实验十一:指针
    • 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 <stdio.h>
int main() {
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);	// 输入三个整数
	printf("%d", a + b + c);	// 输出三个整数的和
	return 0;
}

2.求两个数的和、差、积和商

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <math.h>
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 <stdio.h>
#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 <stdio.h>
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 <stdio.h>
#include <math.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
#define PI 3.14159	// 宏定义符号常量PI
int 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 <stdio.h>
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 <stdio.h>
int main() {
	int a = 2;
	a += a; // a = a + a = 4
	a -= 2; // a = a - 2 = 2
	a *= 2 + 3; // a = a * (2 + 3) = 10
	a /= 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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
int main() {
	int d1 = 60, d2 = 61, d3 = 62, d4 = 63;
	d1 += 5;d2 += 5;d3 += 5;d4 += 5;
	// ABCD的ASCII码分别是65.66.67.68
	printf("%c%c%c%c\n", d1, d2, d3, d4);
	return 0;
}

6.将12345678,3456789分别赋给m,n,然后再将其中的值正确输出

#include <stdio.h>
int main() {
	int m = 12345678, n = 3456789;
	printf("m = %d\nn = %d\n", m, n);	// m不对,n是对的,因为的顺子不能带A和2
	return 0;
}

7.将20,64,127分别转换成八进制数和十六进制数且输出

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
int main() {
	double a = 1;
	printf("%.6f%%", a / 3);
	// 两个%%输出成一个%。
	// ∵%通常用作格式化,如果直接输出%,编译器无法确定其含义
	return 0;
}

10.用getchar()分别输入’A’,‘B’,‘C’,并赋值给a,b,c,然后将其转换成对应的小写字母,用putchar()将其输出

#include <stdio.h>
int main() {
	char a, b, c;
	a = getchar();b = getchar();c = getchar();
	a += 32;b += 32;c += 32;
	// 小写字母比对应大写字母ASCII码值大32
	putchar(a);putchar(b);putchar(c);
	return 0;
}

四、实验四:选择结构程序设计

1.从键盘输入三个整数a,b,c,输出其中最大的数

#include <stdio.h>
int main() {
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);	// 输入a,b,c
	if (b > a) a = b;	// a和b比较,b大就把b值赋给a
	if (c > a) a = c;	// a和c比较,c大就把c值赋给a
	printf("%d", a);
	return 0;
}

2.有一函数,写一个程序,输入整数x,输出y的值

#include <stdio.h>
int main() {
	int x;
	scanf("%d", &x);
	if (x < 1)
		printf("%d\n", x);
	else if (x < 10)
		printf("%d\n", 2 * x - 1);
	else
		printf("%d\n", 3 * x - 11);
	return 0;
}

else if判断的前提是if判断为否,所以此时x>=1,只需判断x<10.

3.给一个百分制成绩,要求输出相应成绩等级’A’,‘B’,‘C’,‘D’,‘E’,90分以上为’A’…

字太多了不打了,懂得都懂

#include <stdio.h>
int main() {
	int score;
	scanf("%d", &score);
	switch (score / 10) {	// 分数除以10,取十位数
		case 10:	// 100
		case 9:		// 90-99
			printf("A");
			break;
		case 8:		// 80-89
			printf("B");
			break;
		case 7:		// 70-79
			printf("C");
			break;
		case 6:		// 60-69
			printf("D");
			break;
		default:	// 0-59
			printf("E");
	}
	return 0;
}

4.从键盘任意输入一个不多于五位的整数,完成下列任务:

①求它是几位数
②分别输出每一个数字
③按逆序输出各位数字

①求它是几位数

void num(int n) {
	int sum = 0;
	while (n) {		// 循环直至n=0
		n /= 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 <stdio.h>
#include <math.h>
int main() {
	double a, b, c, x1, x2, D;
	scanf("%lf%lf%lf", &a, &b, &c);	// 输入a,b,c
	D = 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 = 1 100 n s=\sum_{n=1}^{100} n s=n=1100n

#include <stdio.h>
int main() {
	int s = 0;
	for (int i = 1; i <= 100; i++)	// 遍历1到100整数,累加到s中
		s += i;
	printf("%d\n", s);
	return 0;
}

2.计算并输出结果

s u m = ∑ n = 1 10 n ! sum=\sum_{n=1}^{10} n! sum=n=110n!

#include <stdio.h>
int main() {
	int sum = 0;
	for (int i = 1; i <= 10; i++) {	// 外层遍历1到10的整数
		int n = 1;	// n存储阶乘的值,初始化为1
		for (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} 105

1 − 1 5 + 1 10 − 1 17 + ⋯ 1-\frac{1}{5}+\frac{1}{10}-\frac{1}{17}+\cdots 151+101171+       提示: 通项公式为 ( − 1 ) n − 1 1 n 2 + 1 (-1)^{n-1}\frac{1}{n^{2}+1} (1)n1n2+11

#include <stdio.h>
#include <math.h>
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 <stdio.h>
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++;	// 数字+1
		else if ((C >= 'A' && C <= 'Z') || (C >= 'a' && C <= 'z')) a++;	// 字母+1
		else c++;	// 字符+1
		count++;	// 总数+1
		if (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 <stdio.h>
int main() {
	int x1 = 1, x2 = 1, x3;	// 前两项为1,1
	printf("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 = 1 10 n ! s=\sum_{n=1}^{10} n! s=n=110n!

#include <stdio.h>
int main() {
	int sum = 0;	// 定义一个变量 sum,用于累加每个数的阶乘
	for (int i = 1; i <= 10; i++) {
		int n = 1;		// 定义变量 n,用于计算 i 的阶乘,初始值为 1
		for (int j = 1; j <= i; j++) 
			n *= j;		// 将当前数乘上前面所有的数,得到 i 的阶乘
		sum += n;		// 将 i 的阶乘累加到 sum 变量中
	}
	printf("%d\n", sum);
	return 0;
}

2.循环输出九九乘法表

#include <stdio.h>
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 <stdio.h>
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);	// 左半边数字 1234
		for (k = k - 2; k > 0; k--) 
			printf("%d", k);	// 右半边数字 321
		printf("\n");
	}return 0;
}

(2) A  
   BBB  
   CCCCC  
 DDDDDDD 

#include <stdio.h>
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 <stdio.h>
int main() {
	for (int i = 1; i <= 4; i++) {	// 共4行
		for (int j = 4 - i; j > 0; j--)
			printf(" ");	// 第一行3个空格,每行前面的空格少1
		for (int k = 1; k <= 2 * i - 1; k++) // 每行字符数量为2*i-1
			if (k % 2 == 0)
				printf("+");	// 偶数位 +
			else
				printf("*");	// 奇数位 *
		printf("\n");
	}
	return 0;
}

4.古代数学家巴拉巴拉,百钱买百鸡,鸡翁1!5!,鸡母一三,鸡雏三一

#include <stdio.h>
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)+\cdots s=1+(1+2)+(1+2+3)+,并输出其结果

#include <stdio.h>
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 <stdio.h>
int main() {
	int x, y, z;
	for (x = 1; x <= 9; x++)	// x作为首位不能为0
		for (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 <stdio.h>
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 <stdio.h>
#include <math.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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:	// 100
			case 9:		// 90-99
				A++;	
				break;
			case 8:		// 80-89
				B++;
				break;
			case 7:		// 70-79
				C++;
				break;
			case 6:		// 60-69
				D++;
				break;
			default:	// 剩下的,即0-59
				E++;
		}
	}
	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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
	srand(time(NULL));
	int n;	// 数组中元素个数n
	scanf("%d", &n);
	int a[n], b[n];
	for (int i = 0; i < n; i++) {
		a[i] = rand();	// 随机生成数组a
		b[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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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;			// 其余元素为0
			printf("%d\t", m[i][j]);
		}
		printf("\n");
	}
	return 0;
}

4.有一个m×n矩阵,各元素值由随机数产生,将矩阵增加一列,求矩阵每一行的元素值的和,并把和放入增加列,显示结果

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
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!(nm)!n!

#include <stdio.h>
int fact(int n) {	// 计算阶乘
	if (n < 0)
		return 0;
	if (n == 0 || n == 1)	// 0和1的阶乘为1
		return 1;
	else
		return 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 <stdio.h>
int fact(int n) {  	// 又是阶乘,直接抄
	if (n < 0)
		return 0;
	if (n == 0 || n == 1)
		return 1;
	else
		return 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 <stdio.h>
#include <string.h>
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");
	else
		printf("不是回文数\n");
}
int main() {
	char a[100];
	gets(a);
	palindrome(a);
	return 0;
}

4.编写函数过程求肥波纳气数列

(1)前n项和FS
(2)前n项平均值V
并就n=20计算并输出FS与大名鼎鼎的V

#include <stdio.h>
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项和为1
	else if (n == 2) return 2;		// 前2项和为2
	else {
		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 ) + x f(x)=sin(2x)+x f(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 <stdio.h>
#include <math.h>
#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 <stdio.h>
#include <string.h>
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 <stdio.h>
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 x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0

要求:a,b,c及解x1,x2均以参数形式与调用过程交换数据

#include <stdio.h>
#include <math.h>
int Equation(double a, double b, double c, double *x1, double *x2) { 
// 用x1,x2的指针作为参数,在函数调用过程中计算x1,x2,根据返回值的不同判断x1,x2作为什么类型的根
	double  D = 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.用牛顿迭代法求方程 x 5 + 2 x 3 − x 2 + x + 1 = 0 x^5+2x^3-x^2+x+1=0 x5+2x3x2+x+1=0 0 0 0附近的近似值

#include <stdio.h>
#include <math.h>
#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);	// 计算△x
	while (fabs(delta_x) > 1e-6) {	// △x<1e-6时退出循环
		x -= delta_x; 	// 更新x
		fx = 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 <stdio.h>
#include <math.h>
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 <stdio.h>
#include <math.h>

int Fibonacci(int n) {	// 递归函数,计算第n项斐波那契数列的值
	if (n <= 0)
		return 0;
	else if (n == 1)
		return 1;
	else
		return 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 <stdio.h>
#define odd(n) n % 2 == 0	// 定义带参宏,当n%2为0时,返回值为TURE,否则为FALSE
int 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 <stdio.h>
#define max_two(a, b) (a > b) ? a : 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 <stdio.h>
#define mod(a, b) a % b
// 输入a,b,返回a%b
int main() {
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d\n", mod(a, b));
	return 0;
}

4.给年份year定义一个宏,以判别该年份是否闰年,并编写主函数调用宏。

#include <stdio.h>
#define Leap(year) (year % 4 == 0 && year % 100 != 0) || year % 400 == 0
// 判断是否闰年,是闰年则返回True,否则返回False
int main() {
	int year;
	scanf("%d", &year);
	if (Leap(year))
		printf("%d是闰年\n", year);
	else
		printf("%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(sa)(sb)(sc) ,其中, s = 1 2 ( a + b + c ) s=\frac{1}{2} (a+b+c) s=21(a+b+c), a , b , c a,b,c a,b,c为三角形的三边。定义两个带参宏,一个用来求 s s s, 另一个用来求 a r e a area area,在程序中用带实参的宏名来求面积 a r e a area area

#include <stdio.h>
#include <math.h>
#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))	// 求area
int 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 <stdio.h>
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 <stdio.h>
int main() {
	int n;
	scanf("%d", &n);	// 输入数组位数n
	
	float 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 <stdio.h>
int main() {
	int a = 1, b = 2, t;
	int *p = &a, *q = &b;
	t = *p;		// 用临时变量存放a的值
	*p = *q;	// 将b的值赋给a
	*q = t;		// 将临时变量中a的值赋给b
	printf("%d %d", a, b);
	return 0;
}

4.编写一个程序,用12月份英文名称初始化一个字符指针数组,当键盘输入整数1-12时,显示相应月份名,键入其他整数时显示错误信息。

#include <stdio.h>
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]);
	else
		printf("Error\n");
	return 0;
}

5.用选择法对10个整数排序(降序)

#include <stdio.h>
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 <stdio.h>
#include <string.h>
int main()
{
	char a[100];
	fgets(a,100,stdin);  // 获取键盘输入并存入数组
	puts(a); // 输出该数组中的字符串
	return 0;
}

7.编写一个程序计算一个字符串的长度

#include <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
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 <stdio.h>
#include <time.h>
#include <windows.h>

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--;						// 如果生日比当前日期大,年龄-1
		else 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 <stdio.h>
#include <windows.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
int main() {
	FILE *fpa, *fpb, *fpc;
	char ch;
	fpa = fopen("13-3-1.txt", "r"); // 打开文件1,注意三个文件编码格式要相同
	fpb = fopen("13-3-2.txt", "r");	// 打开文件2
	fpc = 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 <stdio.h>
#include <stdlib.h>
int main() {
	char ch;
	FILE* fp1 = fopen("13-3.c", "r");	// 打开第三题程序
	FILE* fp2 = fopen("copy13-3.c", "w");	// 复制的第三题文件命名为copy13-3
	if (!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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
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的随机数,临时存放在r
		Sleep(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];		// 用排好序的编号赋给商场id
		m[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.编写程序,使用循环生成下列数据且存放到磁盘文件中去

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \begin{matrix}2 & 3& 4&5 \\6& 7 & 8&9 \\10 & 11 & 12&13\\14&15&16&17\end{matrix} 261014371115481216591317

#include <stdio.h>
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 <stdio.h>
#include <string.h>
#define MAX 100
typedef 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 <stdio.h>
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 <stdio.h>
#include <string.h>
#define MAX 100
typedef 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 <stdio.h>
#include <stdlib.h>
#include <string.h>

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)?\n");
		char c;
		fflush(stdin);
		scanf("%c", &c);
		if (c == 'y' || c == 'Y') {	// 如果用户选择继续,则清空缓冲区并跳转至replace标签重新录入
			fflush(stdin);
			goto replace;
		} else
			exit(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;
}

结语

如有错误和不足请指正,感谢支持。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六里桥北

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值