C程序设计练习

C程序设计练习

  • 个人练习集
    • 循环结构
      • 1、阶乘求和
      • 2、求最小公倍数和最大公约数
      • 3、输入一行字符,统计字母、数字、空格和其他字符的个数
      • 4、求水仙花数
      • 5、斐波拉契数列
    • 数组练习
      • 1、斐波拉契数列
      • 2、排序
        • 起泡法排序
        • 比较法排序
      • 3、一行字符统计单词个数
      • 4、找出输入的三个字符串中最大者
      • 5、求3x3整型矩阵对角线之和
      • 6、筛选法求素数
      • 7、已排序数组插入数值
      • 8、逆序存放数组
      • 9、输出杨辉三角
    • 指针
      • 1、指针引用数组
      • 2、利用指针对数组反序存放
      • 3、用指针方法排序
      • 4、用指向数组的指针作函数参数
      • 5、编写求定积分通用函数
      • 6、查询学生成绩含有不及格分数就输出其所有分数
      • 7、字符串数组排序
      • 8、利用指向整型数据指针对整型数组排序
    • 结构体
      • 1、结构体指针和结构体数组简单认识
      • 2、静态链表的定义以及数据输出
      • 3、动态链表的定义以及数据输出
    • 文件
      • 排序字符串并写入文件
      • 从文件读取数据
      • 格式化方式读写文件
      • 随机读写

个人练习集

*持续更新
习题来源谭浩强的《C程序设计》
两星期入门C,两星期数据结构,后续刷算法,特此记录。

循环结构

1、阶乘求和

在这里插入图片描述
代码:

#include 
int main()
{
	double i,j,sum=0,s;
	for(i=1;i<=20;i++)
	{
		for(s=1,j=1;j<=i;j++)
		{
			s = s*j;
		}
		sum = sum + s;
	}
	printf("sum=%22.15e\n",sum);
	return 0;
}

结果:
在这里插入图片描述

2、求最小公倍数和最大公约数

辗转相除法(欧几里得算法)

代码:

#include 
//求最小公倍数和最大公约数
int main()
{
	int num_1,num_2,result,product;
	printf("enter two number:");
	scanf("%d%d",&num_1,&num_2);
	product = num_1*num_2;
	result = num_1%num_2;
	while(result!=0)
	{
		num_1 = num_2;
		num_2 = result;
		result = num_1%num_2;
	}
	printf("最大公约数:%d\n最小公倍数:%d\n",num_2,product/num_2);
	return 0;
}

结果:
求最小公倍数和最大公约数

3、输入一行字符,统计字母、数字、空格和其他字符的个数

代码:

#include 
int main()
{
	char c;
	int letter=0,number=0,space=0,character=0;  //c:输入字符,letter:字母,space:空格,character:其他字符
	c = getchar();
	while(c != '\n')  //直至输入换行停止
	{
		if((c>=65&&c<=90)||(c>=97&&c<=122)) letter +=1;
		else if(c>=48&&c<=57) number +=1;
		else if(c==32) space +=1;
		else character +=1;
		c = getchar();
	}
	printf("%d个字母\n%d个数字\n%d个空格\n%d个其他字符\n",letter,number,space,character);
	return 0;
}

结果:
C程序设计练习_第1张图片
改进:

#include 
//输入一行字符,统计字母、数字、空格和其他字符的个数
int main()
{
	char c;
	int letter=0,number=0,space=0,character=0;  //c:输入字符,letter:字母,space:空格,character:其他字符
	while((c=getchar())!= '\n')  //直至输入换行停止
	{
		if((c>=65&&c<=90)||(c>=97&&c<=122)) letter +=1;
		else if(c>=48&&c<=57) number +=1;
		else if(c==32) space +=1;
		else character +=1;
	}
	printf("%d个字母\n%d个数字\n%d个空格\n%d个其他字符\n",letter,number,space,character);
	return 0;
}

4、求水仙花数

水仙花数:一个三位数,每位数的立方和等于该数,称之水仙花数。

