【无标题】C语言一些基础代码

 (因为我的能力也不是很强,如果其中有些代码有错的话,也请指出来,如果可以的话,帮我修改一下吧。)

 1.简单的应用gets,puts 

#include<stdio.h>
#include<string.h>
int main()
{
	char a[50];
	printf("请输入不多余50个字符的英文短句:");
	gets(a);
	printf("输出该短句:");
	puts(a);
	return 0;
}

2.简单利用strlen

#include<stdio.h>
#include<string.h>
int main()
{
	char a[80];
	printf("输入一段英文:");
	gets(a);
	printf("字符数:");
	printf("%d\n",strlen(a));
	return 0;
}

3.将两个字符串连接在一起 

#include<stdio.h>
int main()
{
	char s1[80],s2[20];
	int i=0,j=0;
	printf("请输入字符串s1:");
	scanf("%s",s1);
	printf("请输入字符串s2:");
	scanf("%s",s2);
    while(s1[i]!='\0')
		i++;
	while(s2[j]!='\0')
		s1[i++]=s2[j++];
	s1[i]='\0';
	printf("\n新的字符串为:%s\n",s1);
	return 0;
}

4.年龄递归问题

//有5个人,第5个比第4个大2岁,第4个比第3个大2岁,第3个比第2个大2岁,第2个比1个大2岁,第一个10岁,问第5个多少岁
#include<stdio.h>
int main()
{
	int age(int x);
	printf("第5个的岁数:%d\n",age(5));
	return 0;
}
int age(int x)
{
	int i;
	if(x==1)
		i=10;
	else
		i=age(x-1)+2;
	return(i);
}

 5利用数组求平均分和总分

//1.使用双层循坏实现10名学生3门课程的成绩输入
//2.输入10名学生3门功课成绩的总分和平均分
//3.使用双层循坏实现10名学生3门功课成绩的输出
//4.使用循坏输出10名学生的平均分
#include<stdio.h>
int main()
{ 
	float a[10][3];
	float sum[10]={0},ave[10];
	int i,j;
	printf("请输入数据:");
	for(i=0;i<10;i++)
		for(j=0;j<3;j++)
			scanf("%f",&a[i][j]);
    for(i=0;i<10;i++)
	{
		for(j=0;j<3;j++)
			sum[i]=sum[i]+a[i][j];
			ave[i]=sum[i]/3;
	}
	for(i=0;i<10;i++)
	{
	    for(j=0;j<3;j++)
			printf("%f",a[i][j]);
		printf("\n");
	}
    for(i=0;i<10;i++)
	{
			printf("ave[%d]=%.0f\n",i,ave[i]);
	}
    return 0;
}

 6利用二维数组,求一个3*3的整型矩阵对角线元素之和 

#include<stdio.h>
int main()
{ 
	int a[3][3],i,j,sum=0;
	printf("请输入数据:");
	for(i=0;i<3;i++)
		for(j=0;j<3;j++)
			scanf("%d",&a[i][j]);
	for(i=0;i<3;i++)
		sum=sum+a[i][i];
	printf("sum=%d\n",sum);
    return 0;
}

7.有n个数围成一个圈,每次都从1开始数,数到3就把3对应的这个数删去,继续数直到最后就剩1个数,并将该数的位置输出 

#include<stdio.h>
int main()
{
	int num[50],i,k,m,n,*p;
	printf("\n有n个人:n=");
	scanf("%d",&n);
	p=num;
	for(i=0;i<n;i++)
		*(p+i)=i+1;
	i=0;
	k=0;
	m=0;
	while(m<n-1)
	{
		if(*(p+i)!=0)
			k++;
		if(k=3)
		{
			*(p+i)=0;
			k=0;
			m++;
		}
		i++;
		if(i==n)
			i=0;
	}
    while(*p==0)
		p++;
	printf("最后一个数的位置:%d\n",*p);
	return 0;
}

8.求最大公约数和最小公倍数

#include<stdio.h>
int yun(int a,int b)
{
	int r,t;
	if(a<b)
	{
		t=a;
		a=b;
		b=t;
	}
	while((r=a%b)!=0)
	{
		a=b;
		b=r;
	}
	return (b);
}
int bei(int a,int b,int c)
{
	return(a*b/c);
}
int main()
{
	int yun(int a,int b);
	int bei(int a,int b,int c);
    int a,b,c,d;
	printf("请输入两个整数:");
	scanf("%d%d",&a,&b);
	c=yun(a,b);
	d=bei(a,b,c);
	printf("最大公约数:%d,最小公倍数:%d\n",c,d);
	return 0;
}

