C语言程序设计 余贞侠(课后习题答案)

 本文章为C语言程序设计课后习题和答案

-------------------如有错误,欢迎及时评论区指出,目前自主学习不定时更新-------------------------

欢迎大家一起讨论,也欢迎大家一起学习相关的知识,多多交流,一起提高


目录

第一章程序设计基础

第二章 数据类型、运算符和表达式

第三章 顺序结构程序设计

第四章 选择结构程序设计 

第五章 循环结构程序设计

第六章 模块化程序设计 

第七章 数组

第八章 指针 

第九章 自定义数据类型

第十章 文件 


第一章程序设计基础

因都为文字叙述题和简答题(后续章节一样),所以暂不更新第一章。

第二章 数据类型、运算符和表达式

1.略, 2.C, 3.D, 4.C, 5.A, 6.A, 7.C, 8.A, 9.A, 10.B, 11.A, 12.D, 13.B, 14.C, 16.略。

15.代码如下:

#include<stdio.h>
int main(){
	float F;//定义一个华氏度温度
	scanf("%f",&F);
	printf("C=%f ",5*(F-32)/9);//也可以定义一个C表示出
	return 0;
}

第三章 顺序结构程序设计

1.(1)C, (2)B。

 2.scanf缺少取地址符号'&',printf应该为%d。

3.(1)BOY换行 (2)12%,15.500000%。

4.略。

5.代码如下

(1)

#include<stdio.h>
int main(){
	int l,w;//定义长度和宽度
	int s=0,c=0;//定义面积和周长
	printf("请输入长度和宽度并用空格隔开:\n");
	scanf("%d %d",&l,&w);
	s=l*w;
	c=2*(l+w);
	printf("周长为:%d\n面积为:%d\n",c,s);
	return 0;
}

(2)

#include<stdio.h>
int main(){
	char Letter,letter;//定义大写字母和小写字母
	printf("输入一个大写字母:\n");
	Letter=getchar();
	letter=Letter+32;//大写字母为小写字母ASCII码+32
	printf("转换前:%c\tASCII码为:%d\n转换后:%c\tASCII码为:%d\n",Letter,Letter,letter,letter);
	return 0;
}

(3)

#include<stdio.h>
int main(){
	int num1,num2,num3,num4,num5;
	printf("请输入5个数:\n");
	scanf("%d%d%d%d%d",&num1,&num2,&num3,&num4,&num5);
	printf("计算结果为:\n");
	printf("%015.8lf",(float)num1/num2*num3+num4-num5);
	/*因为整数是6位,小数是8位,加上一位小数点,总共为15位*/
	return 0;
}

(4)

#include<stdio.h>
int main(){
	int num1;
	char ch1,ch2;
	float num2;
	printf("请输入4个数据(依次为1个整数、2个字符、1个实数)\n");
	scanf("%d %c %c %f",&num1,&ch1,&ch2,&num2);
	printf("这4个数据倒序为:\n");
	printf("4-%.2f 3-%c 2-%c 1-%d",num2,ch2,ch1,num1);//参考书上输出所以保留两位
	return 0;
}

(5)

#include<stdio.h>
int main(){
	int y,m,d;
	printf("please input a date:\n");
	scanf("%d-%d-%d",&y,&m,&d);
	printf("the date is:\n");
	printf("%d/%d/%d",y,m,d);//若需要考虑月和日0开头则格式化输出即可
	return 0;
}

(6)

#include<stdio.h>
int main(){
	int num,sum;//sum用于统计;
	printf("请输入一位三位数整数\n");
	scanf("%d",&num);
	printf("百位为%d 十位为%d 个位为%d ",num/100,num/10%10,num%10);
	sum=num/100+num/10%10+num%10;
	printf("位数之和为%d \n",sum);//可以循环依次取余相加也可
	return 0;
}

(7)

#include<stdio.h>
#include<math.h>//方便使用根号公式
int main(){
	int a,b,c;
	a=4,b=4;//手动输入则修改为读入即可
	c=sqrt(a*a+b*b);//c等于根号下a方+b方
	printf("斜边为:%d\n",c);//会丢掉小数位
	return 0;
}

(8)略

(9)

#include<stdio.h>
#include<math.h>//方便使用根号公式
int main(){
	int r1,r2;//定义小圆半径和大圆半径
	printf("依次输入小圆半径和大圆半径:\n");
	scanf("%d %d",&r1,&r2);
	float PI=3.14,S;//圆周率和圆环面积
	S=PI*(r2*r2-r1*r1);
	printf("%.3f \n",S);
	return 0;
}

-----------------------------------------------------------------------------------------------------------------6.30日更新

第四章 选择结构程序设计 

(1)

#include<stdio.h>
int main(){
	int num1,num2,num3,num4;
	int max1,max2;
	printf("请输入4个数字:\n");
	scanf("%d %d %d %d",&num1,&num2,&num3,&num4);
	if(num1>=num2){
		max1=num1;
		max2=num2;
	}else{
		max1=num2;
		max2=num1;
	}if(max1<=num3){
		max2=max1;
		max1=num3;
	}else if(max2<=num3){
		max2=num3;
	}
	if(max1<=num4){
		max2=max1;
		max1=num4;
	}else if(max2<=num4){
		max2=num4;
	}
		printf("最大值是%d,次大值是%d\n",max1,max2);
	return 0;
}

(2)

