C语言-指针、数组、结构体、分支、循环混合使用
1、写一个程序,输出如下内容:
1 //############################################################# 2 //### name number math english computer ### 3 //### zhanghua ,9901, 80.5, 87.0, 80.0 ### 4 //### lina ,9902, 70.0, 80.0, 90.0 ### 5 //### wanggang ,9903, 87.0, 76.0, 78.0 ### 6 //#############################################################
程序代码:
1 struct score{ 2 char *name; 3 int number; 4 float math; 5 float english; 6 float computer; 7 }; 8 9 struct score sc[3] = { 10 {"zhanghua", 9901, 80.5, 87, 80}, 11 {"lina", 9902, 70, 80, 90}, 12 {"wanggang", 9903, 87, 76, 78}, 13 }; 14 printf("name number math english computer\n"); 15 16 for (int i=0; i<3; i++) { 17 printf("%-9s,%d,%10.1f,%10.1f,%10.1f\n",sc[i].name, sc[i].number,sc[i].math,sc[i].english,sc[i].computer); 18 }
回车后输出:
1 name number math english computer 2 zhanghua ,9901, 80.5, 87.0, 80.0 3 lina ,9902, 70.0, 80.0, 90.0 4 wanggang ,9903, 87.0, 76.0, 78.0 5 Program ended with exit code: 0
2,计算2+4+6+8+。。。+100
1 int sum = 0; 2 for (int i=2; i<=100; i+=2) { 3 sum+=i; 4 } 5 printf("2+4+6+8+...+100=%d.\n",sum);
回车后输出:
1 2+4+6+8+...+100=2550. 2 Program ended with exit code: 0
3、计算1到100之间的奇数和与偶数和
1 int jsum = 0; 2 int osum = 1; 3 4 for (int i=1 ;i<=100 ; i++) { 5 if (i%2) { 6 jsum+=i; 7 }else{ 8 osum+=i; 9 } 10 } 11 12 printf("jsum=%d,\tosum=%d\n", jsum, osum);
回车后输出:
1 jsum=2500, osum=2551 2 Program ended with exit code: 0
4、求1到100的非素数之和
1 int sum = 0; 2 int j= 0 ; 3 for (int i=1; i<=100; i++) { 4 for (j=2; j<i; j++) { 5 if (i%j==0) { 6 break; 7 } 8 } 9 if (j!=i) { 10 sum=sum+i; 11 printf("%d\t",i); 12 } 13 } 14 printf("\n%d\n",sum);
回车后输出:
1 jsum=2500, osum=2551 2 Program ended with exit code: 0
5、调用子函数实现1到100的非素数和,其中子函数判断数字是否非素数,如果非素数,则返回
主函数:
1 int sum = 0; 2 for (int i = 1 ; i<=100; i++) { 3 sum += sushu(i); 4 } 5 printf("%d\n", sum);
子函数:
1 int sushu(int n){ 2 int i; 3 for (i=2; i<n; i++) { 4 if (n%i==0) { 5 break; 6 } 7 } 8 if (n!=i) { 9 return 0; 10 }else{ 11 return n; 12 } 13 }
输出:
1 3990 2 Program ended with exit code: 0
6、有一个四位正整数,组成着四个正整数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位数互换,组成一个新的四位数,原来四位数刚好是新四位数的4倍,求这样的四位数:
1 int a = 0; 2 int b = 0; 3 for (int i=1; i<10; i++) { 4 for (int j=0; j<10; j++) { 5 for (int k=0; k<10; k++) { 6 for (int l=1; l<10; l++) { 7 a=1000*i+100*j+10*k+l; 8 b=1000*l+100*k+10*j+i; 9 if (a==4*b && i!=j &&j!=k && k!=l) { 10 printf("%d\t",a); 11 } 12 } 13 } 14 } 15 } 16 printf("\n");
输出:
1 8712 2 Program ended with exit code: 0
7、两个乒乓球队进行比赛,各处三个人,甲队为A,B,C三人,乙队为X,Y,Z三人,其中A不和X比,C不和X,Z比,请编程找出三对赛手的名单:
1 //设A=1,B=2,C=3. 2 3 int x,y,z; 4 for (x=1; x<4; x++) { 5 for (y=1; y<4; y++) { 6 for (z=1; z<4; z++) { 7 if ((x+y+z)==6 && (x!=1) && (x!=3) && (z!=3) &&(x!=y) && (y!=z)) { 8 printf("x=%d\ty=%d\tz=%d", x, y, z); 9 } 10 } 11 } 12 }
输出:
x=2 y=3 z=1 Program ended with exit code: 0
8、对一个3*3的二维数组进行转置,即行列互换
1 int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 2 int tmp = 0; 3 4 for (int i=0; i<3; i++) { 5 for (int j=i+1; j<3; j++) { 6 tmp = a[i][j]; 7 a[i][j] = a[j][i]; 8 a[j][i] = tmp; 9 } 10 } 11 12 for (int i=0; i<3; i++) { 13 for (int j=0; j<3; j++) { 14 printf("%d\t",a[i][j]); 15 } 16 printf("\n"); 17 }
输出:
1 1 4 7 2 2 5 8 3 3 6 9 4 Program ended with exit code: 0
9、输入20个正整数,判断是否素数,如果是则排序。
主函数:
1 int a[20] = {0}; 2 int b[20] = {0}; 3 4 printf("请输入20个正整数\n"); 5 6 for (int i=0; i<20; i++) { 7 scanf("%d",&a[i]); 8 b[i] = sushu(a[i]); 9 } 10 11 rank(b, 20); 12 13 for (int i=0; i<20; i++) { 14 if (b[i]>0) { 15 printf("%d\t",b[i]); 16 } 17 } 18 19 printf("\n");
rank()子函数(使用选择法排序):
1 void rank(int *p, int n){ 2 int max = 0; 3 int tmp = 0; 4 for (int i=0; i<n-1; i++) { 5 max=i; 6 for (int j=i+1; j<n;j++) { 7 if (*(p+max)<*(p+j)) { 8 max = j; 9 } 10 } 11 12 if (i!=max) { 13 tmp = *(p+max); 14 *(p+max) = *(p+i); 15 *(p+i) = tmp; 16 } 17 } 18 }
10、输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:①输入10个数;②进行处理;③输出10个数。
主函数:
1 int a[10] = {0}; 2 printf("请输入十个数:\n"); 3 inputnum(a); 4 deal(a, 10); 5 output(a, 10);
输入、输出、处理子函数:
1 // 输入十个数子函数 2 void inputnum(int *a){ 3 4 for (int i=0;i<10 ; i++) { 5 scanf("%d",&a[i]); 6 } 7 8 } 9 10 // 处理函数:将其中最小的数与第一个数对换,把最大的数与最后一个数对换 11 void deal(int *p, int n){ 12 int max=0,min=0; 13 int tmp=0,i=0,j=0; 14 max=i; 15 for (i=0; i<n;i++) { 16 if (*(p+max)<*(p+i)) { 17 max=i; 18 } 19 20 } 21 tmp = *(p+max); 22 *(p+max) = *(p+0); 23 *(p+0) = tmp; 24 25 min=j; 26 for (j=0; j<n;j++) { 27 if (*(p+min)>*(p+j)) { 28 min=j; 29 } 30 } 31 32 tmp = *(p+min); 33 *(p+min) = *(p+n-1); 34 *(p+n-1) = tmp; 35 } 36 37 // 输出函数 38 void output(int *p, int n){ 39 for (int i=0; i<n; i++) { 40 printf("%d\t",p[i]); 41 } 42 printf("\n"); 43 }
11、使用子函数对数列排序:
主函数:
1 int main() { 2 3 int a[5] = {90, 50, 80, 70, 60,}; 4 5 rank(a,5); 6 7 for (int i=0; i<5; i++) { 8 printf("%d\t", a[i]); 9 } 10 11 printf("\n"); 12 13 return 0; 14 }
子函数:
1 void rank(int * p, int n){ 2 3 int max = 0; 4 int tmp = 0; 5 6 for (int i=0; i<n-1; i++) { 7 max=i; 8 for (int j=i+1; j<n; j++) { 9 if (*(p+max)<*(p+j)) { 10 max=j; 11 } 12 } 13 if (i!=max) { 14 tmp = *(p+i); 15 *(p+i) = *(p+max); 16 *(p+max) =tmp; 17 } 18 } 19 }
12、有n个学生,每个学生的数据包括学号(num),姓名(name[20]),性别(sex),年龄(age),
三门课的成绩(score[3])。要求在main函数中输入这n个学生的数据, 然后调用一个函数count,在该函数中计算出每个学生的总分和平均分, 然后打印出所有各项数据(包括原有的和新求出的)。
1 int i; 2 float s0,s1,s2; 3 4 struct student a[3]; 5 6 for(i=0;i<3;i++) { 7 scanf("%d%s %c%d%f%f%f",&a[i].num, a[i].name, &a[i].sex,&a[i].age, &s0, &s1, &s2); 8 a[i].score[0]=s0;a[i].score[1]=s1;a[i].score[2]=s2; 9 printf("%d %s %c %d %4.1f %4.1f %4.1f\n",a[i].num,a[i].name, a[i].sex,a[i].age,a[i].score[0],a[i].score[1],a[i].score[2]); 10 } 11 count(a,3); 12 printf("=============================================\n"); 13 printf("NO name sex age score[0] score[1] score[2] total ave\n"); 14 15 for(i=0;i<3;i++) 16 printf("%d %s %c %d %5.1f %5.1f %5.1f %5.1f %5.1f\n", a[i].num,a[i].name,a[i].sex,a[i].age,a[i].score[0], a[i].score[1],a[i].score[2],a[i].total,a[i].ave); 17 18 19 return 0;
结构体定义:
1 struct student 2 { 3 int num; 4 char name[20]; 5 char sex; 6 int age; 7 float score[3]; 8 float total; 9 float ave; 10 };
count()子函数:
1 void count(struct student * b,int n) { 2 int i,j; 3 for(i=0;i<n;i++) { 4 for(j=0;j<3;j++) 5 b[i].total+= b[i].score[j]; 6 b[i].ave=b[i].total/3; 7 } 8 }