9.判断是否为素数1

#include<stdio.h>
int main()
{
	int prime(int n);
	int n;
	printf("请输入一个数: ");
	scanf("%d",&n);
	if(prime(n))
		printf("%d是一个素数\n",n);
	else
		printf("%d不是一个素数\n",n);
	return 0;
}
int prime(int n)
{
	int flag=1,i;
	for(i=2;i<=n/2&&flag==1;i++)
		if(n%i==0)
			flag=0;
    return(flag);
}

 判断是否为素数2

#include <stdio.h>
void main()
{
	int prime(int n);
	int n,a=0;
	printf("请输入一个数: ");
	scanf("%d",&n);
	a=prime(n);
}
int prime(int x)
{
	int i;
	for(i=2;i<x;i++)
    {
		if(x%i==0)
			break;
	}
	if(i<x)
		printf("%d不是一个素数\n",x);
	else
		printf("%d是一个素数\n",x);
     return 0;
}

10.利用函数将输入的字符串反序输出

#include<stdio.h>
#include<string.h>
int main()
{
	void inverse(char str[]);
	char str[100];
	printf("请输入字符串:\n");
	scanf("%s",str);
	inverse(str);
	printf("反转后的字符串:%s\n",str);
	return 0;
}
void inverse(char str[])
{
	int i,j,k;
	char t;
	k=strlen(str);
	for(i=0,j=k;i<k/2;i++,j--)
	{
		t=str[i];
		str[i]=str[j-1];
		str[j-1]=t;
	}
}

11.3x3二维数组转置

//数组行列互换
#include<stdio.h>
#define N 3
int arr[N][N];
int main()
{
	void convert(int arr[][3]);
	int i,j;
	//输入数组
	printf("请输入3*3二维数组:\n");
	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
		    scanf("%d",&arr[i][j]);
    //输出原数组
	printf("\n原数组序列:\n");
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		    printf("%5d",arr[i][j]);
		    printf("\n");
	}
	//进行转置
	convert(arr);
	//输出转之后的数组
	printf("转置后的序列\n");
    for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		    printf("%5d",arr[i][j]);
            printf("\n");
	}
	return 0;
}
void convert(int arr[][3])
{
	int t,i,j;
	for(i=0;i<N;i++)
		for(j=i+1;j<N;j++)
		{
			t=arr[i][j];
			arr[i][j]=arr[j][i];
			arr[j][i]=t;
		}
}

12.利用函数比较两个数的大小

#include<stdio.h>
int main()
{
	int max(int x,int y);
	int a,b,c;
	printf("请输入两个整数: ");
	scanf("%d%d",&a,&b);
	c=max(a,b);
	printf("较大值是%d\n",c);
	return 0;
}
int max(int x,int y)
{
	int z;
	z=(x>y?x:y);
	return(z);
}

13.利用函数比较四个数的大小

include<stdio.h>
int main()
{
	int max2(int x,int y);
	int max4(int a,int b,int c,int d);
	int a,b,c,d,k;
	printf("请输入四个整数: ");
	scanf("%d%d%d%d",&a,&b,&c,&d);
	k=max4(a,b,c,d);
	printf("最大值是%d\n",k);
	return 0;
}
int max2(int x,int y)
{
	int z;
	z=(x>y?x:y);
	return(z);
}
int max4(int a,int b,int c,int d)
{
	int max2(int x,int y);
	int i;
	i=max2(a,b);
	i=max2(i,c);
	i=max2(i,d);
	return(i);
}

14.将8个整数按相反的顺序输出

//从键盘输入8个整数保存在数组中,然后按照相反的顺序输出,用指针
#include<stdio.h>
void main()
{
	int a[8],*p=a;
	printf("请输入8个整数:\n");
	for(;p-a<8;)
		scanf("%d",p++);
	for(--p;p>=a;)
		printf("%4d",*p--);
	printf("\n");
}

15.求n的阶乘

#include<stdio.h>
int fact(int n)
{
	if(n==1)
		return 1;
	else
		return(n*fact(n-1));
}
void main()
{
	int n;
	printf("请输入一个整数:");
	scanf("%d",&n);
	printf("%d!=%d\n",n,fact(n));
}

 16.利用指针从大到小输出