#include<stdio.h>
int main(){
	int x;
	printf("请输入x的数值:\n");
	scanf("%d",&x);
	if(x<1){
		printf("y的值为%d \n",x);
	}else if(x>=30){
		printf("y的值为%d \n",7*x-3);
	}else{
		printf("y的值为%d\n",3*x+5);
	}
	return 0;
}

(3)

#include<stdio.h>
int main(){
	int x;
	printf("请输入x的数值:\n");
	scanf("%d",&x);
	if(x>=0){
		printf("x的值为%d \n",x);
	}else{
		printf("x的绝对值为%d\n",-x);
	}
	return 0;
}

(4)

 #include<stdio.h>
 #include<math.h>//方便使用abs函数判断两数之差
int main(){
	int a,b,c;
	int p,s;//辅助记录函数面积
	printf("请输入a b c的数值:\n");
	scanf("%d %d %d",&a,&b,&c);
	if(a+b>c && abs(a-b)<c){//可能为负数所以要加绝对值
		printf("可以构成三角形\n");
	}else if(a+c>b && abs(a-c)<b){
		printf("可以构成三角形\n");
	}else if(b+c>a && abs(b-c)<a){
		printf("可以构成三角形\n");
	}else {
		printf("不可以构成三角形\n");
	}
	p=(a+b+c)/2;
	s=sqrt(p*(p-a)*(p-b)*(p-c));
	printf("三角形的面积为%d",s);
	return 0;
}

(5)

#include<stdio.h>
int main(){
	char ch;
	printf("请输入一个字符:\n");
	ch=getchar();
	if(ch>='a' && ch<='z'){
		printf("大写为%c \n",ch-32);
	}else if(ch>='A' && ch<='Z'){
		printf("小写为%c \n",ch+32);
	}else if(ch>='0' && ch<='9'){
		printf("ASCII码为 %d \n",ch);
	}else{
		printf("@ \n");
	}
	return 0;
}

(6)

#include<stdio.h>
 int main(){
	double BMI,kg,m;
	printf("请输入身高(m)和体重(kg):\n");
	scanf("%lf %lf",&m,&kg);
	BMI=kg/(m*m);
	if(BMI<18.5){
		printf("体重过低\n");
	}else if(BMI>=18.5 && BMI<24){
		printf("正常范围\n");
	}else if(BMI>=24 && BMI<28){
		printf("超重\n");
	}else{
		printf("肥胖\n");
	}
	return 0;
}

 (7)

 #include<stdio.h>
 int main(){
	int num1,num2,num3,num4;
	int max1,max2,max3,max4;
	printf("请输入4个数字:\n");
	scanf("%d %d %d %d",&num1,&num2,&num3,&num4);
	max1=max2=max3=max4=0;
	if(num1>=num2){
		max1=num1;
		max2=num2;
	}else{
		max1=num2;
		max2=num1;
	}if(max1<=num3){
		max3=max2;
		max2=max1;
		max1=num3;
	}else if(max2<=num3){
		max3=max2;
		max2=num3;
	}else{
		max3=num3;
	}if(max1<=num4){
		max4=max2;
		max2=max1;
		max1=num4;
	}else if(max2<=num4){
		max4=max2;
		max2=num4;
	}else{
		max4=num4;
	}if(max3>=max4){
		printf("%d %d %d %d\n",max1,max2,max3,max4);//本章输出前两位大小也可以用此方法
	}else{
		printf("%d %d %d %d\n",max1,max2,max4,max3);
	}
	return 0;
}

第五章 循环结构程序设计

(1)

#include <stdio.h>
int main(){
	int n,fac=1,sum=0;
	printf("请输入n的值:\n");
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int k=i;k>0;k--){
			fac*=k;
		}
		sum+=fac;
		fac=1;
	}
	printf("%d的阶乘加和为%d ",n,sum);
	return 0;
}

(2)

#include <stdio.h>
int main(){
	int sum=0;
	printf("1000以内的完数有:");
	for(int i=1;i<1000;i++){
		for(int k=1;k<i;k++){
			if(!(i%k)){
				sum+=k;
			}
		}
		if(sum==i){
			printf("%d ",i);
		}
		sum=0;
	}
	return 0;
}

(3)

#include <stdio.h>
int main(){
	int m,n,min;
	printf("请输入m和n:\n");
	scanf("%d %d",&m,&n);
	if(n>m){
		min=m;
		m=n;
		n=min;
	}
	for(int i=n;i>0;i--){
		if(n%i==0&&m%i==0){
			min=i;
			break;
		}
	}
	printf("最大公约数为%d ",min);
	return 0;
}

(4)

#include <stdio.h>
int main(){
	double sum,h;//定义总米数和高度
	h=100;
	sum=100;//因为只有第一次是单独一次下落
	for(int i=1;i<10;i++){
		h/=2;
		sum+=h*2;
	}
	printf("总经过长度%lf,第8次反弹高度为%lf",sum,h);
	return 0;
}

(5)

#include <stdio.h>
int main(){
	printf("请输入一串字符:\n");
	int sum1,sum2,sum3;
	char ch;
	sum1=sum2=sum3=0;
	while((ch=getchar())!='\n'){
		if(ch>='a' && ch<='z'){
			sum1++;
		}else if(ch>='A' && ch<='Z'){
			sum1++;
		}else if(ch>='0' && ch<='9'){
			sum2++;
		}else{
			sum3++;
		}
	}
	printf("英文字母次数为%d 数字为次数为%d 其他字符次数为%d ",sum1,sum2,sum3);
	return 0;
}

(6)

