(因为我的能力也不是很强,如果其中有些代码有错的话,也请指出来,如果可以的话,帮我修改一下吧。)
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;
}