//利用指针,输入两个整数,按先大后小的顺序输出
#include<stdio.h>
int main()
{
	/*int a,b;
	int *p1,*p2;
	printf("输入两个正整数:\n");
	scanf("%d%d",&a,&b);
	if(a>b)
	{
		p1=&a;
		p2=&b;
	}
	else
	{
        p1=&b;
		p2=&a;
	}
	printf("max=%d,min=%d\n",*p1,*p2);
	*/
	int a,b;
	int *p1,*p2,*p;
	printf("输入两个正整数:\n");
	scanf("%d%d",&a,&b);
	p1=&a;
	p2=&b;
	if(a<b)
	{
		p=p1;
		p1=p2;
		p2=p;
	}
	printf("max=%d,min=%d\n",*p1,*p2);
	return 0;
}

17.输出最大元素和该元素的位数

/输入10个数要求输出其最大的元素和该书是第几位
#include<stdio.h>
int main()
{
	int max(int x,int y);
	int a[10],m,n,i;
	printf("请输入10个数:\n");
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
    printf("\n");
	for(i=0,m=a[0],n=0;i<10;i++)
	{
		if(max(m,a[i])>m)
		{
			m=max(m,a[i]);
			n=i;
		}
	}
	printf("最大的数%d,在第%d位\n",m,n+1);
	return 0;
}
int max(int x,int y)
{
	return(x>y?x:y);
}

18.利用指针将两字符串合并

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20],str2[20];
	char *p1,*p2;
	printf("请输入字符串:\n");
	gets(str1);
	printf("请再输入字符串:\n");
	gets(str2);
	p1=str1;
	p2=str2;
	while(*p1!='\0')
		p1++;
	while(*p2)
		*p1++=*p2++;
	*p1='\0';
    printf("合并后的字符串:%s\n",str1);
	return 0;
}

 19.利用指针将字符串全部复制

//有两个字符串a和b,通过指针和函数调用,实现将a字符串复制给b字符串
#include<stdio.h>
int main()
{
	char a[]="I am a student",b[20];
	int i;
	for(i=0;*(a+i)!='\0';i++)
		*(b+i)=*(a+i);
    *(b+i)='\0';
	printf("a的字符串为:%s\n",a);
	//printf("b的字符串:%s",b);
	printf("b的字符串为:");
	for(i=0;b[i]!='\0';i++)
		printf("%c",b[i]);
	printf("\n");
	return 0;
}

 20.利用指针和函数,输入三个整数,按从小到大的顺序输出

//利用指针和函数,输入三个整数,按从小到大的顺序输出
#include<stdio.h>
int main()
{
	void swap(int *x,int *y);
	int a,b,c;
	int *p1,*p2,*p3;
	printf("请输入三个整数:\n");
	scanf("%d%d%d",&a,&b,&c);
    p1=&a;
	p2=&b;
	p3=&c;
	if(a>b)
		swap(p1,p2);
	if(a>c)
		swap(p1,p3);
	if(b>c)
		swap(p2,p3);
	printf("现有的顺序: %d %d %d\n",a,b,c);
	return 0;
}
void swap(int *x,int *y)
{
	int z;
	z=*x;
	*x=*y;
	*y=z;
}

21.求两个班的平均成绩

//1.有一个二维数组score,内放10个学生成绩,利用函数求平均成绩
//2.有两个班级,分别有10名学生和5名学生,调用一个average函数,分别求两个班的平均成绩
#include<stdio.h>
int main()
{
	/*float average(float array[]);
	float score[10],aver;
	int i;
	printf("请输入10个学生的成绩\n");
	for(i=0;i<10;i++)
		scanf("%f",&score[i]);
	aver=average(score);
	printf("平均数为%5.2f\n",aver);*/
    float average(float array[],int n);
	float score1[10],score2[5],aver1,aver2;
	int i;
	printf("请输入一班10个学生的成绩\n");
	for(i=0;i<10;i++)
	scanf("%f",&score1[i]);
	printf("请输入二班5个学生的成绩\n");
	for(i=0;i<5;i++)
		scanf("%f",&score2[i]);
	aver1=average(score1,10);
	aver2=average(score2,10);
	printf("一班平均数为%5.2f\n",aver1);
	printf("二班平均数为%5.2f\n",aver2);
	return 0;
}
/*float average(float array[])
{
	float sum=0;
	int i;
	for(i=0;i<10;i++)
		sum+=array[i];
	return(sum/10);
}*/
float average(float array[],int n)
{
	float sum=0;
	int i;
	for(i=0;i<n;i++)
		sum+=array[i];
	return(sum/n);
}

22.利用指针和函排序