#include <stdio.h>
int main(){
	printf("请输入任意个整数空格隔开,用-888表示结束:\n");
	int num1,max,min;
	num1=0;
	scanf("%d",&num1);
	if(num1==-888){
		return 0;
	}
	max=min=num1;
	while(num1 != -888){
		if(num1>max){
			max=num1;
		}else if(num1<min){
			min=num1;
		}
		scanf("%d",&num1);
	}
	printf("最大值为%d,最小值为%d",max,min);
	return 0;
}

(7)

#include <stdio.h>
int main(){
	int one,five,ten;
		for(ten=5;ten<=10;ten+=5){
			for(five=5;five<=20;five+=5){
				for(one=5;one<=100;one+=5){
					if(one+five*5+ten*10==100){
						printf("一元的要%d张,五元的要%d张,十元的要%d张\n",one,five,ten);
					}
				}
			}
		}
}

(8)

#include <stdio.h>
int main(){
	int g,m,x;//分别是公鸡 母鸡 小鸡
		for(g=1;g<=20;g++){
			for(m=1;m<=33;m++){
				for(x=1;x<=330;x++){
					if(x/3.0+m*3+g*5==100&&x+m+g==100){
						printf("小鸡%3d只,母鸡%3d只,公鸡%3d只\n",x,m,g);
					}
				}
			}
		}
	return 0;
}

--------------------------------------------------------------------------------------------------7.2更新

第六章 模块化程序设计 

(1)

#include<stdio.h>
#include<math.h>//方便使用根号公式
void S(int r1,int r2);
int main(){
	int r1,r2;//定义小圆半径和大圆半径
	printf("依次输入小圆半径和大圆半径:\n");
	scanf("%d %d",&r1,&r2);
	S(r1,r2);
	return 0;
}
void S(int r1,int r2){
	float PI=3.14,S;//圆周率和圆环面积
	S=PI*(r2*r2-r1*r1);
	printf("%.3f \n",S);
}

(2)

#include <stdio.h>
void M(int sum);
int main(){
		int sum=0;
		printf("1000以内的完数有:");
		M(sum);
		return 0;
}
void M(int sum){
	for(int i=1;i<1000;i++){
		for(int k=1;k<i;k++){
			if(!(i%k)){
				sum+=k;
			}
		}
		if(sum==i){
			printf("%d ",i);
		}
		sum=0;
	}
}

(3)

#include <stdio.h>
int Zd(int m,int n);//最大公约数
int Zx(int m,int n);//最小公倍数
int main(){
	int m,n,min,max;
	printf("请输入m和n:\n");
	scanf("%d %d",&m,&n);
	max=Zd(m,n);
	min=Zx(m,n);
	printf("最大公约数为%d 最小公倍数%d",max,min);
	return 0;
}
int Zd(int m,int n){
	int a=0;
	if(n>m){
		a=m;
		m=n;
		n=a;
	}
	for(int i=n;i>0;i--){
		if(n%i==0&&m%i==0){
			a=i;
			return a;
		}
	}
 return -1;
}
int Zx(int m,int n){
	int a=0;
	if(n>m){
		a=m;
		m=n;
		n=a;
	}
	for(int i=m;i>=0;i--){
		if(m%i==0&&n%i==0){
			a=m/i*n;
			return a;
		}
	}
	return -1;
}

(4)

#include <stdio.h>
int judge1(int m);
int judge2(int m);
int main(){
	int m;
	printf("请输入一位五位数m:\n");
	scanf("%d",&m);
	if(judge1(m)){
		if (judge2(m)){
			printf("%d是回文数字\n",m);
		}
	}else{
		printf("%d不是回文数字\n",m);
	}

	return 0;
}
int judge1(int m){
	int flag=0;
	if(m%10==m/10000){
		flag=1;
	}
	return flag;
}
int judge2(int m){
	int flag=0;
	if(m/1000%10 == m/10%10){
		flag=1;
	}
	return flag;
}

(5)

#include <stdio.h>
void Dput( int m);
int main(){
	int m;
	printf("请输入一位数m:\n");//超过十位建议用char读入
	scanf("%d",&m);
	printf("逆序数为:\n");
	Dput(m);
	return 0;
}
void Dput( int m){
	int x=0;
	for(;m>0;m/=10){
		x=m%10;
		printf("%d ",x);
	}
}

(6)1.输出如下

 :var equal 0
 :static var equal 0
 :var equal 0
 :static var equal 1
 :var equal 0
 :static var equal 2

2.输出如下

 :the num equal 2
 :the internal block num equal 1
 :the num equal 3
 :the internal block num equal 2
 :the num equal 4
 :the internal block num equal 3

第七章 数组

 (1)

#include<stdio.h>
void Sort(float a[],int n);
int main()
{
	float a[100];
	int i,c=0;
	char ch;
	for(i=0;ch!='\n';i++){
		scanf("%f",&a[i]);
		ch=getchar();
		c++;
	}
	Sort(a,c);
	for(int j=0;j<c;j++){
		printf("%f ",a[j]);
	}
	return 0;
}
void Sort(float a[],int n){
	int temp,i,k;
	float tmp;
	temp=a[0];
	for(i=0;i<n;i++){
		temp=i;
		for(k=i+1;k<n;k++){
			if(a[k]<a[temp]){
				temp=k;
			}
		}
		if(temp!=i){
			tmp=a[i];
			a[i]=a[temp];
			a[temp]=tmp;
		}
	}
}

(2)