代码:

#include 
/*4、求水仙花数
水仙花数:一个三位数,每位数的立方和等于该数,称之水仙花数。
*/
int main()
{
	int i,hundred,ten,indiv;
	for(i=100;i<1000;i++)
	{
		hundred = i/100;
		ten = (i-hundred*100)/10;
		indiv = (i-hundred*100-ten*10);
		if(hundred*hundred*hundred+ten*ten*ten+indiv*indiv*indiv == i) printf("%d\n",i);
	}
	return 0;
}

结果:
C程序设计练习_第2张图片
改进:

#include 
/*4、求水仙花数
水仙花数:一个三位数,每位数的立方和等于该数,称之水仙花数。
*/
int main()
{
	int i,hundred,ten,indiv;
	for(i=100;i<1000;i++)
	{
		hundred = i/100;
		ten = i/10-hundred*10;
		indiv = i%10;
		if(hundred*hundred*hundred+ten*ten*ten+indiv*indiv*indiv == i) printf("%d\n",i);
	}
	return 0;
}

5、斐波拉契数列

代码:

#include 
int main()
{
	int i,f1=1,f2=1,f3;
	printf("%d\n%d\n",f1,f2);
	for(i=0;i<10;i++)
	{
		f3 = f1+f2;
		f1 = f2;
		f2 = f3;
		printf("%d\n",f3);
	}
	return 0;
}

结果:
C程序设计练习_第3张图片
改进:

#include 
int main()
{
	int f1=1,f2=2,i;
	for(i=1;i<=20;i++)
	{
		printf("%12d %12d\t",f1,f2);
		if(i%2==0) printf("\n");
		f1 = f1 + f2;
		f2 = f1 + f2;
	}
	return 0;
}

数组练习

1、斐波拉契数列

计算出来并保存到数组。

代码:

#include 
int main()
{
	int i;
	int a[20]={1,1};
	for(i=2;i<20;i++)
	{
		a[i]=a[i-2]+a[i-1];
	}
	for(i=0;i<20;i++)
	{
		if(i%5==0) printf("\n");
		printf("%12d",a[i]);
	}
	printf("\n");
	return 0;
}

结果:
C程序设计练习_第4张图片

2、排序

起泡法排序

自定义10个数。

代码:

#include 
int main()
{
	int i,j,t;
	int a[10];
	printf("enter 10 numbers:");
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	printf("\n");
	for(i=0;i<9;i++)
	{
		for(j=0;j<9-i;j++)
		{
			if(a[j]>a[j+1])
			{
				t = a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	printf("the sorted number:");
	for(i=0;i<10;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}

结果:
C程序设计练习_第5张图片

改进:

#include 
int main()
{
	int i,j,t;
	int a[10];
	printf("enter 10 numbes:");
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	printf("\n");
	for(i=0;i<9;i++)
		for(j=0;j<9-i;j++)
			if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;}
	printf("the sorted number:");
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}

比较法排序

代码:

#include 
int main()
{
	int nums[10],i,j,min,tmp;
	printf("请输入十个数:");
	for(i=0;i<10;i++)
	{
		scanf("%d",&nums[i]);
	}
	printf("\n当前输入数组:");
	for(i=0;i<10;i++)
		printf("%3d",nums[i]);
	//嵌套循环比较
	for(i=0;i<10;i++)
	{
		min = i;
		for(j=i;j<10;j++)
		{
			if(nums[min]>nums[j])
			{
				tmp = nums[j];
				nums[j] = nums[min];
				nums[min] = tmp;
			}
		}
	}
	printf("\n排序后的数组:");
	//output sorted array
	for(i=0;i<10;i++) 
		printf("%3d",nums[i]);
	printf("\n");
	return 0;
}

结果:
C程序设计练习_第6张图片

3、一行字符统计单词个数

代码:

#include 
#include 
int main()
{
	char string[30];
	int i,num=0,word=0;
	char c;
	fgets(string,30,stdin);
	for(i=0;(c=string[i])!='\0';i++)
	{
		if(c==' ') word=0;
		else if(word==0)
		{
			word=1;
			num++;
		}
	}
	printf("There are %d words in this line.\n",num);
	return 0;
}

结果:
一行字符统计单词个数
注:
gcc编译器不再支持gets()和puts()函数的使用,官方手册推荐使用fgets()和fputs()两个函数代替。
fgets(name of array, lenth of array, stdin) //stdin:standard input
fgets(name of array, stdou) //stdou: standard output
虽然linux的gcc不支持,但windows的dev c 却可以通过编译。

4、找出输入的三个字符串中最大者

使用strcmp()比较第一对不同字符大小进而找出其最大者。

代码:

#include 
#include 
int main()
{
	char str[3][20];
	char string [20];
	int i;
	for(i=0;i<3;i++)
	{
		printf("输入第%d个字符串:",i+1);
		fgets(str[i],20,stdin);
	}
	if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);
	else strcpy(string,str[1]);
	if(strcmp(str[2],string)>0) strcpy(string,str[2]);
	printf("最大的是:%s",string);
	return 0;
}

结果:
C程序设计练习_第7张图片

改进:

#include 
#include 
int main()
{
	char str[3][20];
	char string[20];
	printf("请输入三个字符串:");
	scanf("%s%s%s",str[0],str[1],str[2]);
	if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);
	else strcpy(string,str[1]);
	if(strcmp(str[2],string)>0) strcpy(string,str[2]);
	printf("其中最大的是:%s\n",string);
	return 0;
}

5、求3x3整型矩阵对角线之和

但条对角线之和。
代码:

#include 
int main()
{
	int nums[3][3];
	int i,j,sum=0;
	printf("输入3x3矩阵数值:\n");
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			scanf("%d",&nums[i][j]);
		}
	}
	for(i=0;i<3;i++)
	{
		sum+=nums[i][i];
	}
	printf("总和:%d\n",sum);
	return 0;
}

结果:
C程序设计练习_第8张图片

改进:
1-扩增到nxn矩阵
2-两条对角线之和

代码:

#include 
int main()
{
	int i,j,tmp,n,sum,total;
	printf("请输入nxn的矩阵的n= ");
	scanf("%d",&n);
	int nums[n][n];
	//嵌套循环输入数值
	for(i=0;i<n;i++)
	{
		printf("请输入第%d行的%d个数:",i+1,n);
		j=0;
		while(j<n)
		{
			scanf("%d",&nums[i][j]);
			j++;
		}
	}
	//嵌套循环输出矩阵
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			printf("%d ",nums[i][j]);
		}
		printf("\n");
	}
	//双对角线求和
	for(i=0;i<n;i++)
	{
		sum = nums[i][i]+nums[i][n-i-1];
		total+=sum;
	}
	printf("对角线总和:%d\n",total);
	return 0;
}

结果:
C程序设计练习_第9张图片

6、筛选法求素数

筛选法输出 1-100的素数。

代码:

#include 
#include 
int main()
{
	int nums[100],n,i,j;
	//初始化数组
	for(i=0;i<100;i++)
		nums[i]=i;
	//求余数筛选
	for(i=2;i<sqrt(100);i++)
	{
		for(j=i+1;j<=100;j++)
		{
			if(nums[i]!=0 && nums[j]!=0)
			{
				if((nums[j]%nums[i])==0) nums[j]=0;
			}
		}
	}
	//输出素数
	for(i=2,n=0;i<100;i++)
	{
		if(nums[i]!=0)
		{
			printf("%3d",nums[i]);
			n++;
		}
		if((n%10)==0) printf("\n");
	}
	printf("\n");
	return 0;
}

结果:
C程序设计练习_第10张图片

7、已排序数组插入数值

一个已经排序的数组,要求输入一个数字后按已有的顺序规律插入数组。

