C语言部分练习题

it2025-11-16  13

1.数学类问题 (1)求根 (1.1)普通 int main() { int a,b,c,delta; printf(“input three numbers:”); scanf("%d%d%d",&a,&b,&c); float x1,x2,r; delta=bb-4ac; r=sqrt(delta); if(delta>=0){ x1=(-b+r)/(2a); x2=(-b-r)/(2*a); if(x1==x2) printf(“x1=x2=%f\n”,x1); else{ printf(“x1=%f\n”,x1); printf(“x2=%f\n”,x2); } } else printf(“无实数根!”); } (1.2)函数调用 #include<stdio.h> #include<math.h> #include<string.h>

#define N 4 #define M 5 #define delta bb-4a*c

double x1,x2;

void unequal(float a,float b,float c){ x1=(-b+sqrt(delta))/(2a); x2=(-b-sqrt(delta))/(2a); printf(“x1=%f,x2=%f”,x1,x2); }

void equal(float a,float b,float c){ x1=x2=(-b)/(2*a); printf(“x1=%f=x2=%f”,x1,x2); }

void zero(float a,float b,float c){ printf(“无实数根!”); }

int main(){ float a,b,c; printf(“input a,b,c:”); scanf("%f%f%f",&a,&b,&c); if(delta>0) unequal(a,b,c); else if(delta==0) equal(a,b,c); else zero(a,b,c); }