#include<stdio.h>
#include<math.h>
#define N 10
float average(int a[]);
int cmp(int a[],float sum);
int main()
{
	printf("请输入十个数:\n");
	int a[N]={0};
	int b=0;
	float sum=0.0;
	for(int i=0;i<N;i++){
		scanf("%d",&a[i]);
	}
	sum=average(a);
	b=cmp(a,sum);
	printf("平均值是%.2f,最接平均值的是%d",sum,a[b]);
	return 0;
}
float average(int a[]){
	float sum=0.0;
	for(int i=0;i<N;){
		sum+=a[i++];
	}
	return sum/N;
}
int cmp(int a[],float sum){
	int temp=0,k;
	float b[N]={0};
	for(int i=0;i<N;i++){
		b[i]=fabs(a[i]-sum);
	}
	for(k=0;k<N;k++){
		if(b[temp]>b[k]){
			temp=k;
		}
	}
	return temp;
}

(3)

#include<stdio.h>
#define N 10
void minimum(int a[N][N],int min);
void maximum(int a[N][N],int max);
int main()
{
	int a[N][N];
	int max,min;
	max=min=a[0][0];
	minimum(a,min);
	maximum(a,max);
	return 0;
}
void minimum(int a[N][N],int min){
	int row,con;
	for(int i=0;i<=N;i++){
		for(int k=0;k<N;k++){
			if(a[i][k]<min){
				min=a[i][k];
				row=i;
				con=k;
			}
		}
	}
	printf("最小值是%d,第%d行和第%d列\n",min,row,con);
}
void maximum(int a[N][N],int max){
	int row,con;//定义行和列
	for(int i=0;i<=N;i++){
		for(int k=0;k<N;k++){
			if(a[i][k]>max){
				max=a[i][k];
				row=i;
				con=k;
			}
		}
	}
	printf("最大值是%d,第%d行和第%d列\n",max,row,con);
}

(4)

#include<stdio.h>
#define N 3
void row(int a[N][N]);
void con(int a[N][N]);
int main()
{
	int a[N][N]={};
	for(int i=0;i<N;i++){
		for(int k=0;k<N;k++){
			scanf("%d",&a[i][k]);
		}
	}
	row(a);
	printf("----------------\n");
	con(a);
	return 0;
}
void row(int a[N][N]){
	int sum=0,count=1;
	for(int i=0;i<N;i++){
		for(int k=0;k<N;k++){
			sum+=a[i][k];
		}
		printf("第%d行的值为%d\n",count,sum);
		count++;
		sum=0;
	}
}
void con(int a[N][N]){
	int sum=0,count=1;
	for(int i=0;i<N;i++){
		for(int k=0;k<N;k++){
			sum+=a[k][i];
		}
		printf("第%d列的值为%d\n",count,sum);
		count++;
		sum=0;
	}
}

(5)

#include<stdio.h>
#include<string.h>
int compare(char a[][100]);
int main()
{	printf("请输入三串字符:\n");
	char a[3][100]={};
	for(int i=0;i<3;i++){
		gets(a[i]);
	}
	printf("最大的字符串是%s",a[compare(a)]);
	return 0;
}
int compare(char a[][100]){
	int max=0;
	for(int i=0;i<3;i++){
		if(strcmp(a[i],a[i+1])>0){
			max=i;
		}else{
			max=i+1;
		}
	}
	return max;
}

(6)

#include<stdio.h>
#include<string.h>
#define N 40
int mystrcpy(char a[],char b[]);
int main()
{
	char s1[N]="I love you everday";
	char s2[]="I love English";
	if(mystrcpy(s1,s2)){
		printf("复制成功,内容为%s",s1);
	}else{
		printf("复制失败");
	}
	return 0;
}
int mystrcpy(char a[],char b[]){
	int i;
	if(strlen(b)>strlen(a)){
		return 0;
	}
	for(i=0;b[i]!='\0';i++){
		a[i]=b[i];
	}
	a[i]='\0';
	return 1;
}

(7)

#include<stdio.h>
#include<string.h>
void transform(long int sum,char a[100]);
int main()
{	printf("请输入一串数字:\n");
	char a[100];
	gets(a);
	long int sum=0;//-2^31~2^31-1
	transform(sum,a);
	return 0;
}
void transform(long int sum,char a[100]){
	int flag=0,i=0;
	if(a[0]=='-'){
		flag=1;
		i++;
	}
	for(i=i;a[i]!='\0';i++){
		sum=sum*10+(a[i]-'0');
	}
	if(flag){
		printf("%ld ",sum*-1);
	}else{
		printf("%ld ",sum);
	}
}

-----------------------------------------------------------7.5更新

第八章 指针 

(1)

#include<stdio.h>
void swap(int *x,int *y);
int main()
{
	int a,b;
	printf("请输入a和b的值:\n");
	scanf("%d %d",&a,&b);
	swap(&a,&b);
	printf("交换后:\na=%d b=%d",a,b);
	return 0;
}
void swap(int *x,int *y){
	int t;
	t=*x;
	*x=*y;
	*y=t;
}

(2)

#include<stdio.h>
void max(int *p,int n);
void min(int *p,int n);
int main()
{
	int a[10]={0};
	int *p=a;
	printf("请输入十个数字\n");
	for(int i=0;i<10;i++){
		scanf("%d",p++);
	}
	p=a;
	max(p,10);
	min(p,10);
	return 0;
}
void max(int *p,int n){
	int num=*p;
	for(int i=0;i<n;i++){
		if(num<*(p+i)){
			num=*(p+i);
		}
	}
	p=p-n;
	printf("%d ",num);
}
void min(int *p,int n){
	int num= *p;
	for(int i=0;i<n;i++){
		if(num>*(p+i)){
			num=*(p+i);
		}
	}
	p=p-n;
	printf("%d ",num);
}