#include 
int main()
{
	int nums[10]={1,5,20,34,51,64,74,78,80};
	int i,j,num,tmp01,tmp02;
	printf("待处理数组:");
	for(i=0;i<9;i++) printf("%3d",nums[i]);
	printf("\n");
	printf("输入待插进数值:");
	scanf("%d",&num);
	if(num>nums[8]) nums[9]=num;
	else
		for(i=0;i<9;i++)
		{
			if(nums[i]>num)
			{
				tmp01 = nums[i];
				nums[i] = num;
				for(j=i+1;j<10;j++)
				{
					tmp02 = nums[j];
					nums[j] = tmp01;
					tmp01 = tmp02;
				}
				break;
			}
		}
	printf("处理后数组:");
	for(i=0;i<10;i++) printf("%3d",nums[i]);
	printf("\n");
	return 0;
}

结果:
C程序设计练习_第11张图片

8、逆序存放数组

将一个数组中的数值逆序中重新存放。

代码:

#include 
int main()
{
	int nums[10];
	int i,j,min,tmp;
	printf("enter ten numbers:");
	for(i=0;i<10;i++) scanf("%3d",&nums[i]);
//起泡排序
	for(i=0;i<9;i++)
	{
		for(j=0;j<9-i;j++)
		{
			if(nums[j]>nums[j+1])
			{
				tmp = nums[j];
				nums[j] = nums[j+1];
				nums[j+1] = tmp;
			}
		}
	}
	//对比排序
	printf("array order:");
	for(i=0;i<10;i++) printf("%3d",nums[i]);
	printf("\nbut,saving the array with descending order.as folows:\n");
	for(i=0;i<9;i++)
	{
		for(j=i+1;j<10;j++)
		{
			if(nums[j]>nums[i])
			{
				tmp = nums[i];
				nums[i] =  nums[j];
				nums[j] = tmp;
			}
		}
	}
	for(i=0;i<10;i++) printf("%3d",nums[i]);
	printf("\n");
	return 0;
}

结果:C程序设计练习_第12张图片

9、输出杨辉三角

打印前十行杨辉三角排列。
代码:

#include 
#define N 10
int main()
{
	int nums[N][N],i,j;
	for(i=0;i<N;i++)
	{
		nums[i][0] = 1;
		nums[i][i] = 1;
	}
	for(i=2;i<N;i++)
	{
		for(j=1;j<i;j++)
			nums[i][j] = nums[i-1][j]+nums[i-1][j-1];
	}
	for(i=0;i<N;i++)
	{
		for(j=0;j<=i;j++)
			printf("%5d",nums[i][j]);
		printf("\n");
	}
	printf("\n");
	return 0;
}

结果:
C程序设计练习_第13张图片

指针

1、指针引用数组

有一个整型数组a,有10个元素,p是指向数组元素的指针变量。
下标法:a[i]形式;
指针法:*(a+i)形式

1、下标法:

#include 
int main()
{
	int a[10],i;
	printf("please inter ten numbers:");
	for(i=0;i<10;i++) scanf("%d",&a[i]);
	for(i=0;i<10;i++) printf("%d ",a[i]);
	printf("\n");
	return 0;
}

2、数组名计算数组元素地址

#include 
int main()
{
	int a[10],i;
	printf("please inter ten numbers:");
	for(i=0;i<10;i++) scanf("%d",a+i);
	for(i=0;i<10;i++) printf("%d ",*(a+i));
	printf("\n");
	return 0;
}

3、指针变量指向数组元素

#include 
int main()
{
	int a[10],*p,*i;
	printf("please inter ten numbers:");
	for(i=a;i<(a+10);i++) scanf("%d",i);
	for(p=a;p<(a+10);p++) printf("%d ",*p);
	printf("\n");
	return 0;
}

结果:
在这里插入图片描述

2、利用指针对数组反序存放

将数组a中n个整数按相反顺序存放
1、把数组作为函数形式参数传递给函数进行处理

