C基础的练习集及测试答案(31-39)

31、读懂以下程序,说明程序的功能
#include<stdio.h>
int main()
{
int m,n,r,m1,m2;
printf("请输入2个正整数:");
scanf("%d%d",&m1,&m2);
m=m1;
n=m2;
do{
r=m%n;
m=n;
n=r;
}while(r!=0);
printf("%d\n",m);
return 0;
}

//31、读懂以下程序,说明程序的功能
#include<stdio.h>
int main()
{
    int m,n,r,m1,m2;
    printf("请输入2个正整数:");
    scanf("%d%d",&m1,&m2);
    m=m1;
    n=m2;
    do{
        r=m%n;
        m=n;
        n=r;
    }while(r!=0);
    printf("%d\n",m);
    return 0;
}


32、一个数如果恰好等于它的所有的因子之和,则这个数就称为“完数”。例如6的因子有1、2、3,而1+2+3=6,因此6是一个完数。编程找出1000内所有的完数。

 

 1

  #if 0
  32、一个数如果恰好等于它的所有的因子之和,则这个数就称为“完数”。例如6的因子有1、2、3,而1+2+3=6,因此6是一个完数。
  编程找出1000内所有的完数。

  思路分级:
  一。遍历2-1000内的所有数。
  二。寻找每个数所有的公约数累加等于本身则为完数。
  #endif

 5 #include<stdio.h>
 6 int main(){
 7     
 8     int num=0;
 9     for(num=2;num<1000;num++){
10         int sum=0;
11         int i=1;
12         for(i=1;i<=num/2;i++){
13             if(num%i==0){
14                 
15                 sum+=i;
16             }
17         }
18         if(num==sum){
19             printf("%d:是一个完数\n",sum);
20         }
21     }
22     
23     
24     return 0;
25 }

 

 


33、(课堂)思考这个宏定义错在哪里
#define S (r) PI*r*r//注意S与(r)之间有空格


34、我们在头文件(.h文件)中,经常看到这样的内容
#ifndef __H_INCLUDE__
#define __H_INCLUDE__
//头文件的实际内容
#endif
思考头文件的开头和结尾需要这样书写的原因。


35、(课堂)运行以下程序
int main()
{
char a,b;
a = getchar();
b = getchar();
putchar(a);
putchar(b);
return 0;
}
运行程序,输入x回车y回车,会发现输出的并不是xy,而是
x

思考这是为什么。


36、(课堂)使用数组存储斐波那契数列前40项,并输出

 

 1

  #if 0
  36、(课堂)使用数组存储斐波那契数列前40项,并输出

  解题思路:
  一。创建一个长度为40的数组。
  二。将第一第二个元素置为1;
  三。遍历数组 第N个元素的值为 元素(N-1)+元素(N-2);
  #endif

 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 int *fibonacci(int len){
 5     int *p;
 6     int i;
 7     
 8     if(NULL==(p=(int *)malloc(sizeof(int)*len))){
 9         perror("cannot malloc");
10         return NULL;    
11     }
12     p[0]=1;
13     p[1]=1;
14     for(i=2;i<len;i++){
15         p[i]=p[i-1]+p[i-2];
16         
17     }
18     return p;
19 }
20 void print(int p[],int len){
21     int i;
22     for(i=0;i<len;i++){
23         printf("p[%d]=%d\t",i+1,p[i]);
24         
25     }
26     
27 }
28 
29 
30 int main(){
31     int *fib;
32     fib=fibonacci(40);
33     
34     print(fib,40);
35     
36     return 0;
37 }

 

 


37、(课堂)从键盘输入10个学生的成绩,如果遇到大于100或者小于0的成绩需要提示输入错误重新输入。之后计算10个学生的总成绩和平均成绩

  #if 0
  37、(课堂)从键盘输入10个学生的成绩,如果遇到大于100或者小于0的成绩需要提示输入错误重新输入。
  之后计算10个学生的总成绩和平均成绩

  解题思路:
  一。创建长度为十的数组表示学生成绩
  二。在输入时判断数值是否合法。
  三。遍历数组累加 求总成绩和平均成绩
  #endif

 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 int *getmemory(int len){
 7     int *p;
 8     if(NULL==(p=(int *)malloc(sizeof(int)*len))){
 9         perror("cannot malloc");
10         return NULL;
11         
12     }
13     return p;
14 }
15 
16 void my_scanf(int p[],int len){
17     int i;
18     
19     for(i=0;i<len;i++){
20         printf("请输入第%d个学生成绩:\n",i+1);
21         //scanf("%d",&p[i]);
22         int grade=0;
23         scanf("%d",&grade);
24         if(grade<0||grade>100){
25             printf("成绩区间为1至100");
26             i--;
27         }else{
28             p[i]=grade;
29         }
30     }
31     
32 }
33 
34 
35 void my_printf(int p[],int len){
36     int i;
37     
38     for(i=0;i<len;i++){
39         
40         printf("第 %d个学生的成绩;%d",i+1,p[i]);
41     }
42     
43 }
44 
45 int my_sum(int p[],int len){
46     int i=0;
47     int sum=0;
48     
49     for(i=0;i<len;i++){
50         sum+=p[i];
51         
52     }
53     return sum;
54     
55 }
56 
57 double my_ave(int p[],int len){
58     double ave;
59     
60     ave=my_sum(p,len)/len;
61     
62     
63     return ave;
64     
65 }
66 
67 int main(){
68     int num;
69     int *stu;
70     
71     printf("需要输入几个学生的成绩");
72     scanf("%d",&num);
73     stu=getmemory(num);//创建容器
74     
75     my_scanf(stu,num);//输入数据
76     
77     //my_printf(stu,num);//输出数据
78     
79     int sum=my_sum(stu,num);//求和
80     printf("学生的总成绩:%d",sum);
81     
82     
83     double ave=my_ave(stu,num);//求平均
84     printf("学生的平均成绩:%lf",ave);
85     
86     return 0;
87 }

 