(3)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void max(int a[5][5],int n);//每一行最大值
void Smax(int (*p)[5],int n);//整个数组最大值
int main()
{
	int a[5][5]={0,};
	int (*p)[5]=a;
	//int c=1;
	srand(time(0));
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
		*(*(p+i)+j)=rand()%100;//随机初始化数组

		}
	}
	printf("初始化矩阵为:\n");
	for(int i=0;i<5;i++){
		for(int k=0;k<5;k++){
			printf("%d\t",a[i][k]);
		}
		printf("\n");
	}

	max(a,5);
	printf("\n");
	Smax(p,5);
	return 0;
}
void max(int a[5][5],int n){
	int i,j;
	int	maxnum;
	int count=1;
	for(i=0;i<n;i++){
		maxnum=a[i][0];
		for(j=0;j<n;j++){
			if(maxnum<a[i][j]){
			maxnum=a[i][j];
			}
		}
		printf("第%d行最大值是%d\n",count,maxnum);
		count++;
	}
}
void Smax(int (*p)[5],int n){
	int i,j,count;
	int	maxnum;
	maxnum=(*p)[0];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(maxnum<(*p)[j]){
				maxnum=(*p)[j];
				count=i+1;
			}
		}
		p++;

	}
	printf("最大值第%d行是%d\n",count,maxnum);
}

(4)

#include<stdio.h>
#include<stdlib.h>
void Dele(char *str1,char *str2);
int main()
{
	char a[100];
	gets(a);
	printf("输入的字符串为%s \n",a);
	char *str1,*str2;
	str1=str2=a;
	Dele(str1,str2);
	printf("删除后的字符串为%s \n",a);
	return 0;
}
void Dele(char *str1,char *str2){
	for(int i=0;*str1 !='\0';i++){
		if((*str1>='a'&&*str1<='z') ||( *str1>='A'&&*str1<='Z')){
			*str2=*str1;
			str2++;
			str1++;
		}
		else{
			str1++;
		}
	}
	*str2='\0';
}

(5)

#include<stdio.h>
#include<string.h>
char *strcopy(char *s1,char *s2);
int main()
{
	char a[100];
	char b[100];
	gets(a);
	printf("输入的字符串为%s \n",a);
	char *s1=a,*s2=b,*str;
	str=strcopy(s1,s2);
	printf("复制的的字符串为%s \n",str);
	return 0;
}
char *strcopy(char *s1,char *s2){

	char *s=s2;
	while(*s1!='\0'){
		 *(s2++)=*(s1++);
	}
	*s2='\0';
	return s;
}

(6)