#include 
int main()
{
	void inv(int arr[],int n);
	int i,a[10]={3,7,5,6,4,8,9,1,2};
	printf("The original array:");
	for(i=0;i<10;i++) printf("%d ",a[i]);
	inv(a,5);
	printf("\nThe array has been inverted:");
	for(i=0;i<10;i++) printf("%d ",a[i]);
	printf("\n");
	return 0;
}
void inv(int arr[],int n)
{
	int temp,i,j,m=(n-1)/2;
	for(i=0;i<=m;i++)
	{
		j = n-1-i;
		temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}

2、把指针变量作为形参

#include 
int main()
{
	void inv(int *x,int n);
	int i,a[10]={3,7,9,11,0,6,7,5,4,2};
	printf("The original array:");
	for(i=0;i<10;i++) printf("%d ",a[i]);
	inv(a,10);
	printf("\nThe array has been inverted:");
	for(i=0;i<10;i++) printf("%d ",a[i]);
	printf("\n");
	return 0;
}
void inv(int *x,int n)
{
	int temp,m=(n-1)/2,*i,*p,*j;
	i=x, j=x+n-1, p=x+m;
	for(;i<=p;i++,j--)
	{
		temp = *i;
		*i = *j;
		*j = temp;
	}
}

3、实参和形参都用指针变量

#include 
int main()
{
	void inv(int *x,int n);
	int i,arr[10],*p=arr;   //值传递,arr首元素地址传递给指针变量的值p
	printf("Please inter the original array:");
	for(i=0;i<10;i++,p++) scanf("%d",p);
	p=arr;  //再次指定指针变量的值
	inv(p,10);
	printf("\nThe array has been inverted:");
	for(i=0;i<10;i++,p++) printf("%d ",*p);
	printf("\n");
	return 0;
}
void inv(int *x,int n)
{
	int temp,m=(n-1)/2,*i,*j,*p;
	i=x;j=x+n-1;p=x+m;
	for(;i<=p;i++,j--)
	{
		temp = *i;
		*i = *j;
		*j = temp;
	}
}

结果:
在这里插入图片描述

3、用指针方法排序

用指针方法对10个整数按由大到小顺序排序,用选择法排序。

代码:

#include 
int main()
{
	void sort(int arr[],int n);
	int i,a[10],*p=a;
	printf("Please inter ten numbers for original array:");
	for(i=0;i<10;i++,p++) scanf("%d",p);
	printf("\nOutput sorted array:");
	p=a;
	sort(p,10);
	for(i=0;i<10;i++,p++) printf("%d ",*p);
	printf("\n");
	return 0;
}
void sort(int arr[],int n)
{
	int i,j,min,temp;
	for(i=0;i<n-1;i++)
	{
		min = i;
		for(j=i+1;j<n;j++)
		{
			if(arr[min]<arr[j])
			{
				temp = arr[j];
				arr[j] = arr[min];
				arr[min] = temp;
			}
		}
	}
}

结果:
在这里插入图片描述

4、用指向数组的指针作函数参数

一个存放成绩的二维数组,查找一门以上的课程不及格的学生,输出他们的全部课程成绩。

代码:

#include 
int main()
{
	void search(int (*p)[4],int n);
	int score[][4]={{12,85,45,87},{85,61,74,81},{91,64,71,52}};
	search(score,3);
	return 0;
}
void search(int (*p)[4],int n)
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<4;j++)
		{
			if(*(*(p+i)+j)<60)
			{
				printf("NO.%d student's scores are:",i+1);
				for(j=0;j<4;j++)
					printf("%d ",*(*(p+i)+j));
				printf("\n");
				break;
			}
		}
	}
}

结果:
在这里插入图片描述

5、编写求定积分通用函数

利用矩形法求定积分。
简单解释:
C程序设计练习_第14张图片
简要原理参考:大佬的博客