38、(课堂)冒泡排序
从键盘输入10个各不相同的整数,存储在数组中,使用冒泡排序法将数组排序并输出
冒泡排序:是一种简单的排序算法
1)比较相邻的元素和其身后的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。一次循环过后,最后的元素应该会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 1 #if 0
 2 38、(课堂)冒泡排序
 3 从键盘输入10个各不相同的整数,存储在数组中,使用冒泡排序法将数组排序并输出
 4 冒泡排序:是一种简单的排序算法
 5 1)比较相邻的元素和其身后的元素。如果第一个比第二个大,就交换他们两个。
 6 2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。一次循环过后,最后的元素应该会是最大的数。
 7 3)针对所有的元素重复以上的步骤,除了最后一个。
 8 4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
 9 
10 #endif
11 #include<stdio.h>
12 
13 void my_scanf(int a[],int len){
14     int i=0;
15     for(i=0;i<len;i++){
16         
17         printf("请输入第 %d个元素",i+1);
18         scanf("%d",&a[i]);
19         
20     }
21     
22 }
23 void bubblesort(int a[],int len){
24     int i,j;
25     for(i=0;i<len-1;i++){
26         
27         for(j=0;j<len-1-i;j++){
28             if(a[j]<a[j+1]){
29                 a[j]^=a[j+1];
30                 a[j+1]^=a[j];
31                 a[j]^=a[j+1];
32                 
33             }
34             
35         }
36     }
37     
38 }
39 
40 void my_printf(int a[],int len){
41     int i=0;
42     for(i=0;i<len;i++){
43         printf("a[%d]=%d\n",i+1,a[i]);
44         
45     }
46     
47 }
48 int main(){
49     int a[10]={0};
50     my_scanf(a,10);
51     
52     bubblesort(a,10);
53     
54     my_printf(a,10);
55     
56     return 0;
57 }


39、(课堂)自定义一个3*4的矩阵,输出矩阵中值最大的元素,并输入其数组下标

 

 1

  #if 0
  39、(课堂)自定义一个3*4的矩阵,输出矩阵中值最大的元素,并输入其数组下标
  解题思路:
  一。构建一个3*4的矩阵,然后给矩阵内的每个元素赋值。
  二。创建三个变量分别存放最大值及其坐标
  三。遍历矩阵得到最大值及其坐标

  错误分析:
  应该定义一个结构体来存放最大值及其坐标
  #endif

 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 void my_scanf(int (*a),int x,int y){
 7     int i=0,j=0;
 8     for(i=0;i<x;i++){
 9         for(j=0;j<y;j++){
10             printf("请输入第 %d行%d 列的值:\n",i+1,j+1);
11             scanf("%d",&a[(i*(x+1)+j)]);
12             
13         }
14         
15     }
16     
17     for(i=0;i<x;i++){
18         for(j=0;j<y;j++){
19             printf("a[%d][%d]=%d\t",i+1,j+1,a[(i*(x+1)+j)]);
20             //printf("%d\n",(i*(x+1)+j));
21             
22         }
23         
24     }
25     
26 }
27 
28 
29 
30 
31 void max(int (*a),int x,int y){
32     int num,i=0,j=0,sub_i=1,sub_j=1;
33     num=a[0];
34     for(i=0;i<x;i++){
35         for(j=0;j<y;j++){
36             if(num<a[(i*(x+1)+j)]){
37                 num=a[(i*(x+1)+j)];
38                 sub_i=i+1;
39                 sub_j=j+1;
40                 
41                 
42             }
43             
44         }
45         
46     }
47     
48     printf("\nmax:a[%d][%d]=%d",sub_i,sub_j,num);
49     
50 }
51 
52 
53 
54 int main(){
55     //printf("哈哈哈999\n");
56     int a[3][4]={0};
57     //int (*a)=(int *)malloc(sizeof(int)*3*4);
58     
59     //int i=3,j=4;
60     my_scanf(a,3,4);
61     
62     max(a,3,4);
63     
64     //free(a);
65     //a=NULL;
66     
67     return 0;
68 }

 

 

posted @ 2018-08-08 20:39  蓝勃斐重新开始  阅读(345)  评论(0编辑  收藏  举报