#include<stdio.h>
#include<string.h>
void Sort(char s[5][100]);
int main()
{
	char a[5][100];
	printf("输入五个字符串:\n");
	int i=0;
	while(i<5){
		gets(a[i]);
		i++;
	}
	Sort(a);
	i=0;
    printf("排序后字符串为:"\n");
	while(i<5){
		printf("%s\n",a[i]);
		i++;
	}
	
	return 0;
}
void Sort(char s[5][100]){
	char b[100];
	char *a=b;
	for(int i=1;i<5;i++){
		for(int j=0;j<5-i;j++){
			if(strcmp(s[j],s[j+1])>0){
				strcpy(a,s[j]);
				strcpy(s[j],s[j+1]);
				strcpy(s[j+1],a);
				
			}
		}	
	}
}

------------------------------------------------------------------------7.7号更新

第九章 自定义数据类型

结构体实在是太难了 慢慢更新 

(1)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct{
	int year,month,day;
}date;
int count(int year,int month,int day);
int main(void)
{
	date a;
	int day=0;
	printf("请输入年月日如2022-02-22:\n");
	scanf("%d-%d-%d",&a.year,&a.month,&a.day);
	day=count(a.year,a.month,a.day);
	printf("是今年的第%d天",day);
	return 0;
}
int count(int year,int month,int day){
	int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int flag=1;
	int sum=0;
	if((year%4==0&&year%100!=0)||year%400==0){
		flag=0;
	}
	for(int i=1;i<month;i++){
			sum+=d[i];
		}
	sum+=day;
	if(flag){
		return sum;	
	}else if(flag==0&&month>2){
		return (sum+1);
	}else{
		return sum;	
	}

}

(2)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 10
typedef struct{
	int fail;
	char num[11];
	char name[5];
	char age[2];
	float score[3];
	float avgscore;
}studen;
void Sort(studen s[]);
void Fail(studen s[]);
void Print(studen *s);
int main(void)
{
	studen s[N];
	printf("请输入10位学生的学号、姓名和年龄以及三门成绩(用空格隔开):\n");
	for(int i=0;i<N;i++){
		s[i].avgscore=0.0;
		scanf("%s%s%s",s[i].num,s[i].name,s[i].age);
		for(int k=0;k<3;k++){
			scanf("%f",&s[i].score[k]);
			s[i].avgscore+=s[i].score[k];
		}
		s[i].avgscore/=3;
	}
	Sort(s);
	Fail(s);
	Print(s);
	return 0;
}
void Sort(studen s[]){
	studen a;
	for(int i=0;i<N;i++){
		for(int j=i+1;j<N;j++){
			if(s[i].avgscore < s[j].avgscore){
				a=s[i];
				s[i]=s[j];
				s[j]=a;
			}
		}
	}
}
void Fail(studen s[]){
	for(int i=0;i<N;i++){
		s[i].fail=0;
		for(int k=0;k<3;k++){
			if(s[i].score[k]<60.0){
				s[i].fail=1;
				break;
			}
		}
	}
	printf("不及格的学生信息如下:\n");
	printf("学号 姓名 年龄 三科成绩\n");
	for(int k=0;k<N;k++){
		if(s[k].fail){
			printf("%s %s %s ",s[k].num,s[k].name,s[k].age);
			for(int j=0;j<3;j++){
				printf("%.2f ",s[k].score[j]);
			}
			printf("\n");
		}
	}
}
void Print(studen *s){
	printf("排序学生信息如下:\n");
	printf("学号 姓名 年龄 三科成绩\n");
	for(int k=0;k<N;k++){
			printf("%s %s %s ",s[k].num,s[k].name,s[k].age);
			for(int j=0;j<3;j++){
				printf("%.2f ",s[k].score[j]);
			}
		printf("\n");
	}
}

(3)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 3
typedef struct a{
	char num[11];
	char name[5];
	char age[2];
	struct a *next;

}studen;
void Scan(studen s[],int n);
int main(void)
{
	studen s[N];
	studen *head,*p;
	int i;
	Scan(s,N);
	head=&s[0];
	for( i=0;i<N;i++){
		s[i].next=&s[i+1];
	}
	s[i-1].next=NULL;//尾部标记一下为空
	p=head;
	while(p){
		printf("%s %s %s\n",p->num,p->name,p->age);
		p=p->next;

	}
}
void Scan(studen s[],int n){
	printf("请输入学号、姓名和年龄\n");
	for(int i=0;i<n;i++){
		scanf("%s%s%s",s[i].num,s[i].name,s[i].age);
	}
}

(4)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
	char num[11];
	float score;
	struct a *next;
}studen,*STU;
STU Create(int n);
int Find(studen *s);
void print(STU head);
int main(void)
{	STU head=NULL;
	int n;
	printf("请输入学生数目:\n");
	scanf("%d",&n);
	head=Create(n);
	print(head);
	Find(head);
	return 0;
}
STU Create(int n){
	int i=0;
	studen *head=NULL,*p1,*p2;
	while(i<n){
		p1=(studen *)malloc(sizeof(studen));
		p1->next=NULL;
		printf("请输入第%d个学生的信息:\n",i+1);
		scanf("%s %f",p1->num,&p1->score);
		if(head==NULL){
			head=p1;
			p2=p1;
		}else{
			p2->next=p1;
			p2=p1;
		}
		i++;
	}
	return head;
}
void print(STU head){
	studen *p=head;
	printf("录入学生信息如下:\n");
	printf("学号 成绩\n");
	while(p!=NULL){
		printf("%s %.2f\n",p->num,p->score);
		p=p->next;
	}
}
int Find(studen *s){
	char a[11];
	float b;
	printf("请输入要查找的学号和修改的信息:\n");
	scanf("%s %f",a,&b);
	for(;s!= NULL;s=s->next){
		if(strcmp(a,s->num)==0){
			printf("查找到学号为%s\n",s->num);
			printf("已修改%.2f为%.2f\n",s->score,b);
			s->score=b;
			return 1;
		}
	}
	printf("没有找到此学号\n");
	return 0;
}

(5)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
	char num[11];
	int date;
	struct a *next;

}studen,*stu;
stu create(void);
stu Intersection(stu L1,stu L2);
void intput(studen *head);
int main(void)
{
	stu head=NULL,L1,L2;
	L1=create();
	L2=create();
	printf("第一个链表数据为:\n");
	intput(L1);
	printf("第二个链表数据为:\n");
	intput(L2);
	head=Intersection(L1,L2);
	printf("交集链表数据为:\n");
	intput(head);
}
stu create(void){
	int n;
	static int k=1;
	printf("请输入要建立的第%d个链表大小\n",k);
	k++;
	scanf("%d",&n);
	studen *head,*p,*q;
	int i=0;
	head=NULL;
	while(i<n){
		p=(stu)malloc(sizeof(studen));
		p->next=NULL;
		printf("请输入%d位的学号和成绩:",i+1);
		scanf("%s%d",p->num,&p->date);
		if(head==NULL){
			head=p;
			q=p;
		}else{
			q->next=p;
			q=p;
		}
		i++;
	}
	return head;
}
stu Intersection(stu L1,stu L2){
	studen *head,*p,*q,*s;
	p=L1;q=L2;
	if(p==NULL&&q==NULL){
		return 0;
	}
	while(p!=NULL){
		q=L2;
		while(q!=NULL){
			if(strcmp(p->num,q->num)==0){
				if(head==NULL){
					head=p;
					s=p;

				}else{
					s->next=q;
					s=q;
				}
			}
		q=q->next;//需要考虑空间回收问题
		}
	p=p->next;
	}
	s->next=NULL;
	return head;
}
void intput(studen *head){
	studen *p;
	p=head;
	while(p){
		printf("%s %d\n",p->num,p->date);
		p=p->next;
	}
}