//利用指针,输入10个整数,将其中最小的数与第一个数对换,将最大的一个数与最后一个数对换,写入三个函数
//1.输入10个数 void input(int *)
//2.处理函数 void max-min-value(int *)
//3.输出10个数 void output(int *)
#include<stdio.h>
int main()
{
	void input(int *number);
    void max_min_value(int *number);
    void output(int *number);
	int number[10];
	input(number);
    max_min_value(number);
    output(number);
	return 0;
}
void input(int *number)
{
	int i;
	printf("请输入10个整数:\n");
	for(i=0;i<10;i++)
		scanf("%d",&number[i]);
}
void max_min_value(int *number)
{
	int *max,*min,*p,t;
	max=min=number;
	for(p=number+1;p<number+10;p++)
		if(*p>*max)
			max=p;
		else if(*p<*min)
			min=p;
//最小值和第一个数交换位置
	t=number[0];
	number[0]=*min;
	*min=t;
//防止因第一个数为最大值而导致的编译错误
	if(max==number)
		max=min;
//最大值和最后一个数交换位置
	t=number[9];
	number[9]=*max;
	*max=t;
}
void output(int *number)
{
	int *p;
	printf("调整好后的顺序:\n");
	for(p=number;p<number+10;p++)
		printf("%4d\n",*p);
	printf("\n");
}

23.利用指针和函数将后面的数移到前面

//有n个数,使前面各数顺序向后移动m个位置,最后m个数变成最前面的m个位置(使用指针和函数)
//例如  1 2 3 4 5 6 7 8 9 0
//移动2个,就会变成
// 9 0 1 2 3 4 5 6 7 8
#include<stdio.h>
int main()
{
	void move(int arr[20],int n,int m);
	int number[20],n,m,i;
	printf("一共有多少个数:\n");
	scanf("%d",&n);
	printf("%d个数是那些数:\n",n);
	for(i=0;i<n;i++)
		scanf("%d",&number[i]);
	printf("需要移动多少个数:\n");
	scanf("%d",&m);
	move(number,n,m);
	printf("新的数列为:\n");
	for(i=0;i<n;i++)
		printf("%4d",number[i]);
	printf("\n");
	return 0;
}
//也可以将输入数据用函数表示
/*void input(int arr[20],int n,int m)
{
	int i;
	printf("一共有多少个数:\n");
	scanf("%d",&n);
	printf("%d个数是那些数:\n",n);
	for(i=0;i<n;i++)
		scanf("%d",&arr[i]);
	printf("需要移动多少个数:\n");
	scanf("%d",&m);
}
*/
void move(int arr[20],int n,int m)
{
	int *p,arr_end;
	arr_end=*(arr+n-1);
	for(p=arr+n-1;p>arr;p--)
		*p=*(p-1);
	*arr=arr_end;
	m--;
    if(m>0)
		move(arr,n,m);
}

 24.利用指针和函数,输入3个字符串,按从小到大输出

//利用指针和函数,输入3个字符串,按从小到大输出
#include<stdio.h>
#include<string.h>
int main()
{
	void swap(char *x,char *y);
	char str1[20],str2[20],str3[20];
	printf("请输入3个字符串:\n");
	gets(str1);
	gets(str2);
	gets(str3);
    if(strcmp(str1,str2)>0)
		swap(str1,str2);
	if(strcmp(str1,str3)>0)
		swap(str1,str3); 
	if(strcmp(str2,str3)>0)
		swap(str2,str3);
	printf("调整好后的:\n");
	printf("%s\n%s\n%s\n",str1,str2,str3);
	return 0;
}
void swap(char *x,char *y)
{
	char z[20];
	strcpy(z,x);
	strcpy(x,y);
	strcpy(y,z);

}

25.利用指针和函数求字符串的长度

#include<stdio.h>
int main()
{
    int length(char *pointer);
	char str[40];
	int len;
	printf("请输入字符串:\n");
	scanf("%s",str);
    len=length(str);
	printf("一共有%d个字符\n",len);
	return 0;
}
int length(char *pointer)
{
	int i;
	i=0;
	while(*pointer!='\0')
	{
		pointer++;
		i++;
	}
	return (i);
}

26.利用指针和函数将字符串部分复制