#include 
#define N 10000
int main()
{
	float integral(float upper,float lower,float(*p)(float));
	float func(float x);
	float upper,lower,result;
	printf("please enter upper and lower:");
	scanf("%f %f",&upper,&lower);
	result = integral(upper,lower,func);
	printf("result=%f\n",result);
	return 0;
}
float integral(float upper,float lower,float(*p)(float)) //通用函数,形参:上下限和积分函数——函数指针变量
{
	int i;
	float s=0,x=lower;
	for(i=1;i<=N;i++)
	{
		x = x+(upper-lower)/N;
		s = s+(*p)(x)*((upper-lower)/N);
	}
	return s;
}
float func(float x)  //积分函数
{
	return (2*x+3);
}

结果:
在这里插入图片描述
积分函数2x+3,若使用牛顿莱布尼兹公式算,结果等于6,矩形法求和的结果无限接近6。

6、查询学生成绩含有不及格分数就输出其所有分数

学生成绩建立一个二维数组存放数据

代码:

#include 
int main()
{
	float *search(float (*pointer)[4]);
	float score[][4]={{60,70,80,90},{45,71,86,94},{71,64,52,61}};
	int i,j;
	float *p;
	for(i=0;i<3;i++)
	{
		p=search(score+i);
		if(p == *(score+i))     //p的值等于&score[i][0]表示存在不及格分数
		{
			for(j=0;j<4;j++)    //如果在前面直接定义i和j等于0,然后for(;j<4;j++)会出现循环一次后j的值就是3,不再符合循环条件
				printf("%5.2f ",*(p+j));
			printf("\n");
		}
	}
	return 0;
}
float *search(float (*pointer)[4]) //形参指向一维数组
{
	int i=0;
	float *pt;
	pt = NULL;  //先给float型指针变量赋值 NULL => 0
	for(;i<4;i++)
	{
		if(*(*pointer+i)<60) 
		{
			pt = *pointer; //存在低于60的,将&score[i][0] 赋给pt的值
			break;  //检查到一个不及格就break循环
		}
	}
	return pt;
}

结果:
在这里插入图片描述

7、字符串数组排序

代码:

#include 
int main()
{
	void sort(char *name[],int n);
	void print(char *name[],int n);
	char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};   //name数组的每个元素是字符串首元素地址
	sort(name,5);
	print(name,5);
	return 0;
}
void sort(char *name[],int n)
{
	char *temp;
	int i,j,k;
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)            //name[k]表示第k个字符串首元素地址,strcmp()函数可直接传入字符串首元素地址,与数值型数据的比较不一样
			if(strcmp(name[k],name[j])>0) k=j;   //每一次循环得到最小值序号k
		if(k!=i)  //数组顺序需要交换
		{
			temp = name[i];	
			name[i] = name[k];   //较小值的字符串地址提到前面交换
			name[k] = temp;
		}
	}
}
void print(char *name[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%s\n",name[i]);
}

结果:
C程序设计练习_第15张图片

8、利用指向整型数据指针对整型数组排序

定义一个整型数组,另外定义一个指向整型数据指针数组,利用其进行排序。过程注意与上一题对字符串进行排序作比较。

#include 
int main()
{
	void sort(int *num[],int n);
	int a[5] = {8,5,2,1,6};
	int *num[] = {&a[0],&a[1],&a[2],&a[3],&a[4]};
	int i,**p;
	p = num;  //int型指针数组地址 => p
	printf("待排序数组:");
	for(i=0;i<5;i++)
		printf("%d ",**(p+i));   //输出数组元素,p+i 指向指针的指针  *(p+i) 指向指针的值(整型数组地址) =&a[i]  **(p+i) = a[i]
	printf("\n");
	sort(num,5);  //排序开始
	printf("已排序数组:");
	p = num;  //重新让指针指向指针数组有元素地址
	for(i=0;i<5;i++)
		printf("%d ",**(p+i));
	printf("\n");
	return 0;
}
//选择法排序
void sort(int *num[],int n)
{
	int i,j,k;
	int *temp;
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++) 
			if(*num[k]>*num[j]) k=j;  //比较要用到数值进行比较,而num[k]只是整型数组的第k个元素的指针(地址)
		if(k!=i)
		{
			temp = num[i];
			num[i] = num[k];
			num[k] = temp;
		}
	}
}