(6)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
	char num[11];
	int date;
	struct a *next;

}studen,*stu;
stu create(stu *L);//创建带头指针的链表
void DeleteNode(stu L1,stu L2);
void intput(studen *head);
int main(void)
{
	stu L1,L2;
	create(&L1);//链表1
	create(&L2);//链表2
	printf("第一个链表数据为:\n");
	intput(L1);
	printf("第二个链表数据为:\n");
	intput(L2);
	DeleteNode(L1,L2);//删除1中含有2的数据
	printf("删除后的第一个链表:\n");
	intput(L1);
}
stu create(stu *L){
	int n;
	static int k=1;
	printf("请输入要建立的第%d个链表大小\n",k);
	k++;
	scanf("%d",&n);
	studen *p;
	(*L)=(stu)malloc(sizeof(studen));//创建空间
	(*L)->next=NULL;
	int i=0;
	while(i<n){//循环读入数据
		p=(stu)malloc(sizeof(studen));
		printf("请输入%d位的学号和成绩:",i+1);
		scanf("%s%d",p->num,&p->date);
		p->next=(*L)->next;
		(*L)->next=p;
		i++;
	}
	return 0;
}
void DeleteNode(stu L1,stu L2){
	studen *temp,*p,*q,*s,*h,*p1;
	p=(L1)->next;q=(L2)->next;h=(L1);s=p;
	if(p==NULL&&q==NULL){
		exit(0);
	}
	while(q!=NULL){
		p=s;//回到起点迭代比较
		while(p!=NULL){
			if(strcmp(q->num,p->num)==0){
				if(h->next==p){//头结点需要单独换算
					h->next=p->next;
					temp=p;
					p=p->next;
					free(temp);
				}else{//释放掉找到节点
					p1->next=p->next;
					temp=p;
					p=p->next;
					free(temp);
				}
			}
			if(p!=NULL){//链表是否为空
				p1=p;
				p=p->next;
			}

		}
		q=q->next;
	}

}
void intput(studen *head){//输出链表数据
	studen *p;
	p=head->next;
	while(p){
		printf("%s %d\n",p->num,p->date);
		p=p->next;
	}
}

----------------------------------------------------------------------------------------7.13就先到这里吧

(7)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct a{
	char num[11];
	int date;
	struct a *next;

}studen,*stu;
stu create(void);
stu Union(stu L1,stu L2);
void intput(studen *head);
int main(void)
{
	stu head=NULL,L1,L2;
	L1=create();
	L2=create();
	printf("第一个链表数据为:\n");
	intput(L1);
	printf("第二个链表数据为:\n");
	intput(L2);
	head=Union(L1,L2);
	printf("并集链表数据为:\n");
	intput(head);
}
stu create(void){
	int n;
	static int k=1;
	printf("请输入要建立的第%d个链表大小\n",k);
	k++;
	scanf("%d",&n);
	studen *head,*p,*q;
	int i=0;
	head=NULL;
	while(i<n){
		p=(stu)malloc(sizeof(studen));
		p->next=NULL;
		printf("请输入%d位的学号和成绩:",i+1);
		scanf("%s%d",p->num,&p->date);
		if(head==NULL){
			head=p;
			q=p;
		}else{
			q->next=p;
			q=p;
		}
		i++;
	}
	return head;
}
stu Union(stu L1,stu L2){
	studen *head,*p,*q,*s;
	p=L1;q=L2;
	if(p==NULL&&q==NULL){
		return 0;
	}
	while(q!=NULL&&p!=NULL){
			if(strcmp(p->num,q->num)<0){
				if(head==NULL){
					head=p;
					s=p;
				}else{
					s->next=p;
					s=p;
				}
				p=p->next;
			}
			else if(strcmp(p->num,q->num)>0){
					if(head==NULL){
						head=q;
						s=q;
				}else{
						s->next=q;
						s=q;
					}
					q=q->next;
			}
			else{
				if(head==NULL){
					head=p;
					s=p;
				}else{
					s->next=p;
					s=p;
				}
				p=p->next;
				q=q->next;

			}
		}
	while(q){
		s->next=q;
		s=q;
		q=q->next;
	}
	while(p){
		s->next=p;
		s=q;
		p=p->next;
	}
	s->next=NULL;
	return head;
}
void intput(studen *head){
	studen *p;
	p=head;
	while(p){
		printf("%s %d\n",p->num,p->date);
		p=p->next;
	}
}

(8)

#include <stdio.h>
#include <stdlib.h>
typedef struct StuInfo{
	int date;
	struct StuInfo *next;
}student,*stu;
stu create();
stu Numberoff(stu h);
int main(){
	stu head;
	head=create();
	Numberoff(head);
	return 0;
}
stu create(){
	int n=1;
	student *head,*p,*s;
	head=NULL;
	while(n<11){
		p=(stu)malloc(sizeof(student));
		p->next=NULL;
		p->date=n;
		if(head==NULL){
			head=p;
			s=p;
		}else{
			s->next=p;
			s=p;
		}
		++n;
	}
	s->next=head;
	return head;
}
stu Numberoff(stu h){
	student *head,*p,*q;
	head=h;q=head;//记录头结点和当前位置节点q
	p=head;//让p等于头结点后面
	int n=9,count=1;
	while(n>0){
		if(count%3!=0){
			++count;
			q=p;p=p->next;
		}else{
			q->next=p->next;
			printf("淘汰编号%d\n",p->date);
			free(p);
			p=q->next;
			--n;
			count=1;
		}
	}
	head=p;
		printf("剩余节点%d\n",head->date);
}

-----------------------------------------------------------------7.14更新

第十章 文件 

 (1)略

(2)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
	char *p;
	char a[20];
	FILE *fp;
	fp=fopen("2.1.txt","r");
	if(fp==NULL){
		printf("File can not be opened\n");
		exit(0);
	}
	p=fgets(a,40,fp);
	while(p != NULL){
		printf("%s",p);;
		p=fgets(a,40,fp);
	}
	fclose(fp);
	return 0;
}