//有一字符串,包含n个字符,写一函数,将此字符串从第m个字符开始的全部字符复制成为另一个字符串
#include<stdio.h>
#include<string.h>
int main()
{
	void copystr(char *p1,char *p2,int m);
	char str1[20],str2[20];
	int m,len;
	printf("请输入字符串:\n");
	gets(str1);
	printf("从第几个开始复制:\n");
	scanf("%d",&m);
	len=strlen(str1);
	if(len<m)
		printf("输入数据有误\n");
	else
	{
		copystr(str1,str2,m);
		printf("最终结果:%s\n",str2);
	}
	return 0;
}
void copystr(char *p1,char *p2,int m)
{
	int n;
	n=0;
	while(n<m-1)
	{
		n++;
		*p1++;
	}
	while(*p1!='\0')
	{
		*p2=*p1;
        p1++;
		p2++;
	}
	*p2='\0';
}

27.利用指针,写一个函数,将一个3*3的整型矩阵转置

//利用指针,写一个函数,将一个3*3的整型矩阵转置
#include<stdio.h>
int main()
{
	void move(int *pointer);
	int a[3][3],*p,i;
    printf("请输入3*3整型矩阵:\n");
	for(i=0;i<3;i++)
		scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
    p=&a[0][0];
	move(p);
	printf("转置后:\n");
	for(i=0;i<3;i++)
		printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
	return 0;
}
void move(int *pointer)
{
	int i,j,t;
	for(i=0;i<3;i++)
		for(j=i;j<3;j++)
		{
			t=*(pointer+3*i+j);
			*(pointer+3*i+j)=*(pointer+3*j+i);
			*(pointer+3*j+i)=t;
		}

}

29. 利用指针和函数输入学号输出成绩1

//有a个学生,每个学生有b门课程的成绩,要求在用户输入学生的序号之后,能输出该学生的全部成绩,用指针和函数实现
//这里学生和成绩作为已知量,可以放在开始进行初始化操作,这里的a和b可以自行指定
#include<stdio.h>
int main()
{
	float *search(float(*pointer)[4],int n);
	float a[][4]={{60,70,80,90},{56,67,78,89},{77,66,88,99}};
	int i,k;
	float *p;
	printf("请输入你要找的学生的学号:\n");
	scanf("%d",&k);
	printf("学号为%d的学生的成绩:\n");
	p=search(a,k);
	for(i=0;i<4;i++)
		printf("%5.2f\t",*(p+i));
	printf("\n");
	return 0;
}
float *search(float(*pointer)[4],int n)
{
	float *pt;
	pt=*(pointer+n);
	return (pt);
}

30.利用指针和函数输入学号输出成绩2

//有a个学生,每个学生有b门功课的成绩,找出其中有不及格的课程的学生及其学生号
#include<stdio.h>
int main()
{
    float *search(float(*pointer)[4]);
	float a[][4]={{60,70,80,90},{56,67,78,89},{77,66,88,99}};
	int i,j;
	float *p;
	for(i=0;i<3;i++)
	{
		p=search(a+i);
		if(p==*(a+i))
		{
			printf("第%d个学生的成绩\n",i);
			for(j=0;j<4;j++)
				printf("%5.2f\t",*(p+j));
			printf("\n");
		}
	}
	return 0;
}
float *search(float(*pointer)[4])
{
	float *pt;
	int i=0;
	//空指针
	pt=NULL;
	for(;i<4;i++)
		if(*(*pointer+i)<60)
			pt=*pointer;
	return (pt);
}

 31.利用数组和指针对5*5数组重新排序

//将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放,意思是左上角放最小值,
//右上角放第二小值,左下角放第三小值,右下角放第四小值)利用指针和函数,用main函数调用
#include<stdio.h>
int main()
{
	void change(int *p);
    int a[5][5],*p,i,j;
	printf("请输入5*5整形矩阵:\n");
	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
			scanf("%d",&a[i][j]);
	p=&a[0][0];
	change(p);
	printf("排完后的:\n");
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
			printf("%4d",a[i][j]);
		printf("\n");
	}
	return 0;
}
void change(int *p)
{
	int *pmax,*pmin;
	int i,j,temp;
	pmax=p;
	pmin=p;
	//最大值最小值
	for(i=0;i<5;i++)
		for(j=i;j<5;j++)
		{
			if(*pmax<*(p+5*i+j))
				pmax=p+5*i+j;
			if(*pmin>*(p+5*i+j))
				pmin=p+5*i+j;
		}
//将最大值和中心位交换
	temp=*(p+12);
	*(p+12)=*pmax;
	*pmax=temp;
//将最小值和左上角交换
	temp=*p;
	*p=*pmin;
	*pmin=temp;	
//将第二小的值和右上角交换
	pmin=p+1;
	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
			if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))
				pmin=p+5*i+j;
	temp=*pmin;
    *pmin=*(p+4);
    *(p+4)=temp;