结果:
在这里插入图片描述

结构体

1、结构体指针和结构体数组简单认识

#include 
#define N 3
struct Student
{
	int num;
	char name[20];
	float score[3];
	float aver;
};
int main()
{
	void input(struct Student stu[]);
	struct Student max(struct Student stu[]);
	void print(struct Student stu);
	struct Student stu[N],*p=stu;     //*p等价=>*p;p=stu;   建村,立村长;
	input(p);  //传递指针,而不是指针指向的数据(*p)
	print(max(p));
	return 0;
}
void input(struct Student stu[])
{
	int i;
	for(i=0;i<N;i++)
	{
		scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
		stu[i].aver = (stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
	}
}

struct Student max(struct Student stu[])   //被调用时形参数组stu代表传递数组或指针值所指向的首元素地址
{
	int i,m=0;
	for(i=0;i<N;i++)
		if(stu[i].aver>stu[m].aver) m=i;
	return stu[m];
}
void print(struct Student stu)    //形式参数传递的是结构体的成员信息数据而不是地址
{
	printf("\nNo.:%d\nname:%s\nscores:%5.1f%5.1f%5.1f\naverage:%5.1f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.aver);
}

结果:
C程序设计练习_第16张图片

2、静态链表的定义以及数据输出

代码:

#include 
struct Student
{
	int num;
	float score;
	struct Student *next;
};
int main()
{
	struct Student a,b,c,*p,*head;
	a.num=10101;a.score=85.5;
	b.num=10102;b.score=45;
	c.num=10103;c.score=68;
	head=&a;
	a.next=&b;
	b.next=&c;
	c.next=NULL;
	p=head;
	do
	{
		printf("%d %5.1f\n",p->num,p->score);
		p=p->next;
	}while(p!=NULL);
	return 0;
}

结果:
在这里插入图片描述

3、动态链表的定义以及数据输出

代码:

#include 
#include 
#define LEN sizeof(struct Student)
struct Student
{
	long num;
	float score;
	struct Student * next;
};
int n;  //全局变量n  在此程序的目的是为了能清楚知道该链表有多少条记录
struct Student * creat()
{
	struct Student *head;      //定义表头指针
	struct Student *p1,*p2;      //p1指向新开辟节点  p2指向表尾
	n = 0;   //设置记录条数为0
	head = NULL;
	p1=p2=(struct Student *)malloc(LEN);   //malloc开辟的内存单元类型为void,进行类型强制转换
	printf("Please enter student's data: ");
	scanf("%ld %f",&p1->num,&p1->score);
	while(p1->num != 0)    //学号不为0进行循环
	{
		n = n + 1;
		if(n == 1) head = p1;  //记录条数为0就给p1的地址为表头指针
		else p2->next = p1;    //否则指向上一个元素与之“连接”
		p2 = p1;  //p2指向表尾
		printf("Please enter student's data: ");
		p1 = (struct Student *)malloc(LEN);   //再次开辟新的内存单元
		scanf("%ld %f",&p1->num,&p1->score);    //为新的内存单元输入数据
	}
	p2->next = NULL;  //num为0 则表尾的next指针设置为NULL
	return (head);
}
void print(struct Student * head)
{
	struct Student * p;  //接受参数传递过来的链表地址
	p = head;   //地址数值传递
	printf("\nNow,These %d records are:\n",n);   //输出全局变量n所记录的条数
	if(head != NULL)   //判断此链表是不是空链表
		do
		{
			printf("%ld%5.1f\n",p->num,p->score);
			p = p->next;   //指向链表的下一个元素
		}while(p != NULL);   //循环条件为下一个链表地址不空
}
int main()
{
	struct Student * creat();   //creat函数在main函数之前可以不声明
	struct Student * pt;
	pt = creat();   //pt接受返回的链表头指针
	//printf("%ld%5.1f\n",pt->num,pt->score);
	print(pt);  //输出链表数据内容
	return 0;
}

结果:
C程序设计练习_第17张图片

文件

排序字符串并写入文件

对字符串字母进行排序,并写入文件

#include 
#include 
#include 

int main()
{
	FILE *fp;
	char str[3][10],temp[10];
	int i,j,k,n=3;   //n表示输入字符串数量 
	
	//输入数据
	printf("Enter English string:\n"); 
	for(i=0;i<n;i++)
		gets(str[i]); 
	
	//比较法排序
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
			if(strcmp(str[k],str[j])>0) k=j;
		if(k!=i)
		{
			strcpy(temp,str[i]);
			strcpy(str[i],str[k]);
			strcpy(str[k],temp);
		}
	}
	
	//打开文件
	if((fp = fopen("string.dat","w")) == NULL)
	{
		printf("can't open file!\n'");
		exit(0);
	}
	
	//输入数据进文件
	printf("\nThe new squeue:\n");
	for(i=0;i<n;i++)
	{
		fputs(str[i],fp);
		fputs("\n",fp);
		printf("%s\n",str[i]);
	}
	 
	return 0;
}

从文件读取数据

#include 
#include 
#include 

int main()
{
	char str[3][10];
	FILE *fp;
	int i=0;
	if((fp = fopen("string.dat","r"))==NULL)
	{
		printf("can't open file!\n");
		exit(0); 
	}
	
	while(fgets(str[i],10,fp) != NULL)
	{
		printf("%s",str[i]);
		i++;
	}
	fclose(fp);
	
	return 0;
}

格式化方式读写文件

#include 
#include 

#define SIZE 10

//定义两个结构体数组,一个用作输入,一个用作输出 
struct Student_type
{
	char name[10];
	int num;
	int age;
	char addr[15];
}stud_in[SIZE],stud_out[SIZE];

//向文件写入数据 
void save()
{
	FILE *fp;
	if((fp=fopen("stud.dat","wb"))==NULL)
	{
		printf("can't open file!\n");
		exit(0);
	}
	for(int i=0;i<SIZE;i++)
		if(fwrite(&stud_in[i],sizeof(struct Student_type),1,fp) != 1)   //逐个数据项输入,输入地址 &stud_in[i]   并设置判断是否正常写入数据 
			printf("file write erroe!\n");     
	fclose(fp);
}

//从文件输入数据到内存 
void show()
{
	FILE *fp;
	if((fp=fopen("stud.dat","rb"))==NULL)
	{
		printf("can't open file!\n");
		exit(0);
	}
	for(int i=0;i<SIZE;i++)    //逐个数据项输出,先写入到stud_out结构体数组里,再从中输出到终端 
	{
		if(fread(&stud_out[i],sizeof(struct Student_type),1,fp) !=1)
			printf("file read error!\n");
		else printf("%-7s %4d %4d %-15s\n",stud_out[i].name,stud_out[i].num,stud_out[i].age,stud_out[i].addr);
	}
	fclose(fp);
}

int main()
{
	int i;
	printf("Please enter data of student:\n");
	for(i=0;i<SIZE;i++)
		scanf("%s%d%d%s",stud_in[i].name,&stud_in[i].num,&stud_in[i].age,stud_in[i].addr);   //从键盘输入数据 
	save();
	
	printf("data of student:\n");
	show();
	return 0;
}

结果:
C程序设计练习_第18张图片

随机读写

#include 
#include 

#define SIZE 10
struct Student_type
{
	char name[10];
	int num;
	int age;
	char addr[15];
}stud[SIZE];

int main()
{
	FILE *fp;
	if((fp = fopen("stud.dat","rb"))==NULL)
	{
		printf("can't open file!\n");
		exit(0);
	}
	for(int i=0;i<SIZE;i+=2)
	{
		fseek(fp,i*sizeof(struct Student_type),0);    //移动读写位置坐标 
		fread(&stud[i],sizeof(struct Student_type),1,fp);
		printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
	}
	fclose(fp);
	return 0;
}

结果:
C程序设计练习_第19张图片

你可能感兴趣的:(C语言,习题集,c语言)