(3)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
	char p;
	char b[20];
	printf("请输入要创建的文件名\n");
	scanf("%s",b);
	strcat(b,".txt");
	FILE *fp,*fq;
	fp=fopen("3.1.txt","r");
	fq=fopen(b,"w+");
	if(fp==NULL||fq==NULL){
		printf("File can not be opened\n");
		exit(0);
	}else{
		printf("File created\n");
	}
	p=fgetc(fp);
	while(p != EOF){
		if(fputc(p,fq)==EOF){
			printf("fail");
			exit(0);
		}
		p=fgetc(fp);
	}
	printf("copy ok!");
	fclose(fp);
	fclose(fq);
	return 0;
}

(4)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct a{
	char name[10];
	int age;
	float Mscore;
	float Escore;
	float Yscore;
}stu;
int main(){
	stu b;
	//char *p;
	FILE *fp;
	fp=fopen("student.txt","w+");
	if(fp==NULL){
		printf("File can not be opened\n");
		exit(0);
	}
	for(int i=1;i<=5;i++){
		printf("请输入第%d个学生的信息(姓名 年龄 数学 英语 语文)\n",i);
		scanf("%s %d %f %f %f",b.name,&b.age,&b.Mscore,&b.Escore,&b.Yscore);
		fprintf(fp,"%s %d %.2f %.2f %.2f",b.name,b.age,b.Mscore,b.Escore,b.Yscore);
		fprintf(fp,"\n");
	}
	fclose(fp);
	return 0;
}

(5)

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
  
struct Student {  
    float average; // 平均值  
    char name[10];  
    int age;  
    float Mscore; // 数学成绩  
    float Escore; // 英语成绩  
    float Yscore; // 语文成绩  
} stu[5];  
  
void selectionSort();  
  
int main() {  
    FILE *fp = fopen("student.txt", "r");  
    if (fp == NULL) {  
        perror("无法打开文件");  
        return 1;  
    }  
    int i = 0, j;  
    while (fscanf(fp, "%9s %d %f %f %f", stu[i].name, &stu[i].age,  
                   &stu[i].Mscore, &stu[i].Escore, &stu[i].Yscore) == 5) {  
        stu[i].average = (stu[i].Mscore + stu[i].Escore + stu[i].Yscore) / 3;  
        i++;  
        if (i >= 5) break; // 确保不会超过数组界限  
    }  
    fclose(fp);  
  
    selectionSort();  
  
    for (int i = 0; i < 5; i++) {  
        printf("%s %.2f\n", stu[i].name, stu[i].average);  
    }  
  
    return 0;  
}  
  
void selectionSort() {  
    struct Student temp;  
    int k;  
    for (int i = 0; i < 4; i++) {  
        k = i; // 假设当前位置是最小的  
        for (int j = i + 1; j < 5; j++) {  
            if (stu[j].average > stu[k].average) {  
                k = j; // 找到新的最大位置  
            }  
        }  
        if (i != k) {  
            // 交换当前位置与找到的最大位置  
            temp = stu[i];  
            stu[i] = stu[k];  
            stu[k] = temp;  
        }  
    }  
}

(6)

#include <stdio.h>
#include <stdlib.h>
typedef  struct a{
	char name[10];
	int pirce;//单价
	int num;
	float money;//金额
}goods;

int main(){
	FILE *fp = fopen("goods.txt", "wb");
	int n;
	goods a;
	printf("请输入要读入的商品个数\n");
	scanf("%d",&n);
	if(fp==NULL){
		printf("File can not be opened\n");
		exit(0);
	}
	for(int i=0;i<n;i++){
		printf("按顺序输入 名字 单价 数量 金额\n");
		scanf("%s %d %d %f",a.name,&a.pirce,&a.num,&a.money);
		fwrite(&a,sizeof(goods),1,fp);
	}
//	fclose(fp);/*测试输出代码*/
//		fp=fopen("goods.txt","rb");
//		printf("商品信息\n");
//		while(fread(&a,sizeof(goods),1,fp)==1){
//			printf("%s %d %d %.2f\n",a.name,a.pirce,a.num,a.money);
//		}
	fclose(fp);
	return 0;
}

(7)

#include<stdio.h>
#include<stdlib.h>
#define N 30
typedef  struct a{
	char name[10];
	int pirce;//单价
	int num;
	float money;//金额
}goods;
void Sort(goods a[],int n);
int main(){
	int i;
	FILE *fp=fopen("goods.txt","rb");
	goods a[N];
	for( i=0;i<N;i++){
		if(feof(fp)){
			break;
		}
		fread(&a[i],sizeof(goods),1,fp);
	}
	Sort(a,i-1);
	printf("产品排序如下:\n");
	for(int j=0;j<i-1;j++){

		printf("%s %d %d %.2f\n",a[j].name,a[j].pirce,a[j].num,a[j].money);
	}
}
void Sort(goods a[],int n){
	goods temp;
	int flag=0;//判断两个金额是否相同
	for(int i=0;i<n;i++){
		flag=1;
		for(int j=i+1;j<n;j++){
			if(a[i].money<a[j].money){
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
			else if(flag&&a[i].pirce<a[j].pirce){
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}

		}
	}
}

----------------第一次尝试更新这种,还请大家看到错误多多包涵,谢谢大家,更新完毕!7.17

  • 16
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值