//将第三的值和左下角交换
	pmin=p+1;
	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
			if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&(*pmin>*(p+5*i+j)))
				pmin=p+5*i+j;
	temp=*pmin;
    *pmin=*(p+20);
    *(p+20)=temp;
//将第四的值和右下角交换
	pmin=p+1;
	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
			if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20))&&(*pmin>*(p+5*i+j)))
				pmin=p+5*i+j;
	temp=*pmin;
    *pmin=*(p+24);
    *(p+24)=temp;
}

32.汉罗塔文题

//有A,B,C三根圆柱,A柱上有若干个按照下大上小顺序垒起来的盘子,要把盘子按照下大上小的顺序,借助B柱,最终全部移到C柱。
//1.将A上n-1个借助C移动到B
//2.将A上剩下的一个C
//3.将n-1个从B借助A全部移动到C
//4.总的来说是将one座n-1个盘移动到two(借助three)
#include<stdio.h>
int main()
{
	void move(char x,char y);
	void hanoi(int n,char one,char two,char three);
	int m;
	printf("请输入盘子数: ");
	scanf("%d",&m);
	printf("%d盘子移动顺序:\n",m);
	hanoi(m,'A','B','C');
	return 0;
}
void hanoi(int n,char one,char two,char three)
{
	void move(char x,char y);
	if(n==1)
		move(one,three);
	else
	{
		hanoi(n-1,one,three,two);
		move(one,three);
		hanoi(n-1,two,one,three);
	}
}
void move(char x,char y)
{
	printf("%c--->%c\n",x,y);
}

33.利用数组指针的超长代码

//有一个班4个学生,5门功课
//1.求第1门功课的平均分;
//2.找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩
//3.找出平均成绩在90分以上或全部课程成绩在85分以上的学生
//分别编写三个函数实现以上3个要求
#include<stdio.h>
int main()
{
	void avsco(float *pscore,float *paver);
	void avcour1(char(*pcourse)[10],float *pscore);
	void fali2(char course[5][10],int num[],float *pscore,float aver[4]);
	void good(char course[5][10],int num[4],float *pscore,float aver[4]);
	int i,j,*pnum,num[4];
	float score[4][5],aver[4],*pscore,*paver;
	char course[5][10],(*pcourse)[10];
	printf("请输入科目:\n");
	pcourse=course;
	for(i=0;i<5;i++)
		scanf("%s",course[i]);
	printf("请输入学号和成绩:\n");
	printf("NO.");
	for(i=0;i<5;i++)
		printf(",%s",course[i]);
	printf("\n");
	pscore=&score[0][0];
	pnum=&num[0];
	for(i=0;i<4;i++)
	{
		scanf("%4d",pnum+i);
		for(j=0;j<5;j++)
			scanf("%4f",pscore+5*i+j);
	}
    paver=&aver[0];
	printf("\n\n");
	avsco(pscore,paver);
    avcour1(pcourse,pscore);
    printf("\n\n");
    fali2(pcourse,pnum,pscore,paver);
	printf("\n\n");
    good(pcourse,pnum,pscore,paver);
    return 0;
}
//求平均数
void avsco(float *pscore,float *paver)
{
	int i,j;
	float sum,average;
	for(i=0;i<4;i++)
	{
		sum=0.0;
		for(j=0;j<5;j++)
			sum=sum+(*(pscore+5*i+j));
		average=sum/5;
		*(paver+i)=average;
	}
}
//求第一门功课的成绩
void avcour1(char(*pcourse)[10],float *pscore) 
{
	int i;
	float sum,average1;
	sum=0.0;
	for(i=0;i<4;i++)
		sum=sum+(*(pscore+5*i));
	average1=sum/4;
	printf("课程%s平均分为%7.2f\n",*pcourse,average1);
}
//求不及格科目在两门及两门以上的学生
void fali2(char course[5][10],int num[],float *pscore,float aver[4])
{
	int i,j,k,label;
	printf("==============不及格科目在两门及以上的学生==============\n");
	printf("NO.");
	for(i=0;i<5;i++)
		printf("%11s",course[i]);
	printf("       average\n");
	for(i=0;i<4;i++)
	{
		label=0;
		for(j=0;j<5;j++)
			if(*(pscore+5*i+j)<60.0)
				label++;
			if(label>=2)
			{
				printf("%d",num[i]);
				for(k=0;k<5;k++)
					printf("%11.2f",*(pscore+5*i+k));
				printf("%11.2f\n",aver[i]);
			}
	}
}
//找平均分在90分以上或者所有成绩在85分以上
void good(char course[5][10],int num[4],float *pscore,float aver[4])
{	
	int i,j,k,n;
	printf("==============成绩优秀的学生情况==============\n");
	printf("NO.");
	for(i=0;i<5;i++)
		printf("%11s",course[i]);
	printf("       average\n");
	for(i=0;i<4;i++)
	{
		n=0;
		for(j=0;j<5;j++)
			if(*(pscore+5*i+j)>85.0)
				n++;
			if((n==5)||(aver[i]>90))
			{			
				printf("%d",num[i]);
				for(k=0;k<5;k++)
					printf("%11.2f",*(pscore+5*i+k));
				printf("%11.2f\n",aver[i]);
			}
	}
}

