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 }

 

posted @ 2016-03-19 11:12  jiwangbujiu  阅读(1149)  评论(0编辑  收藏  举报