(2)三角形相关问题 (2.1)求面积 int main(){ int a,b,c,s,area; printf(“input three datas:”); scanf("%d%d%d",&a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)(s-b)(s-c)); printf(“a=%d,b=%d,c=%d,s=%d\n”,a,b,c,s); printf(“area=%d\n”,area); } (2.2)判断三角形 int main(){ float a,b,c,s,area; printf(“请输入您想判断的三角形的三条边:”); scanf("%f%f%f",&a,&b,&c); if(a+b>c && a+c>b && b+c>a) //任意两边之和大于第三边 { if(ab && ac) printf(“此三角形是等边三角形\n”); else if(ab ||ac || bc) printf(“此三角形是等腰三角形\n”); else if(aa+bbcc || aa+cc==bb || bb+cc==aa) printf(“此三角形是直角三角形\n”); else printf(“此三角形为普通三角形\n”); s=(a+b+c)/2; area=sqrt(s(s-a)(s-b)(s-c)); printf(“此三角形的面积为:%f\n”,area); } else printf(“此三边构不成三角形!!!\n”); }

(3)圆相关问题 int main(){ float r,h,l,s,v; printf(“请输入半径r,圆柱高h\n”); scanf("%f%f",&r,&h); l=23.14r;//计算周长 s=3.14rr;//计算圆面积 //v=3.0/4.0PIrrr;//计算圆体积 v=3.14rr*h;//计算圆柱体体积 printf(“圆周长为:l=%f\n”,l); printf(“圆面积为:s=%f\n”,s); //printf(“圆体积为: v1=%6.2f\n”,v1); printf(“圆柱体积为:v=%f\n”,v); }

(4)素数 (4.1)普通 int m,i,k; scanf("%d",&m); k=sqrt(m); for(i=2;i<=k;++i) if(m%i0) break; if(i>=k+1) printf("%d is a prime number\n",m); else printf("%d is not a prime number\ny",m); (4.2)100-200素数 int m,i,k,n=0; for(m=101;m<=200;m=m+2) { k=sqrt(m); for(i=2;i<=k;++i) if(m%i0) break; if(i>=k+1) { printf("%d\n",m); n=n+1; } if(n%n0) printf("\n"); } printf("\n"); (4.3)函数调用 int isprime(int a){ int i,k=sqrt(a); for(i=2;i<=k;i++) if(a%i0) return 0; return 1; }

int main(){ for(int m=2;m<=100;m++) if(isprime(m)) printf("%d",m); } (4.4)求素数之和 int isprime(int x){ int i; for(i=2;i<=x/2;i++) if(x%i==0) return 0; return 1; }

int main() { int i,a[10],p=a,sum=0; printf(“Enter 10 num:\n”); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) if(isprime((p+i))1){ printf("%d",(a+i)); sum+=(a+i); } printf("\nsum=%d\n",sum); } (4.5)统计素数个数 int countPrime(int n,int a[]){ int i,j,k=0; for(i=n;i>1;i–) { for(j=2;j<i;j++) if(i%j0) break; else continue; if(j>=i) a[k++]=i; } return k; }

int main() { int i,n,count; int a[100]; printf(“input a data:”); scanf("%d",&n); count=countPrime(n,a); for(i=0;i<count;i++) printf("%d\n",a[i]);//打印素数 printf("\ncount=%d\n",count);//打印统计个数 }

(5)最大公约数 (5.1)普通 int p,r,m,n,temp; printf(“请输入两个整数:”); scanf("%d%d",&m,&n); if(n<m){ temp=n; n=m; m=temp; } p=nm; while(m!=0){ r=n%m; n=m; m=r; } printf(“最大公约数%d\n”,n); printf(“最小公倍数%d\n”,p); (5.2)函数 void main(void) { int maxgy(int x,int y); int mingb(int x,int y); int a,b; printf(“输入两个整数:\n”); scanf("%d%d",&a,&b); printf(“最大公约数为:%d\n”,maxgy(a,b)); printf(“最小公倍数为:%d\n”,mingb(a,b)); } int maxgy(int x,int y) { int z; while(y!=0) { z=x%y; x=y; y=z; } return x; } int mingb(int x,int y) { int z; z=xy/maxgy(x,y); return z; }

(6)统计不同原理 (6.1)统计组成不同的数 int main() { int i,j,k,count=0; for(i=1;i<=9;i++){ for(j=0;j<=9;j++){ if(i==j) continue; else{ for(k=0;k<=9;k++) if(k!=i&&k!=j) count++; } } } printf("%d\n",count); } (6.2)乒乓球选对手 char i,j,k;//i为a对手 j为b对手 k为c对手 for(i=‘x’;i<=‘z’;i++) for(j=‘x’;j<=‘z’;j++) if(i!=j) for(k=‘x’;k<=‘z’;k++) if(i!=k&&j!=k) if(i!=‘x’&&k!=‘x’&&k!=‘z’) printf(“A %c\nB %c\nC %c\n”,i,j,k);

(7)二分求幂

2.求和一类问题 (1)求PI/4 float t=1.0,pi=0,s=1,n=1; while(fabs(t)>1e-6){ pi=pi+t; n=n+2; s=-s; t=s/n; } pi=pi*4; printf(“pi=%f\n”, pi);

(2)阶乘相关 (2.1)求平方的阶乘 //1.求平方 //2.调用第二个函数求阶乘(传递参数) //3.返回主函数 int quare(int x){ int temp; temp=xx; int multi(int y); int result; result=multi(temp); return result; } //1.接受参数 int multi(int y){ int c=1; int i; for(i=1;i<=y;i++) c=ci; return c; }

int main(){ int i; int s=0; for(i=2;i<=3;i++) s=s+quare(i);//因为是2与3的阶乘 printf("\ns=%d\n",s); } (2.2)合并版 int quare(int x){ int temp; temp=xx; int i,result=1; for(i=1;i<=temp;i++) result=resulti; return result; }

int main(){ int i; int s=0; for(i=2;i<=3;i++) s=s+quare(i); printf("\ns=%d\n",s); } (2.3)求阶乘分之一的和 double fun(int n){ double s=0.0,fac=1.0; int i; for(i=1;i<=n;i++){ fac=fac/(fac*i); s=s+fac; } return s; }

int main(){ printf(“s=%lf”,fun(5)); }

(3)1-0.5+0.3-0.25 (3.1)while循环 int i=1; double a=1.0,b=2.0,sum; while(b<=100) { i=-i; sum=i/b; a=a+sum; b=b+1; } printf("%f\n",a); (3.2)for循环 double flag=1,sum=1,i,temp; for(i=2;i<101;i++) { flag=-flag; temp=flag/i; sum=temp+sum; } printf("%f\n",sum);

(4)求出1-12奇数的乘积 int i,s=1; for(i=1;i<12;i++) { if(i%2!=0) s=s*i;//取模(余数),不为零i为奇数不能被整除,否则能被整除为偶数 else continue; //结束本次执行下次 } printf("%d\n",s);

(5)求n个和:a+aa+aaa+…+n个a int main(){ int a,n,i,temp,sum=0; printf(“input a n:”); scanf("%d%d",&a,&n); printf("\na=%d n=%d\n",a,n); temp=a;//第一位放到外面 for(i=1;i<=n;i++){ sum=sum+a; a=a*10+temp; } printf(“sum=%d\n”,sum); }

(6)求分子分母间有和的关系 int n; double i=2,j=1,k,s=0.0; for(n=1;n<=20;n++) { s=s+i/j;//i当分子,j当分母 k=i;//存在一个临时变量 i=i+j;//下一个的分子 j=k;//下一个的分母 } printf(“sum is %f\n”,s);

(7)求每个位数之和 int s=0; num=abs(num); do{ s+=num%10; num/=10; }while(num);

(8)输出数字之积大于数字之和 int main() { int n,multi,sum,m; for(n=10;n<=99;n++){ multi=1; sum=0; m=n; while(m>0){ multi*=m%10; sum+=m%10; m=m/10; } if(multi>sum) printf("%d\n",n); } }

3.排序与插入 (1)排序 (1.1)普通逆序 int i,temp,a[N]; printf(“input data:”); for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<N;i++) printf("%d",a[i]); for(i=0;i<N/2;i++) { temp=a[i]; a[i]=a[N-1-i]; a[N-1-i]=temp; } printf("\n"); for(i=0;i<N;i++) printf("%d",a[i]); (1.2)冒泡排序 (1.2.1) int i,j,t,a[10]; printf(“input 10 numbers:”); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<9;i++) //for(i=0;i<n;i++) for(j=0;j<n-i-1;j++) 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; } for(i=1;i<=10;i++) printf("%d",a[i]); (1.2.2) int main(){ int n,i,j,temp; int buf[100]; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++) scanf("%d",&buf[i]); for(i=0;i<n;i++){ for(j=0;j<n-1-i;j++){ if(buf[j]>buf[j+1]){ temp=buf[j]; buf[j]=buf[j+1]; buf[j+1]=temp; } } } for(i=0;i<n;i++) printf("%d",buf[i]); } } (1.3)字符气泡排序 void sort(char str[]){ int i,j; char t; for(i=N-1;i>0;i–){ for(j=0;j<i;j++){ if(str[j]>str[j+1]){ t=str[j]; str[j]=str[j+1]; str[j+1]=t; } } for (j=0;j<N;j++) printf("%c",str[j]); } }

int main(){ char string[N]; printf(“please input a string:”); gets(string); sort(string); } (1.4)选择排序 int i,j,k,temp,a[10]; printf(“input 10 numbers:”); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++){ //for(i=0;i<len-1;i++) 一共要拿len-1个数出来和其他数比 k=i; //让k记住这个数 for(j=i+1;j<10;j++) //for(j=i+1;j<len;j++) 让k这个数和其他未排序的数比 if(a[k]>a[j]) k=j; if(k!=i){ t=a[i]; a[i]=a[k]; a[k]=t; } } printf(“sorted:\n”); for(i=0;i<10;i++) printf("%d",a[i]);

/*for(i=0;i<len-1;i++)//一共要拿len-1个数出来和其他数比 { k=i;//让k记住这个数 for(j=i+1;j<len;j++)//让k这个数和其他未排序的数比 if(a[k]>a[j]) { t = a[k]; a[k] = a[j]; a[j] = t;

} }*/

(1.5)插入排序 int insertSort(int a[],int len){ int i,j,temp; for(i=1;i<len;i++){ temp=a[i]; for(j=i-1;j>=0&&a[j]>temp;j–) a[j+1] = a[j]; a[j+1]=temp; } }

int main(){ int a[5]={5,3,8,6,4},i; insertSort(a,5); for(i=0;i<5;i++) printf("%d “,a[i]); } (1.6)快排 (1.6.1)类似快排插入 int i=0,n; int ins_value,ori_data[20],res_data[20]; printf(“input place :”); scanf(”%d",&n); printf(“input data:”); for(i=0;i<n;i++) scanf("%d",&ori_data[i]); printf(“insert value:”); scanf("%d",&ins_value); while(ins_value>ori_data[i]&&i<n){ res_data[i]=ori_data[i]; i++; } res_data[i]=ins_value; for(i=i+1;i<n+1;i++) res_data[i]=ori_data[i+1]; puts("\n"); for(i=0;i<n+1;i++){ printf("%d",res_data[i]); if((i+1)%5==0) puts("\n"); } (1.6.2)快排 int quickSort(int a[],int low,int high){ int pos; if(low<high){ pos = findPos(a,low,high); quickSort(a,low,pos-1); quickSort(a,pos+1,high); } }

int findPos(int a[],int low,int high){ int value=a[low]; while(low<high){ //(low<high)这个条件不能少 while(low<high && a[high]>=value) high–; a[low] = a[high]; while(low<high && a[low]<=value) low++; a[high] = a[low]; } a[high]=value; return high; }

int main(){ int a[5]={5,3,8,6,4},i; quickSort(a,0,4); for(i=0;i<5;i++) printf("%d ",a[i]); } (1.7)利用指针排序 (1.7.1) sort(int x[],int n){ int temp,i,j,k; for(i=0;i<n-1;i++){ k=i; for(j=i+1;j<n;j++) if(x[j]>x[k]) k=j; if(k!=i){ temp=x[i]; x[i]=x[k]; x[k]=temp; } } }

int main(){ int a[10],i,*p; p=a; printf(“input original data:”); for(i=0;i<10;i++) scanf("%d",p++); p=a; sort(a,10); printf(“sort array:”); for(p=a,i=0;i<10;i++) { printf("%d",*p); p++; } } (1.7.2)指针逆序 int main() { void sort(char *p,int m); int i,n; char *p,num[20]; printf(“input n:”); scanf("%d",&n); printf(“please input these numbers:”); for(i=0;i<n;i++) scanf("%d",&num[i]); p=&num[0]; sort(p,n); printf(“now is”); for(i=0;i<n;i++) printf("%d “,num[i]); printf(”\n"); return 0; } void sort(char *p,int m) { int i; char temp,*p1,*p2; for(i=0;i<m/2;i++) { p1=p+i; p2=p+(m-1-i); temp=*p1; *p1=*p2; *p2=temp; } } (1.8)堆排序 void swap(int *a,int *b) { int temp = *a; *a = b; b = temp; } void percdown(int a[],int node,int len) { int i; int temp = a[node]; for(i=2node;i<=len;i=2) { if(i<len&&a[i]<a[i+1])//两个孩子相比较 i++;//i指向最大的孩子 if(a[i]>temp)//最大的孩子和双亲进行比较 { a[node] = a[i];//让最大的孩子的值赋值给双亲结点 node = i;//node就指向换数的那个孩子 /这两句最难理解,但是又很好理解其实就是一个换数的过程/ } } a[node] = temp; } void heap_sort(int *a,int len) { int i; for(i=len/2;i>0;i–)//len/2:最后一个双亲结点 从下往上,从右往左 percdown(a,i,len);//len:当前堆里的元素个数 for(i=len;i>1;i–) { swap(&a[1],&a[i]); percdown(a,1,i-1); }

} int main() { int a[5] = {5,3,8,6,4}; heap_sort(a,5); int i; for(i=0;i<5;i++) printf("%d ",a[i]); return 0; }

(2)插入 int a[6]={2,8,6,9,5,1}; int i,temp,x; printf(“input data:”); scanf("%d",&x); for(i=0;i<6;i++){ if(x<a[i]){ temp=a[i]; a[i]=x; x=temp; } printf("%3d",a[i]); } printf("%3d",x);

(3)完整:逆序+插入 //逆序排序 int i,j,p,q,s,n,a[11]; printf(“input 10 numbers:”); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++){ p=i; q=a[i]; for(j=i+1;j<10;j++) if(q<a[j]){p=j;q=a[j];} if(p!=i){ s=a[i]; a[i]=a[p]; a[p]=s; } printf("%d",a[i]); } //逆序插入到合适位置 printf("\ninput number:\n"); scanf("%d",&n); for(i=0;i<10;i++) if(n>a[i]){ for(s=9;s>=i;s–) a[s+1]=a[s]; break; } a[i]=n; for(i=0;i<=10;i++) printf("%d",a[i]); printf("\n");

(4)查找 int main(){ int i,n; int buf[100]; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++) scanf("%d",&buf[i]); int x,ans=-1; //下标找不到答案初始为-1 scanf("%d",&x); for(i=0;i<n;i++) { if(x==buf[i]){ ans=i; break; } } printf("%d",ans); } }

4.平均分 (1.1)一维数组简单平均分 int i,j,s=0,a[5][3],average,v[3]; printf(“input scores:”); for(i=0;i<3;i++) { for(j=0;j<5;j++){ scanf("%d",&a[j][i]); s=s+a[j][i];} v[i]=s/5; s=0;//设置重新为0的标志 } average=(v[0]+v[1]+v[2])/3; printf(“math:%d\nc languag:%d\ndbase:%d\n”,v[0],v[1],v[2]); printf(“total:%d\n”, average ); (1.2) float aver(float a[5]){ int i; float ave,s=a[0]; for(i=1;i<5;i++) s=s+a[i]; ave=s/5; return ave; }

int main(){ float average,scores[5]; int i; printf("\ninput 5 scores:\n"); for(i=0;i<5;i++) scanf("%f",&scores[i]); average=aver(scores); printf(“average score is %5.2f”,average); } (1.3) float i,max,min,a[10]; float ave=0,sum=0; for(i=0;i<10;i++) scanf("%d",&a[i]); max=min=a[0]; for(i=0;i<10;i++) { if(max<data[i]) max=data[i]; else if(min>data[i]) min=data[i]; sum+=data[i]; } ave=sum/10; printf(“max=%f min=%f ave=%f”,max,min,ave); (1.4) int score(int arr[10],int n){ int sum=0,res,i; for(i=0;i<n;i++) sum=sum+arr[i]; res=sum/n; return res; }

int main() { int i,a[10],ave; for(i=0;i<10;i++) scanf("%d",&a[i]); ave=score(a,10); for(i=0;i<10;i++) if(a[i]>ave) printf("%d",a[i]); } (1.5)平均分+排序 int average(int b[]){ int j,ave,sum=0; for(j=0;j<10;j++) sum=sum+b[j]; ave=sum/10; return ave; }

int sort(int b[]){ int i,j,k,max; for(i=0;i<10;i++){ max=b[i]; k=i; for(j=i+1;j<10;j++) if(max<b[j]){ max=b[j]; k=j; } b[k]=b[i]; b[i]=max; } }

int main() { int a[10],j,ave; for(j=0;j<10;j++) scanf("%d",&a[j]); ave=average(a); printf(“ave=%d”,ave); sort(a); for(j=0;j<10;j++) printf("%d",a[j]); }

(2)多维数组已经定义 float a_stu[N];

int average1(int str1[][5],int m,int n){ int i,j; float ave1; for(i=0;i<m;i++){ float sum=0; for(j=0;j<n;j++){ sum+=str1[i][j]; } a_stu[i]=sum/n; printf("%f",a_stu[i]); } }

int average2(int str2[][5],int m,int n){ int i,j; float ave2; for(j=0;j<m;j++){ float sum=0; for(i=0;i<n;i++){ sum+=str2[i][j]; } ave2=sum/m; printf("%f",ave2); } }

int average3(int str3[][5],int m,int n){ int max=str3[0][0]; int i,j,k,p; for(i=0;i<10;i++){ for(j=0;j<5;j++){ max=str3[i][j]; k=i+1; p=j+1; } } printf(“max=%d,k=%d,p=%d\n”,max,k,p); }

int average4(int str4[][5],int m,int n){ int i; float sum1=0,sum2=0; float ave4; for(i=0;i<m;i++) {

sum1+=a_stu[i]; sum2+= a_stu[i]*a_stu[i]; ave4=sum2/m-(sum1/m)*(sum1/m); } printf("%f\n",ave4);

}

int main(){ int str[10][5]={{87,88,92,67,78},{88,86,87,98,90},{76,75,65,65,78},{67,87,60,90,67}, {77,78,85,64,56},{76,89,94,65,76},{78,75,64,67,77},{77,76,56,87,85},{84,67,78,76,89}, {86,75,64,69,90}}; int i,j; printf(“每个学生的平均成绩\n”); average1(str,10,5); printf(“每门课的平均成绩\n”); average2(str,10,5); printf(“最高分对应的学生和课程\n”); average3(str,10,5); printf(“某个学生的平均成绩的偏差\n”); average4(str,10,5); }

(3)多维数组未定义(即输入数据) #define N 10 #define M 5 float score[N][M]; float a_stu[N],a_cour[M]; int r,c; //1.输入成绩 void input(){ int i,j; for(i=0;i<N;i++) { printf(“studend %d:”,i+1); for(j=0;j<M;j++) scanf("%f",&score[i][j]); } }

//2.平均成绩 void average(){ int i,j; float s=0; for(i=0;i<N;i++) { for(j=0;j<M;j++) s+=score[i][j]; a_stu[i]=s/5; } }

//3.平均课程 void avelesson(){ int i,j; float s; for(j=0;j<M;j++) { s=0; for(i=0;j<N;i++) s+=score[i][j]; a_cour[j]=s/N; } }

//4.最高成绩 float maxgrade(){ float max; int i,j; max=score[0][0]; for(i=0;i<N;i++) for(j=0;j<M;j++) if(max<score[i][j]){ max=score[i][j]; r=i+1; c=j+1; } return max; }

//5.方差 float fangcha(){ int i; float sum1,sum2; for(i=0;i<N;i++){ sum1+=a_stu[i]a_stu[i]; sum2+=a_stu[i]; } return (sum1/N-(sum2/N)(sum2/N)); }

int main(){ int i,j; float h; input(); average(); avelesson(); for(i=0;i<N;i++){ printf(“num is %d”,i+1); for(j=0;j<M;j++) printf("%f",score[i][j]); printf("%f",a_stu[i]); } printf("\n average:"); for(j=0;j<M;j++) printf("%f",a_cour[j]); printf("\n"); h=maxgrade(); printf(“maxgarde:%f no:%d cour:%d”,h,r,c); }

(5)扩展 #define N 10 #define M 5

void input(char na[][20],int no[]){ int i; for(i=0;i<10;i++) { printf(“staff %d:”,i+1); scanf("%s",na[i]); printf(“number %d:”,i+1); scanf("%d",&no[i]); } }

//按职工号由小到大顺序排序,姓名顺序也随之调整 void sort(char na[][20],int no[]){ int i,j,temp; char t[20]; for(i=0;i<10;i++) for(j=i+1;j<10;j++){ if(no[i]>no[j]){ temp=no[i]; no[i]=no[j]; no[j]=temp; strcpy(t, na[i]); strcpy(na[i], na[j]); strcpy(na[j], t); } } }

void search(char na[][20],int no[],int x){ int low,high,mid; low=0; high=9; while(low<=high){ mid=(low+high)/2; if(x>no[mid]) low=mid+1; else if(x<no[mid]) high=mid-1; else if(x==no[mid]){ printf("%s\n", na[mid]); break; } } if(x!=no[mid]) printf(“not find:”); }

int main(){ char name[10][20]; int num[10],number,i; input(name,num); sort(name,num); for(i=0;i<10;i++){ printf("%s",name[i]); printf("%d",num[i]); } printf(“input your number:”); scanf("%d",&number); search(name,num,number); }

5.数组赋值交换最值问题 (1)赋值 int i,j,temp,a[][4]={3,16,12,89,45,69,78,23,46,21,42,34}; int b[3]; for(i=0;i<2;i++){ temp=a[i][0]; for(j=1;j<=3;j++) if(a[i][j]>temp) temp=a[i][j]; b[i]=temp;} //打印 printf("\narray a:\n"); for(i=0;i<=2;i++) { for(j=0;j<=3;j++) printf("%5d",a[i][j]); printf("\n");} //打印 printf("\narray b:\n"); for(i=0;i<=2;i++) printf("%5d",b[i]);

(2)找出行号列号 int main() { int i,j,row=0,column=0,max; int a[3][4]; max=a[0][0]; for(i=0;i<=2;i++) for(j=0;j<=3;j++) if(a[i][j]>max){ max=a[i][j]; row=i; column=j; } printf(“max=%d row=%d column=%d\n”,max,row,column); }

6.日期差值问题 题目描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们 之间的天数为两天 #include <stdio. h> #define ISYEAP( x) x % 100 ! = 0 && x % 4 == 0 | | x % 400 == 0 ? 1 : 0 / / 定义宏判断是否是闰年,方便计算每月天数 i nt dayOf Mont h[ 13] [ 2] = { 0, 0, 31, 31, 28, 29, 31, 31, 30, 30, 31, 31, 30, 30, 31, 31, 31, 31, 30, 30, 31, 31, 30, 30, 31, 31 } ; / / 预存每月的天数, 注意二月配合宏定义作特殊处理 struct Date { / / 日期类, 方便日期的推移 int Day; int Mont h; int Year ; void next Day( ) { / / 计算下一天的日期 Day ++; if ( Day > dayOfMonth[ Month] [ ISYEAP( Year ) ] ) { / / 若日数超过了当月最大日数 Day = 1; Month ++; / / 进入下一月 if( Month > 12) { / / 月数超过12 Month = 1; Year ++; / / 进入下一年 } } } } ; int buf [ 5001] [ 13] [ 32] ; / / 保存预处理的天数 int Abs( int x) { / / 求绝对值 return x < 0 ? - x : x; } int main ( ) { Date tmp; int cnt = 0; / / 天数计数 tmp. Day = 1; tmp. Mont h = 1; tmp. Year = 0; / / 初始化日期类对象为0年1月1日 while( t mp. Year ! = 5001) { / / 日期不超过5000年 buf [ t mp. Year ] [ t mp. Mont h] [ t mp. Day] = cnt ; / / 将该日与0年1月1日的天数差保 存起来 tmp. next Day( ) ; / / 计算下一天日期 cnt ++; / / 计数器累加,每经过一天计数器即+1,代表与原点日期的间隔又增加一天 } i nt d1 , m1 , y1; i nt d2 , m2 , y2; whi l e ( scanf ( " %4d%2d%2d" , &y1, &m1, &d1) ! = EOF) { scanf ( " %4d%2d%2d" , &y2, &m2, &d2) ; / / 读入要计算的两个日期 pr i nt f ( " %d\ n" , Abs( buf [ y2] [ m2] [ d2] - buf [ y1] [ m1] [ d1] ) + 1) ; / / 用预处 理的数据计算两日期差值, 注意需对其求绝对值 } r et ur n 0; }

7.数位拆解 (7.1)普通输出位数 (7.1.1) //判断位数 //求出各个位 //逆序打印每个数 int num; printf(“请输入一个合适的整数:”); scanf("%d",&num); int place;//定义位数 if(num>9999) place=5; else if(num>999) place=4; else if(num>99) place=3; else if(num>9) place=2; else place=1; printf("\n%d是%d位数\n",num,place);//输出位数 //分别输出每一位数字 int indiv,ten,hundred,thousand,ten_thousand; ten_thousand=num/10000; thousand=(num-ten_thousand10000)/1000; hundred=(num-ten_thousand10000-thousand1000)/100; ten==(num-ten_thousand10000-thousand1000-hundred100)/10; indiv=(num-ten_thousand10000-thousand1000-hundred100-ten10); //利用switch逆序打印每一位数 switch(place){ case 5:printf("\n%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand);break; case 4:printf("\n%d%d%d%d\n",indiv,ten,hundred,thousand);break; case 3:printf("\n%d%d%d\n",indiv,ten,hundred);break; case 2:printf("\n%d%d\n",indiv,ten);break; case 1:printf("\n%d\n",indiv);break; } (7.1.2)扩展 void printNum(int n){ int indiv,ten,hundred,thousand; thousand=n/1000; hundred=(n-thousand1000)/100; ten=(n-thousand1000-hundred100)/10; indiv=n-thousand1000-hundred100-ten10; printf("%d %d %d %d",thousand,hundred,ten,indiv); }

int main(){ int n; printf(“输入一个四位数:”); scanf("%d",&n); printNum(n); } (7.1.3)扩展 void insertSpace(char num[]){ int i; for(i=strlen(num);i>0;i–){ num[2i]=num[i]; num[2i-1]=’ '; } printf(“输出四位数:”); puts(num); }

int main(){ char num[10]; printf(“输入一个四位数:”); gets(num); insertSpace(num); }

(7.2)水仙花数 int i,j,n,k; for(i=100;i<1000;i++) { j=i/100; n=i/10-j10; k=i%10; if(i==jjj+nnn+kk*k) printf(“水仙花数:%d \n”,i); }

(7.3)写个算法,对 2 个小于 1000000000 的输入,求结果。 特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35 int a,b; int i,j; while(scanf("%d%d",&a,&b)!=EOF){ int buf1[20],buf2[20],size1,size2;//用buf1, buf2分别保存从两个整数中拆解出来的数位数字, 其数量由size1, size2表示 while(a!=0){ buf1[size1++]=a%10; a/=10; } while(b!=0){ buf2[size2++]=b%10; b/=10; } int res=0; for(i=0;i<size1;i++) for(j=0;j<size2;j++) res+=buf1[i]*buf2[j]; printf("%d\n",res); }

8.统计字符 (1)一维数组 char c; int letters=0,space=0,digit=0,other=0; printf(“请输入一个字符:\n”); while((c=getchar())!=’\n’){ if(c>=‘a’&&c<=‘z’||c>=‘A’&&c<=‘Z’) letters++; else if(c==’ ') space++; else if(c>=‘0’&&c<=‘9’) digit++; else other++; } printf(“字母数:%d\n空格数:%d\n数字数%d\n其他%d\n”,letters,space,digit,other);

(2)二维数组 main() { char word[3][80]; int i,j,a,b,c,d,e; a=b=c=d=e=0; printf(“输入3行文字:\n”); for(i=0;i<3;i++) { gets(word[i]); for(j=0;j<80&&word[i][j]!=’\0’;j++) { if(word[i][j]>=‘A’&&word[i][j]<=‘Z’) a++; else if(word[i][j]>=‘a’&&word[i][j]<=‘z’) b++; else if(word[i][j]>=‘0’&&word[i][j]<=‘9’) c++; else if(word[i][j]==’ ') d++; else e++; } } printf(“大写字母%d个\n小写字母%d个\n数字%d个\n空格%d个\n其他字符%d个\n”,a,b,c,d,e); }

(3)函数 int letters,space,digit,other;

void count(char c[]){ int i; for(i=0;c[i]!=’\0’;i++){ if(c[i]>=‘a’&&c[i]<=‘z’||c[i]>=‘A’&&c[i]<=‘Z’) letters++; else if(c[i]==’ ') space++; else if(c[i]>=‘0’&&c[i]<=‘9’) digit++; else other++; } }

int main(){ char str[10]; printf(“输入一个字符串:”); gets(str); letters=0;space=0;digit=0;other=0; count(str); printf("%d %d %d %d",letters,space,digit,other); }

(4)用指针统计 int main(){ int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s[20]; printf(“input string: “); while((s[i]=getchar())!=’\n’) i++; p=&s[0]; while(*p!=’\n’) { if((‘A’<=*p)&&(*p<=‘Z’)) ++upper; else if((‘a’<=*p)&&(*p<=‘z’)) ++lower; else if(*p==’ ') ++space; else if((*p<=‘9’)&&(*p>=‘0’)) ++digit; else ++other; p++; } printf(“upper case :%d lower case:%d”,upper,lower); printf(” space:%d digit:%d other :%d\n”,space,digit,other); }

9.hash的应用 (9.1)读入 N 名学生的成绩,将获得某一给定分数的学生人数输出 int main(){ int n,i; while(scanf("%d",&n)!=EOF&&n!=0) {//输入判断增加对n是否等于零进行判断 int Hash[101]={0}; //建立一个初始为0的Hash数组用来记录各种分数出现的次数 for(i=1;i<=n;i++) { int x; scanf("%d",&x) ; Hash[x] ++; //统计分数出现次数 } int x; scanf ("%d",&x); printf ("%d\n", Hash[x]); //得到需要查询的目标分数后, 只需简单的查询我们统计的数量即可 } }

10.排版问题 (10.1)菱形 int i,j,k; for(i=0;i<=3;i++){ for(j=0;j<=2-i;j++) printf(" “); for(k=0;k<=2i;k++) printf("”); printf("\n"); } for(i=0;i<=2;i++){ for(j=0;j<=i;j++) printf(" “); for(k=0;k<=4-2i;k++) printf("”); printf("\n"); } (10.2)梯形 int h,i,j; while(scanf("%d",&h)!=EOF) { int maxline=h+(h-1)2; //计算最后一行个数 for(i=1;i<=h;i++) { for(j=1;j<=maxline;j++){//输出每行空格或者* if(j<maxline-h-(i-1)2+1) printf(" “); else printf(”"); } } printf("\n"); }

11.落地反弹 double s=100,h=s/2;//定义初值,第一次弹跳高度 int i; //for循环进行的第二次 for(i=2;i<=10;i++){ s=s+2*h;//从第二次落地开始的总位移 h=h/2;//反弹的高度 } printf(“十次共经过%f 米\n”,s); printf(“第十次反弹%f 米\n”,h);

12.猴子吃桃 int i,s=1,b; //s为第十天的桃子, b是前一天桃子 for(i=9;i>0;i–) { b=(s+1)*2; s=b; } printf(“first day is %d 个桃子”,b);

14.找鞍点 #define N 4 #define M 5 /* 数组为4行5列 / int main(){ int i,j,k,a[N][M],max,maxj,flag; printf(“please input matrix:\n”); for (i=0;i<N;i++) / 输入数组 / for (j=0;j<M;j++) scanf("%d",&a[i][j]); for (i=0;i<N;i++) { max=a[i][0]; / 开始时假设a[i][0]最大 / maxj=0; / 将列号0赋给maxj保存 / for (j=0;j<M;j++) / 找出第i行中的最大数 / if (a[i][j]>max) {max=a[i][j]; / 将本行的最大数存放在max中 / maxj=j;/ 将最大数所在的列号存放在maxj中 /} flag=1; / 先假设是鞍点,以flag为1代表 / for (k=0;k<N;k++) / 将最大数和其同列元素相比 / if (max>a[k][maxj]) {flag=0;/ 如果max不是同列最小,表示不是鞍点令flag1为0 /continue;} / 如果flag1为1表示是鞍点 / if(flag){ printf(“a[%d][%d]=%d\n”,i,maxj,max); / 输出鞍点的值和所在行列号 / break;} } if(!flag) printf(“It is not exist!\n”);/ 如果flag为0表示鞍点不存在 / } } if(!flag) printf(“It is not exist!\n”);/ 如果flag为0表示鞍点不存在 */ return 0; }

15.大小写 (1)密码转译 char a[10],b[10]; int i; printf(“input data:”); gets(a); for(i=0;i!=’\0’;i++){ if(‘A’<=a[i]&&a[i]<=‘Z’) b[i]=155-a[i];//‘A’+‘Z’=155 else if(‘a’<=a[i]&&a[i]<=‘z’) b[i]=219-a[i];//‘a’+‘z’=219 else b[i]=a[i]; } printf(“原密码为:\n”); puts(a); printf(“密码翻译成原文为:\n”); puts(b);

(2)大小写转换 char c1,c2; c1=getchar(); c2=c1+32; putchar(c2); putchar(’\n’);

16.字符串 (1)连接 (1.1)普通 char a[10],b[10],c[20]; int i,j; printf(“输入两个字符串:\n”); gets(a); gets(b); for(i=0;a[i]!=’\0’;i++) c[i]=a[i]; for(j=0;b[j]!=’\0’;j++) c[i+j]=b[j]; c[i+j+1]=’\0’; printf(“两字符串连接后的字符串为:%s\n”,c); (1.2)连接用函数 void link(char a[],char b[]){ char c[20]; int i,j; for(i=0;a[i]!=’\0’;i++) c[i]=a[i]; for(j=0;b[j]!=’\0’;j++) c[i+j]=b[j]; c[i+j+1]=’\0’; printf(“两字符串连接后的字符串为:%s\n”,c); }

int main(){ char a[20],b[20]; printf(“input string:”); gets(a); gets(b); link(a,b); } (1.3)连接并返回长度 int strcen(char a[],char b[]){ int num=0,n=0; while(*(a+num)!=’\0’) num++; while(b[n]){ *(a+num)=b[n]; num++; n++; } return num; }

(4)copy (4.1)复制 char s1[10],s2[10]; int i; printf(“输入s2字符串:\n”); gets(s2); for(i=0;s1[i]=s2[i];i++); printf(“s2字符串输出:\n”); printf("%s",s1); (4.2)指针复制 char a[]=“I love china”,b[50]; int i; for(i=0;*(a+i)!=’\0’;i++) (b+i)=(a+i); *(b+i)=’\0’; printf(“a:”); puts(a); printf(“b:”); for(i=0;b[i]!=’\0’;i++) printf("%c",b[i]); (4.3) char a[]=“I love china”,b[50],*p1,*p2; p1=a; p2=b; for(;*p1!=’\0’;p1++,p2++) *p2=*p1; *p2=’\0’; //printf(“a is:%s”,a); //printf(“b is:%s”,b); puts(a); puts(b); (4.4)函数复制 copy(char str1[],char str2[]){ int i; for(i=0;str1[i]!=’\0’;i++){ str2[i]=str1[i]; } str2[i]=’\0’; }

int main(){ char a[]=“fdhkjsdjf”; char b[]=“ljklsjdklf”; //char *str1=a,*str2=b; copy(a,b); printf(“a=%s b=%s”,a,b); } (4.5) copy(char *str1,char *str2){ for(;*str1!=’\0’;str1++,str2++){ *str2=*str1; } *str2=’\0’; }

int main(){ char *a=“fdhkjsdjf”; char b[]=“ljklsjdklf”; char *p=b; copy(a,p); printf(“a=%s b=%s”,a,b); }

(5)字符串比较 char s1[100],s2[100]; printf(“请输入s1:”); gets(s1); printf(“请输入s2:”); gets(s2); int i,num=0; for(i=0;s1[i]!=’\0’||s2[i]!=’\0’;i++) { printf(“s1[%d]=%d\n”,i,s1[i]); printf(“s2[%d]=%d\n”,i,s2[i]); num=num+s1[i]-s2[i]; printf("\n"); } printf(“结果是:%d\n\n”,num);

(6)长度 (6.1)求字符串长度 int length(char *p){//必须是int int n=0; while(*p!=’\0’){ n++; p++; } return n; }

int main(){ int len; char str[20]; printf(“input string:”); gets(str); len=length(str); printf(“length is %d”,len); } (6.2) int lenG(char *s){ int len=0; while(*s++) len++; return len; }

int main() { char *str; printf(“input a string: “); gets(str); printf(”\n%s length=%d\n”,str,lenG(str)); }

(7)从指定位置复制字符串 int copy(char *p1,char *p2,int m){ int n=0; while(n<m-1){//先找到指定位置 n++; p1++; } while(*p1!=’\0’){//从指定位置进行复制,同时进行 *p2=*p1; p1++; p2++; } *p2=’\0’; }

int main(){ int m; char a[20],b[20]; printf(“input string:”); gets(a); printf(“start place is :”); scanf("%d",&m); if(strlen(a)<m) printf(“error!”); else{ copy(a,b,m); printf("the result is: "); puts(b); } }

(8)比较函数 (8.1)自定义比较函数 int compareStr(char p1,char p2){ int i=0; while((p1+i)==(p2+i)) if((p1+i++)==’\0’) return 0; return ((p1+i)-*(p2+i)); }

int main() { int m; char *p1,*p2,a[20],b[20]; printf(“input two strings:”); gets(a); gets(b); p1=a; p2=b; m=compareStr(p1,p2); printf(“result:%d \n”,m); } (8.2) int compare(char *s1,char *s2){ while(*s1&&*s2&&*s1==*s2){ s1++; s2++; } return *s1-*s2; }

int main() { printf("%d\n",compare(“abCd”,“abc”)); }

(9)字符串输入加比较例题 #include<stdio.h> #include<math.h> #include<string.h>

int main(){ char st[20],c[5][20]; int i,j,p; printf(“input country’s name:’”); for(i=0;i<5;i++) gets(c[i]);//用gets输入五个字符串 printf("\n"); for(i=0;i<5;i++){ p=i; strcpy(st,c[i]); for(j=i+1;j<5;j++) if(strcmp(c[j],st)<0) {p=j;strcpy(st,c[j]);} if(p!=i) { strcpy(st,c[i]); strcpy(c[i],c[p]); strcpy(c[p],st); } puts(c[i]); } printf("\n"); }

(10)输出最大字符+统计比较次数 char maxchar(char c[]){ int i; char max=c[0]; for(i=0;i<10;i++) if(max<c[i]) max=c[i]; return max; }

char count(char a[],char b[]){ int i,high=0,low=0,equal=0; for(i=0;i<10;i++) if(a[i]>b[i]) high++; else if(a[i]==b[i]) equal++; else low++; printf(“high=%d equ=%d low=%d”,high,equal,low); }

int main() { char a[10],b[10],max1,max2; int i; for(i=0;i<10;i++) scanf("%c",&a[i]); for(i=0;i<10;i++) scanf("%c",&b[i]); max1=maxchar(a); max2=maxchar(b); count(a,b); }

(11)3个字符串找出最大者 int main() { char str[3][20]; char c[20]; int i; for(i=0;i<3;i++) gets(str[i]); if(strcmp(str[0],str[1])>0) strcpy(c,str[0]); else strcpy(c,str[1]); if(strcmp(str[2],c)>0) strcpy(c,str[2]); printf("the max is: %s ",c); }

(12)利用指针输出字符串大小 void swap(char *p1,char *p2){ char p[20]; strcpy(p,p1); strcpy(p1,p2); strcpy(p2,p); }

int main(){ char n1[20],n2[30],n3[20]; //int *p1,*p2,*p3; printf(“input three lines: “); gets(n1); gets(n2); gets(n3); if(strcmp(n1,n2)>0) swap(n1,n2); if(strcmp(n1,n3)>0) swap(n1,n3); if(strcmp(n2,n3)>0) swap(n2,n3); printf(“now the order is:”); printf(”%s\n%s\n%s\n”,n1,n2,n3); }

17.字符串排序 (1)等长度字符串 int main() { void sort(char s[][6]); int i; char str[10][6]; printf(“input 10 strings:\n”); for(i=0;i<10;i++) scanf("%s",str[i]); sort(str); printf(“now is:\n”); for(i=0;i<10;i++) printf("%s\n",str[i]); return 0; } void sort(char s[10][6]) { int i,j; char *p,temp[10]; p=temp; for(i=0;i<9;i++) for(j=0;j<9-i;j++) if(strcmp(s[j],s[j+1])>0) { strcpy(p,s[j]); strcpy(s[j],s[j+1]); strcpy(s[j+1],p); } }

(2)不等长度字符串 int main() { void sort(char *[]); int i; char p[10],str[10][20]; for(i=0;i<10;i++) p[i]=str[i]; printf(“input 10 strings:\n”); for(i=0;i<10;i++) scanf("%s",p[i]); sort§; printf(“now is:”); for(i=0;i<10;i++) printf("%s\n",p[i]); return 0; } void sort(char s[]) { int i,j; char temp; for(i=0;i<9;i++) for(j=0;j<9-i;j++) if(strcmp((s+j),(s+j+1))>0) { temp=(s+j); (s+j)=(s+j+1); *(s+j+1)=temp; } }

(3)字符串逆置 void reverse(char a[]){ char t; int i,j; for(i=0,j=strlen(a);i<(strlen(a)/2);i++,j–) { t=a[i]; a[i]=a[j-1]; a[j-1]=t; } }

int main(){ char a[10]; printf(“input string:”); gets(a); reverse(a); printf(“output string:”); puts(a); }

(4)回文 (4.1) char s[81],*p1,*p2; int n; gets(s); n=strlen(s); p1=s; p2=s+n-1; while(p1<p2){ if(*p1!=*p2) break; else{ p1++; p1<p2; } } if(p1<p2) printf(“no!\n”); else printf(“yes!\n”); (4.2) char str[20]; int i=0,j; printf(“input a string:”); gets(str); j=strlen(str)-1; while(i<j){ if(str[i]!=str[j]) break; i++; j–; } if(i>=j) printf(“yes!”); else printf(“no!”);

(5)删除字符串中数字 int dele(char *s){ int i,n=0; for(i=0;s[i];i++) if(s[i]>=‘0’&&s[i]<=‘9’) s[n++]=s[i]; s[n]=’\0’; }

(6)删除指定字符 char str1[10],str2[40]; char ch; int i,k=0; printf(“input a string:”); gets(str1); printf(“input a ch:”); scanf("%c",ch); for(i=0;str1[i]!=’\0’;i++) if(str1[i]!=ch) str2[k++]=str1[i]; str2[k]=’\0’; puts(str2);

(7)首尾不变中间变序 int sortmid(char s[8]){ int i,j; char t; for(i=1;i<5;i++) for(j=i+1;j<6;j++) if(s[i]<s[j]){ t=s[i]; s[i]=s[j]; s[j]=t; } }

int main() { char s[8]; printf(“input a string:”); gets(s); sortmid(s); puts(s); }

18.数组应用 (1)二维数组转置 (1.1)函数法 #define N 3 int array[3][3];

void convert(int array[][3]){ int i,j,t; for(i=0;i<N;i++) for(j=i+1;j<N;j++){ t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t; } }

int main(){ int i,j; printf(“input array:”); for(i=0;i<N;i++) for(j=0;j<N;j++) scanf("%d",&array[i][j]); convert(array); printf(“convert array:”); for(i=0;i<N;i++) for(j=0;j<N;j++) printf("%d",array[i][j]); } (1.2)普通 int i,j,k,a[2][3],b[3][2]; printf(“input data:”); //float ave=0,sum=0; for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); for(i=1;i<2;i++) for(j=0;j<3;j++) b[j][i]=a[i][j]; //内循环从0开始 printf(“the original :”); for(i=1;i<2;i++) { for(j=0;j<3;j++) printf("%d",a[i][j]); printf("\n"); } printf(“the result :”); for(i=1;i<3;i++) { for(j=0;j<2;j++) printf("%d",b[i][j]); printf("\n"); } (1.3)利用指针转置 void move(int pointer) { int i,j,t; for(i=0;i<3;i++) for(j=i;j<3;j++) { t=(pointer+i3+j); (pointer+i3+j)=(pointer+j*3+i); (pointer+j3+i)=t; } }

int main(){ int a[3][3],*p,i; printf(“input matrix:\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§; printf(“Now,matrix:\n”); for(i=0;i<3;i++) printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]); }

(3)逆置数组 注:在函数中改变数组元素的值有四种方式 //1. 实参与形参都为数组 //2. 实参数组 形参指针 //3. 实参与形参都为指针 //4. 实参指针 形参数组

(3.1)数组法 inverse(int x[],int n){ int temp,i,j,m=(n-1)/2; for(i=0;i<m;i++){ j=n-1-i; temp=x[i]; x[i]=x[j]; x[j]=temp; } }

int main(){ int a[10]; int i; printf(“original array:”); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf("%d",a[i]); printf("\n"); inverse(a,10); printf(“inverse array:”); for(i=0;i<10;i++) printf("%d",a[i]); } (3.2)指针法 inverse(int *x,int n){ int temp,*i,*j,*p,m=(n-1)/2; i=x;//指向的第一个元素 j=x+n-1;//指向的最后一个元素 p=x+m;//中间值 for(;i<=p;i++,j–){//i++往后找 j–向前找 双向交换 temp=*i; *i=*j; *j=temp; } }

int main(){ int a[10]; int i; printf(“original array:”); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf("%d",a[i]); printf("\n"); inverse(a,10); printf(“inverse array:”); for(i=0;i<10;i++) printf("%d",a[i]); }

(4)找出最小下标并交换 int i,a[10]; int min,k=0; printf(“input ten datas:”); for(i=0;i<10;i++) scanf("%d",&a[i]); printf(“original datas:”); for(i=0;i<10;i++) printf("%d",a[i]); min=a[0]; for(i=1;i<10;i++) if(min>a[i]){ min=a[i]; k=i; } a[k]=a[0]; a[0]=min; printf(“changes datas:”); for(i=0;i<10;i++) printf("%d",a[i]); printf("\nk=%d min=%d\n",k,min);

(5)求对角线并输出周边元素 int i,j,min,sum=0,a[5][5]; for(i=0;i<5;i++) for(j=0;j<5;j++) scanf("%d",&a[i][j]); min=a[0][0]; for(i=0;i<5;i++) for(j=0;j<5;j++) { if((i0)||(i4)) sum=sum+a[i][j]; else if((j0)||(j4)) sum=sum+a[i][j]; if(ij) sum=sum+a[i][j]; else if(i+j4) sum=sum+a[i][j]; if(min>a[i][j]) min=a[i][j]; } printf(“sum=%d min=%d”,sum,min);

(6)求对角线和+转置 int add(int a[][]){ int i,j,sum; for(i=0;i<4;i++) for(j=0;j<4;j++) if(ij) sum+=b[i][j]; else if(i+j3) sum+=b[i][j]; return sum; }

int change(int a[][]){ int i,j,b[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) b[j][i]=a[i][j]; for(i=0;i<4;i++){ for(j=0;j<4;j++) printf("%d",b[i][j]); printf("\n"); } }

int main() { int a[4][4],i,j,sum; for(i=0;i<4;i++) for(j=0;j<4;j++) scanf("%d",&a[i][j]); sum=add(a); change(a); printf(“sum=%d”,sum); }

(7)定义一个含有30个整型元素的数组,按顺序分别赋予 从2开始的偶数;然后按顺序每5个数求出一个平均值,放 在另一数组中并输出。 int a[30],b[6],sum=0,j=0,k; for(k=0;k<30;k++) a[k]=(k+1)*2; for(k=0;k<30;k++) if(k%5==0){ b[j]=sum/5; j++; sum=0; } else sum=sum+a[k]; for(j=0;j<6;j++) printf("%d",b[j]);

19.(1)交换两个指针变量的值,不交换a b int *pointer_1,*pointer_2,*p,a,b; printf(“input integers: “); scanf(”%d%d”,&a,&b); pointer_1=&a; pointer_2=&b; if(a<b){ p=pointer_1; pointer_1=pointer_2; pointer_2=p; } printf(“a=%d b=%d”,a,b); printf("*pointer_1=%d *pointer_2=%d",*pointer_1,*pointer_2);

(2)交换整型变量a b的值,地址变量的值不变 /利用指针变量可实现main函数中的互换,单向值传递不可以实现互换/ void swap(int *p1,int *p2){ int temp; temp=*p1; *p1=*p2; *p2=temp; }

int main(){ int *pointer_1,*pointer_2,*p,a,b; printf(“input integers: “); scanf(”%d%d”,&a,&b); pointer_1=&a; pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf(“a=%d b=%d”,a,b); }

(3)3个整数从大到小排序 void swap(int *p1,int *p2){ int temp; temp=*p1; *p1=*p2; *p2=temp; }

void exchange(int *q1,int *q2,int *q3){ if(*q1<*q2) swap(q1,q2); if(*q1<*q3) swap(q1,q3); if(*q2<*q3) swap(q2,q3); }

int main(){ int *pointer_1,*pointer_2,*pointer_3,a,b,c; printf(“input integers: “); scanf(”%d%d%d”,&a,&b,&c); pointer_1=&a; pointer_2=&b; pointer_3=&c; exchange(pointer_1,pointer_2,pointer_3); printf(“a=%d b=%d c=%d”,a,b,c); }

(4)利用指针输出大小 void swap(int *p1,int *p2){ int p; p=*p1; *p1=*p2; *p2=p; }

int main(){ int n1,n2,n3; int *p1,*p2,*p3; printf(“input three integer: “); scanf(”%d%d%d”,&n1,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if(n1>n2) swap(p1,p2); if(n1>n3) swap(p1,p3); if(n2>n3) swap(p2,p3); printf("%d %d %d",n1,n2,n3); }

20.输出最长单词 void longestword(char str[]){ int start,end,i,temp,length; int start_temp,end_temp; start=0,end=0,length=0; for(i=0;i<strlen(str);i++){ temp=0; start_temp=i; if(str[i]!=’ ‘&&str[i]!=’\0’){ temp++; i++; } end_temp=i-1; if(temp>length){ length=temp; start=start_temp; end=end_temp; } } printf(“the longest word is:”); for(i=start;i<=end;i++) putchar(str[i]); }

int main(){ char string[100]; printf(“please input a string:”); gets(string); longestword(string); }

21.利用指针进行移动 void move(int array[20],int n,int m){ int p,array_end; array_end=(array+n-1); for(p=array+n-1;p>array;p–) p=(p-1); *array=array_end; m–; if(m>0) move(array,n,m); }

int main(){ int number[20],n,m,i; printf(“how many numbers?: “); scanf(”%d”,&n); printf(“input %d numbers:\n”,n); for(i=0;i<n;i++) scanf("%d",&number[i]); printf(“how many place you want move?: “); scanf(”%d”,&m); move(number,n,m); printf(“now they are:\n”); for(i=0;i<n;i++) printf("%d",number[i]); printf("\n"); }

22.寻找交换 void input(int *num){ int i; printf(“input 10 numbers:”); for(i=0;i<10;i++) scanf("%d",&num[i]); }

void findvalue(int *number){ int *max,*min,*p,temp; max=min=number; for(p=number+1;p<number+10;p++){ if(*p>*max) max=p; else if(*p<*min) min=p; temp=number[0]; number[0]=*min; *min=temp; if(max=number) max=min; temp=number[9]; number[9]=*max; *max=temp; } }

void output(int *number){ int *p; printf(“put :”); for(p=number;p<number+10;p++) printf("%d",*p); printf("\n"); }

int main(){ int number[10]; input(number); findvalue(number); output(number); }

23.输出月份号 int main() { char month[13]={“error”,“january”,“fabruary”,“march”,“april”,“may”,“june”,“july”,“august”,“september”,“october”,“november”,“december”}; int n; printf(“input n:”); scanf("%d",&n); if((n<=12)&&(n>=1)) printf(“it is %s.\n”,(month+n)); else printf("%s",*month); }

24.进制转换 (1)十六进制转十进制 int main() { char a[100]; int i,k,sum=0; printf(“输入一个十六进制数:”); gets(a); for(i=strlen(a)-1,k=1;i>=0;i–) { if(a[i]>=‘0’&&a[i]<=‘9’) sum+=(a[i]-‘0’)*k; else if(a[i]>=‘A’&&a[i]<=‘F’) sum+=(a[i]-‘A’+10)*k; else if(a[i]>=‘a’&&a[i]<=‘f’) sum+=(a[i]-‘a’+10)k; k=16; } printf("\n十六进制数%s转换成十进制数为:\n%d",a,sum); } (2)十进制转十六进制 int reverse(char b[]){ int i,n; char t; n=strlen(b); for(i=0;i<n/2;i++){ t=b[i]; b[i]=b[n-1-i]; b[n-1-i]=t; } }

int convert(int n,char c[]){ int i=0,k,m; m=n; while(m>0){ k=m%16; m=m/16; if(k<10) c[i++]=k+‘0’; else c[i++]=k-10+‘A’; } c[i]=’\0’; reverse©; }

int main() { int n; char ch[10]; printf(“input a number:”); scanf("%d",&n); convert(n,ch); printf("%s\n",ch); }

(3)输入两个不超过整型定义的非负 10 进制整数 A 和 B(<=231-1) ,输出 A+B 的 m (1 < m <10) 进制数。 int a,b; int i,m; while(scanf("%d",&m)!=EOF){ if(m==0) break; scanf("%d%d",&a,&b); a = a + b; //计算a+b int ans[50] , size = 0; //ans用来保存依次转换得到的各个数位数字的值, size表其个数 do { //依次求的各个数位上的数字值 ans[size++] = a % m; //对m求模 a/=m; //除以m } while(a!=0); //当a不为0时重复该过程 for(i=size-1;i>=0;i–) printf("%d",ans[i]); }

25.递归 (1)递归将整数转为字符串 void convert(int n){ int i; if((i=n/10)!=0) convert(i); putchar(n%10+‘0’); putchar(32); }

int main() { int number; printf(“please input a number:”); scanf("%d",&number); printf("output: "); if(number<0){ putchar(’-’); putchar(’ '); /* 先输出一个‘-’号和空格 */ number=-number; } convert(number); }

(2)递归五个字符逆序 int verse(int n){ char text; if(n<=1){ text=getchar(); printf("\n\0:"); putchar(text); } else{ text=getchar(); verse(n-1); putchar(text); } }

int main() { int i=5; printf("\40"); verse(i); printf("\n"); }

(3)递归逆序 int fchange(char *s,char *t){ char k; k=*s; *s=*t; *t=k; s++; t–; if(*s) fchange(s,t); }

int main() { char str[10]=“abcdefg”,*p; p=str+strlen(str)/2+1; fchange(p,p-2); printf("%s\n",str); }

26.结构体 (1) int main() {

struct Student{ int num; char name[20]; float score; }stu1,stu2; scanf("%d%s%f",&stu1.num,stu1.name,&stu1.score); scanf("%d%s%f",&stu2.num,stu2.name,&stu2.score); printf(“the higher score is: \n”); if(stu1.score>stu2.score) printf("%d %s %f\n",stu1.num,stu1.name,stu1.score); if(stu1.score<stu2.score) printf("%d %s %f\n",stu2.num,stu2.name,stu2.score);

}

(2)统计投票 struct Person{ char name[20]; int count; }leader[3]={“li”,0,“ux”,0,“sad”,0}; //定义的顺序必须一致 int main() { int i,j; char leader_name[20]; for(i=1;i<=10;i++){ scanf("%s",leader_name); for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;//输入的名字和候选人相等就执行 } printf("\n result is:\n"); for(i=0;i<3;i++) printf("%s %d\n",leader[i].name,leader[i].count); }

(3)利用选择排序进行输出排序 #include<stdio.h> #include<math.h> #include<string.h>

#define N 10 #define M 5

struct Student{ int num; char name[20]; float score;; }; int main() { struct Student stu[5]={{12,“yx”,64},{5,“y”,74},{2,“yxx”,44},{1,“yc”,4},{182,“x”,24}}; struct Student temp; int n=5; int i,j,k; printf(“the order is:”); for(i=0;i<n-1;i++){ k=i; for(j=i+1;j<n;j++) if(stu[j].score>stu[k].score) k=j; temp=stu[k]; stu[k]=stu[i]; stu[i]=temp; } for(i=0;i<n;i++) printf("%d %s %f\n",stu[i].num,stu[i].name,stu[i].score); }

(4)结构体函数 (4.1) #define N 3 #define M 5

struct Student{ int num; char name[20]; float score[3]; float ave; };

void input(struct Student stu[]){ int i; printf(“input info: “); for(i=0;i<N;i++){ scanf(”%d %s %f %f %f\n:”,&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3; } }

struct Student max(struct Student stu[]){ //结构体函数 int i,m; for(i=0;i<N;i++) if(stu[i].ave>stu[m].ave) m=i; return stu[m]; }

void print(struct Student s){ printf(“max grade: “); printf(”%d %s %f %f %f\n:”,s.num,s.name,s.score[0],s.score[1],s.score[2],s.ave); }

int main() { struct Student stu[N]; struct Student *p; p=stu; input§; print(max§); } (4.2) struct stu{ int num; char name[20]; float score; };

struct stu findmax(struct stu s[],int n){ int i,k=0; float max=s[0].score; for(i=1;i<n;i++) if(s[i].score>max){ max=s[i].score; k=i; } return s[k]; }

int main() { struct stu s[5]; struct stu s; s=findmax(s,5); }

(5)链表 (5.1)静态 (5.2)动态 #include<stdio.h> #include<math.h> #include<string.h>

#define N 3 #define M 5

struct Student{ int num; float score; struct Student *next; };

int n; struct Student *creat(void){ struct Student *head; struct Student *p1,*p2; n=0; p1=p2=(struct Student *)malloc(sizeof(struct Student)); scanf("%d%f",&p1->num,&p1->score); head=NULL; while(p1->num!=0){ n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct Student *)malloc(sizeof(struct Student)); scanf("%d%f",&p1->num,&p1->score); } p2->next=NULL; return head; }

void print(struct Student head){ struct Student *p; printf("%d records are:\n",n); p=head; if(head!=NULL) do{ printf("%d %f",p->num,p->score); p=p->next; }while(p!=NULL); }

int main() { struct Student *pt; pt=creat(); print(pt); } (5.3)带头节点建立单链表 struct list{ int data; struct list *next; };

struct list *creat(){ struct list *p,*q,*ph; int a; ph=(struct list *)malloc(sizeof(struct list)); p=q=ph; printf(“input an num:”); scanf("%d",&a); while(a!=-1){ p=(struct list *)malloc(sizeof(struct list)); p->data=a; q->next=p; q=p; scanf("%d",&a); } p->next=’\0’; return ph; }

int main() { struct list *head; head=creat(); } (5.4)插入

(6)计算该日在本年中第几天 struct Day{ int year; int month; int day; }d;

int date(struct Day d){ int smonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义的十二个月的天数 int i,sum=0; for(i=0;i<d.month;i++) sum+=smonth[i]; sum+=d.day; if(d.month>2&&((d.year%40&&d.year%100!=0)||d.year%4000)) sum++; return sum; }

int main() { int n; printf(“年 月 日\n”); scanf("%d%d%d",&d.year,&d.month,&d.day); n=date(d); printf("%d %d %d %d",d.year,d.month,d.day,n); }

(7)输入输出学生成绩 struct Student{ int num; char name[20]; int score[3]; }stu[5];

int print(struct Student s[]){ int i,j; for(i=0;i<5;i++){ printf("%d %s\n",s[i].num,s[i].name); for(j=0;j<3;j++) printf("%d\n",s[i].score[j]); printf("\n"); } }

int main() { printf(“num name score \n”); int i,j; for(i=0;i<5;i++){ printf(“no. %d\n”,i+1); scanf("%d",&stu[i].num); printf(“name. %d\n”,i+1); scanf("%d",&stu[i].name); printf(“score. %d\n”,i+1); for(j=0;j<3;j++) scanf("%d",&stu[i].score[j]); } print(stu); }

(8)平均分练习+统计高分 struct Student{ int num; char name[20]; int score[3]; }stu[5];

int input(struct Student s[]){ int i,j; for(i=0;i<5;i++){ printf(“no is %d\n”,i+1); scanf("%d",&s[i].num); printf(“name is %d\n”,i+1); scanf("%d",&s[i].name); printf(“three score is %d\n”,i+1); for(j=0;j<3;j++) scanf("%d",&s[i].score[j]); } }

int print(struct Student s[]){ int i,j; float sum[3]={0}; printf(“three course ave:\n”); for(j=0;i<3;j++){ for(i=0;i<5;i++) sum[j]+=s[i].score[j]; printf("%f\n",sum[j]/4); } float max=s[0].score[0]; int m,n; for(i=0;i<5;i++){ for(j=0;j<3;j++) if(max<s[i].score[j]){ max=s[i].score[j]; m=i; n=j; } } float aver=0; for(j=0;j<3;j++) aver+=s[m].score[j]; printf(“最高分为:%2.2f\n”,max); printf(“最高分的学生的数据为:\n”); printf("%4d %4s %4.2d %4.2d %4.2d %4.2f\n",s[m].num,s[m].name,s[m].score[0],s[m].score[1],s[m].score[2],aver/3); }

int main() { printf(“num name score \n”); input(stu); print(stu); }

27文件 (1)输入输出字符 (1.1)输入 #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h>

#define N 3 #define M 5

int main() { FILE *fp; char ch; if((fp=fopen(“file1.txt”,“w”))==NULL){ printf(“cant open file\n”); exit(0); } ch=getchar(); while(ch!=’#’){ fputc(ch,fp); ch=getchar(); } fclose(fp); } (1.2)输出 FILE *fp; char ch; if((fp=fopen(“file1.txt”,“r”))==NULL){ printf(“cant open file\n”); exit(0); } ch=fgetc(fp);//先执行一次读操作,判断文件是否结束 while(ch!=EOF){ putchar(ch); ch=fgetc(fp); } fclose(fp);

(2)字符串读写 (2.1)写入字符 int main() { FILE *fp; char str[20]; if((fp=fopen(“file1.txt”,“w”))==NULL){ printf(“cant open file\n”); exit(0); } printf(“input one string: “); scanf(”%s”,str); fputs(str,fp); fputc(’\n’,fp);//将换行符存入文件 printf(“input two string: “); scanf(”%s”,str); fputs(str,fp); fputc(’\n’,fp); fclose(fp); } (2.2)读出字符 int main() { FILE *fp; char str1[20],str2[20]; if((fp=fopen(“file1.txt”,“r”))==NULL){ printf(“cant open file\n”); exit(0); } fgets(str1,21,fp); fgets(str2,21,fp); printf("%s",str1); printf("%s",str2); fclose(fp); } (2.3)读回字符串 int main() { FILE *fp; char str[3][10]; int i=0; if((fp=fopen(“file1.dat”,“w”)==NULL)){ printf(“cant open file \n”); exit(0); } while(fgets(str[i],10,fp)!=NULL){ printf("%s",str[i]); i++; } fclose(fp); }

(3)数据块读写 (3.1)读入读出 struct stu{ int num; char name[10]; char addr[15]; }s1[2],s2[2];

int main() { FILE *fp; int i; if((fp=fopen(“file3.txt”,“wb+”)==NULL)){ printf(“cant open file \n”); exit(0); } printf(“input two stu’s info:”); for(i=0;i<2;i++) scanf("%d%s%s",&s1[i].num,s1[i].name,s1[i].addr); fwrite(s1,sizeof(struct stu),2,fp);//读入 rewind(fp);//使fp重新指向文件首 fread(s2,sizeof(struct stu),2,fp);//读出 for(i=0;i<2;i++) printf("%d %s %s、",s2[i].num,s2[i].name,s2[i].addr); fclose(fp); } (3.2)函数读入 struct Student{ char name[10]; int num; int age; char addr[15]; }stu[SIZE];

void save(){ FILE *fp; int i; if((fp=fopen(“stu.dat”,“w”)==NULL)){ printf(“cant open file \n”); exit(0); } for(i=0;i<SIZE;i++){ if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1) printf(“file error!”); fclose(fp); } }

int main() { int i; printf(“input data:\n”); for(i=0;i<SIZE;i++) scanf("%s%d%d%s",&stu[i].name,&stu[i].num,&stu[i].age,&stu[i].addr); save(); } (3.3)输入1 3 5 7学生的数据并显示 struct Student{ char name[10]; int num; int age; char addr[15]; }stu[10];

int main() { int i; FILE fp; if((fp=fopen(“stu.dat”,“rb”)==NULL)){ printf(“cant open file \n”); exit(0); } for(i=0;i<10;i+=2){ fseek(fp,isizeof(struct Student),0); fread(&stu[i],sizeof(struct Student),1,fp); printf("%s %d %d %s\n",stu[i].name,stu[i].num,stu[i].age,stu[i].addr); } fclose(fp); } (3.4)建立写入文本文件内容 int main() { FILE *fp; char msg[]=“this is a text”; char buf[20]; if((fp=fopen(“abc”,“w+”))==NULL){ printf(“cant open the file:”); exit(1); } fwrite(msg,strlen(msg)+1,1,fp); fseek(fp,SEEK_SET,0); fread(buf,strlen(msg)+1,1,fp); printf("%s\n",buf); fclose(fp); }

(4)复制 (4.1)复制到另一磁盘 int main() { FILE *in,*out;//*fp1,*fp2; char ch,infile[10],outfile[10]; printf(“input file1’s name: “); scanf(”%s”,infile); printf(“input file2’s name: “); scanf(”%s”,outfile); if((in=fopen(infile,“r”))==NULL){ printf(“cant open file\n”); exit(0); } if((out=fopen(outfile,“w”))==NULL){ printf(“cant open file\n”); exit(0); } ch=fgetc(in); while(!feof(in)){ fputc(ch,out); //putchar(ch); ch=fgetc(in); } fclose(in); fclose(out); } (4.2)先输出 后复制到另一文件 int main() { char ch; FILE *fp1,fp2; fp1=fopen(“file1.dat”,“r”); fp2=fopen(“file2.dat”,“w”); ch=getc(fp1); while(!feof(fp1)){ putchar(ch); ch=getc(fp1); } putchar(10); rewind(fp1); ch=getc(fp1); while(!feof(fp1)){ fputc(ch,fp2); ch=fgetc(fp1); } fclose(fp1); fclose(fp2); }

(5)输入n个字符排序输出 int main() { FILE *fp; char str[3][10],temp[10]; int i,j,k,n=3; printf(“input strings:\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(“file1.dat”,“w”)==NULL)){ printf(“cant open file \n”); exit(0); } printf(“now order:\n”); for(i=0;i<n;i++){ fputs(str[i],fp); fputs(”\n”,fp); printf("%s\n",str[i]); } }

(6)大小写转换 (6.1)大小写转换+输出到指定文件 int main() { FILE *fp; char str[100]; int i=0; if((fp=fopen(“a1”,“w”))NULL) { printf(“cant open the file!\n”); exit(0); } printf(“input a string”); 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(“a1”,“r”); fgets(str,strlen(str)+1,fp); printf("%s\n",str); fclose(fp); } (6.2)存入数据转换输出大小写 int main() { int i,flag; char str[80],c; FILE *fp; fp=fopen(“text”,“w”); flag=1; while(flag0){ printf(“input string:\n”); gets(str); fprintf(fp,"%s",str); printf(“continue “); c=getchar(); if((c==‘N’)||(c==‘n’)) flag=0; getchar(); } fclose(fp); fp=fopen(“text”,“r”); while(fscanf(fp,”%s”,str)!=EOF){ for(i=0;str[i]!=’\0’;i++) if((str[i]>=‘a’)&&(str[i]<=‘z’)) str[i]-=32; puts(str); } fclose(fp); }

(9)学生结构体 (9.1)输出平均分文件 struct Student{ char num[5]; char name[10]; int score[3]; float ave; }stu[5];

int main() { int i,j,sum; FILE *fp; for(i=0;i<5;i++){ printf("\ninput score of stu %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; } fp=fopen(“stud”,“w”); for(i=0;i<5;i++) if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1) printf(“fille error\n”); fclose(fp); fp=fopen(“stud”,“w”); for(i=0;i<5;i++) { fread(&stu[i],sizeof(struct Student),1,fp); printf("%s %s %d %d %d %f",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); } } (9.2)输出平均分排序 struct Student{ char num[5]; char name[10]; int score[3]; float ave; }stu[M],temp;

int main() { int i,j,n; FILE *fp; //读文件 if((fp=fopen(“stud”,“r”))==NULL) { printf(“cant open the file!\n”); exit(0); } printf(“file stud:”); for(i=0;fread(&stu[i],sizeof(struct Student),1,fp);i++){ printf("%s %s",stu[i].num,stu[i].name); for(j=0;j<3;j++) printf("%d",stu[i].score[j]); printf("%f",stu[i].ave); } printf("\n"); fclose(fp); n=i; //排序 for(i=0;i<n;i++) for(j=i+1;j<n;j++) if(stu[i].ave<stu[j].ave){ temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; } //输出 printf("\n now:"); fp=fopen(“stu_sort”,“w”); for(i=0;i<n;i++){ fwrite(&stu[i],sizeof(struct Student),1,fp); printf("%s %s",stu[i].num,stu[i].name); for(j=0;j<3;j++) printf("%d",stu[i].score[j]); printf("%f",stu[i].ave); } printf("\n"); fclose(fp); } (9.3)对排好的进行插入 struct Student{ char num[5]; char name[10]; int score[3]; float ave; }stu[10],s;

int main() { int i,j,t,n; FILE *fp,*fp1; printf("\n no.😊; scanf("%s",s.num); printf("\n name.😊; scanf("%s",s.name); printf("\n sco1 sco2 sco3:"); scanf("%d%d%d",&s.score[0],&s.score[1],&s.score[2]); s.ave=(s.score[0]+s.score[1]+s.score[2])/3; //读文件 if((fp=fopen(“stu_sort”,“r”))==NULL) { printf(“cant open the file!\n”); exit(0); } printf(“original data:”); for(i=0;fread(&stu[i],sizeof(struct Student),1,fp);i++){ printf("%s %s",stu[i].num,stu[i].name); for(j=0;j<3;j++) printf("%d",stu[i].score[j]); printf("%f",stu[i].ave); } n=i; for(t=0;stu[t].ave>s.ave&&t<n;t++) //写数据 printf("\n now \n") ; fp1=fopen(“sort1.dat”,“w”); for(i=0;i<t;i++){ fwrite(&stu[i],sizeof(struct Student),1,fp1); printf("%s %s",stu[i].num,stu[i].name); for(j=0;j<3;j++) printf("%d",stu[i].score[j]); printf("%f",stu[i].ave); } fwrite(&s,sizeof(struct Student),1,fp1); printf("%s %s %d %d %d %f",s.num,s.name,s.score[0],s.score[1],s.score[2],s.ave); for(i=t;i<n;i++){ fwrite(&stu[i],sizeof(struct Student),1,fp1); printf("%s %s",stu[i].num,stu[i].name); for(j=0;j<3;j++) printf("%d",stu[i].score[j]); printf("%f",stu[i].ave); } printf("\n"); fclose(fp); fclose(fp1); }

28.常用算法 (1)二分法判断零点 int main() { float a=-10,b=10,c,exp=1e-5; while((b-a)>exp){ c=(a+b)/2; if(f©==0) break; else if(f(a)*f©<0) b=c; else a=c; } printf(“root=%f\n”,c); }

(2)

最新回复(0)