34.结构体变量做一个简易的投票机制

#include<string.h>
struct people
{
	char name[20];
	int count;
}leader[3]={{"li",0},{"zhang",0},{"huang",0}};
int main()
{
	int i,j;
	char leader_name[20];
	for(i=0;i<10;i++)
	{
		printf("你要投谁 li zhang huang\n");
		scanf("%s",leader_name);
		for(j=0;j<3;j++)
			if(strcmp(leader_name,leader[j].name)==0)
				leader[j].count++;
	}
	printf("最终结果\n");
	for(i=0;i<3;i++)
		printf("%5s:%d\n",leader[i].name,leader[i].count);
	return 0;
}

 35.结构体变量输入输出学生数据

//编写一个函数,输出一个学生的成绩数组,该数组中有五个学生的数据记录,
//每个记录包括num,nanme,score[3],用input函数输入,print输出
#include<stdio.h>
#define N 5
struct student
{
	char num[4];
	char name[8];
	int score[4];
}stu[N];
int main()
{
	void input(struct student stu[6]);
	void print(struct student stu[6]);
    input(stu);
	print(stu);
	return 0;
}
void input(struct student stu[6])
{
	int i,j;
	for(i=0;i<N;i++)
	{
		printf("请输入第%d位学生的成绩:\n",i+1);
		printf("NO.  ");
		scanf("%s",stu[i].num);
		printf("name.   ");
		scanf("%s",stu[i].name);
		for(j=0;j<3;j++)
		{
			printf("score.%d   ",j+1);
			scanf("%d",&stu[i].score[j]);
		}
		printf("\n");
	}
}
void print(struct student stu[6])
{
	int i,j;
	printf("\n NO.    name         score.1       score.2       score.3\n");
	for(i=0;i<N;i++)
	{
		printf("%5s%10s",stu[i].num,stu[i].name);
		for(j=0;j<3;j++)
			printf("%10d",stu[i].score[j]);
		printf("\n");
	}
}

36.利用结构体和函数计算某日是该年第几天(方法一)

//写一个函数days,实现(定义一个结构体变量(包括年、月、日)。计算该日在本年中第几年,注意闰年问题),由主函数将年月日传递给days函数
#include<stdio.h>
struct
{
	int year;
	int month;
	int day;
}date;
int main()
{
    int days();
	int n;
    printf("输入年 月 日\n");
	scanf("%d %d %d",&date.year,&date.month,&date.day);
	n=days();
	printf("该日是本年第%d天\n",n);
	return 0;
}
//date是全局变量,不用传给函数
int days()
{
	int m,i;
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	m=0;
	if((date.year%4==0&&date.year%100!=0)||(date.year%400==0))
	{
		for(i=0;i<date.month-1;i++)
			m=m+b[i];
	}
	else
	{
		for(i=0;i<date.month-1;i++)
			m=m+a[i];
	}
	m=m+date.day;
	return (m);
}

 不用函数

//定义一个结构体变量(包括年、月、日)。计算该日在本年中第几年,注意闰年问题
#include<stdio.h>
struct
{
	int year;
	int month;
	int day;
}date;
int main()
{
	//方法一
/*	int days,i;
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	days=0;
    printf("输入年 月 日\n");
	scanf("%d %d %d",&date.year,&date.month,&date.day);
	if((date.year%4==0&&date.year%100!=0)||(date.year%400==0))
	{
		for(i=0;i<date.month-1;i++)
			days=days+b[i];
	}
	else
	{
		for(i=0;i<date.month-1;i++)
			days=days+a[i];
	}
	days=days+date.day;
	printf("该日是本年第%d天\n",days);
	return 0;
	*/
	int days;
	printf("输入年 月 日\n");
	scanf("%d %d %d",&date.year,&date.month,&date.day);
	switch(date.month)
	{
	case 1:days=date.day;
		break;
	case 2:days=date.day+31;
		break;
	case 3:days=date.day+59;
		break;
	case 4:days=date.day+90;
		break;
	case 5:days=date.day+120;
		break;
	case 6:days=date.day+151;
		break;
	case 7:days=date.day+181;
		break;
	case 8:days=date.day+212;
		break;
	case 9:days=date.day+243;
		break;
	case 10:days=date.day+273;
		break;
	case 11:days=date.day+304;
		break;
	case 12:days=date.day+334;
		break;
	}
	if(((date.year%4==0&&date.year%100!=0)||(date.year%400==0))&&(date.month>=3))
		days+=1;
	printf("该日是本年第%d天\n",days);
	return 0;
}

37.结构体指针输出学生信息

//有三个学生的成绩,放在结构体数组中,要求输出全部学生的信息,利用结构体数组的指针
#include<stdio.h>
struct student
{
	int num;
	char name[8];
	char sex;
	int age;
};
struct student stu[3]={{101,"xu",'M',18},{102,"zhang",'F',20},{103,"huang",'M',19}};
int main()
{
	struct student *p;
	printf("  No.      name.    sex.   age.    \n");
	for(p=stu;p<stu+3;p++)
		printf("%5d%10s%6c%8d\n",p->num,p->name,p->sex,p->age);
	return 0;
}

38. 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以“!”结束

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	FILE *fp;
	char str[100];
	int i;
	i=0;
	if((fp=fopen("text","w"))==NULL)
	{
		printf("打不开文件\n");
		exit(0);
	}
	printf("请输入一串字符串\n");
	gets(str);
	while(str[i]!='!')
	{
		if(str[i]>='a'&&str[i]<='z')
			str[i]=str[i]-32;
		fputc(str[i],fp);
		i++;
	}
	fclose(fp);
	fp=fopen("text","r");
	fgets(str,strlen(str)+1,fp);
	printf("%s\n",str);
	fclose(fp);
	return 0;
}

39. 有两个磁盘文件"A"和"B",各存放一行字母,今要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件"C"中

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	FILE *fp;
	int i,i1,n,j;
	char c[100],ch,t;
	if((fp=fopen("A","r"))==NULL)
	{
		printf("\n无法打开文件\n");
		exit(0);
	}
	printf("文件A:\n");
	for(i=0;(ch=fgetc(fp))!=EOF;i++)
	{
		c[i]=ch;
		putchar(c[i]);
	}
	fclose(fp);
	i1=i;
	if((fp=fopen("B","r"))==NULL)
	{
		printf("\n无法打开文件\n");
		exit(0);
	}
	printf("文件B:\n");
	for(i=0;(ch=fgetc(fp))!=EOF;i++)
	{
		c[i]=ch;
		putchar(c[i]);
	}
	fclose(fp);
	n=i;
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			if(c[i]>c[j])
			{
				t=c[i];
				c[i]=c[j];
				c[j]=t;
			}
	printf("文件C:\n");
	fp=fopen("C","w");
	for(i=0;i<n;i++)
	{
		putc(c[i],fp);
		putchar(c[i]);
	}
	printf("\n");
	fclose(fp);
	return 0;
}

40.有5位学生,每个学生有3门功课,从键盘上输入学生数据(包括学号,姓名,3门功课成绩)计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中

#include<stdio.h>
#include<stdlib.h>
struct student
{
	char num[10];
	char name[8];
	int score[3];
	float ave;
}stu[5];
int main()
{
	int i,j,sum;
	FILE *fp;
	for(i=0;i<5;i++)
	{
		printf("\n请输入第%d个学生的成绩\n",i+1);
		printf("NO.");
		scanf("%s",stu[i].num);
		printf("name.");
		scanf("%s",stu[i].name);
		sum=0;
		for(j=0;j<3;j++)
		{
			printf("score %d:",j+1);
			scanf("%d",&stu[i].score[j]);
			sum+=stu[i].score[j];
		}
		stu[i].ave=sum/3.0;
	}
	fp=fopen("stud","w");
	for(i=0;i<5;i++)
		if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
			printf("文件写入错误\n");
    fclose(fp);
	fp=fopen("stud","r");
	for(i=0;i<5;i++)
	{
		fread(&stu[i],sizeof(struct student),1,fp);
		printf("\n%s,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
	}
	fclose(fp);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值