C程序设计基础(厦门大学mooc)

1、求圆的周长和面积 

输入圆的半径,计算并输出其周长和面积。常量pi的值取3.14159,周长和面积只输出小数点后2位数字。

输入格式:

输入圆的半径,半径为浮点型数据

输出格式:

第一行输出周长(只显示至小数点后2位数字) 第二行输出面积(只显示至小数点后2位数字)

输入样例:

5

输出样例:

31.42
78.54
 1 #include  
 2 #define PI 3.14159
 3 int main()
 4 {
 5     float r;
 6     scanf("%f",&r);
 7     
 8     printf("%.2f\n%.2f",2*PI*r,PI*r*r);
 9 
10     return 0;
11 }

2、求个、十、百、千、万位数及和 

从键盘输入一个正整数,然后求出它的个位数、十位数、百位数、千位数和万位数,并按样例的格式,打印出这五位数字的和。

输入格式:

输入一个正整数

输出格式:

和(万位数+千位数+百位数+十位数+个位数=和)

输入样例:

123

输出样例:

6(0+0+1+2+3=6)
 1 #include  
 2 
 3 int main()
 4 {
 5     int i,a,b,c,d,e;
 6     scanf("%d",&i);
 7     
 8     a = i/10000%10;
 9     b = i/1000%10;
10     c = i/100%10;
11     d = i/10%10;
12     e = i%10;
13     printf("%d(%d+%d+%d+%d+%d=%d)",a+b+c+d+e,a,b,c,d,e,a+b+c+d+e);
14 
15     return 0;
16 }

3、分段函数 

编写程序,根据分段函数y=f(x)的定义,输入x,输出y的值。

C程序设计基础(厦门大学mooc)_第1张图片

提示:

1、注意数学公式的书写规则:乘号*不能少,开根号用sqrt函数,不要忘记加#include

2、注意条件的书写:在 C 中 -1

允许不同的编程方法

输入格式:

输入x的值,x为浮点型

输出格式:

输出f(x)的值,保留2位小数

输入样例:

-3.1

输出样例:

-60.58
 1 #include
 2 #include 
 3 #include 
 4 int main()
 5 {
 6     float x;
 7     scanf("%f",&x);
 8     if(x<=-1)
 9         printf("%.2f",2*x*x*x-1);
10     else if(x<=0 && x>-1)
11         printf("%.2f",x*x);
12     else if(x<=1 && x>0)
13         printf("%.2f",sqrt(x));
14     else if(x>1)
15         printf("%.2f",3*x+2);
16     return 0;
17 }

4、计算商品金额

某商场清仓,商品打折销售,现需要编一个新的程序:按清仓价格计算出客户应支付的商品金额。

商品清仓价格详情如下:

商品分书籍和水果,按重量分段计费:

(1)1000g以内(含1kg),每重200g(不足200g按200g计算)书籍4.5元,水果7元

(2)1000g以上部分,每重300g(不足300g按300g计算)书籍6元,水果8.5元

提示:

不足200g按200g计算,可以分2种情况考虑(能整除200、不能整除200),可使用 % 运算符。

也允许使用其它方法处理。

MOOC第四周课件“附加例题解析与作业指导”中有“编程作业第2题方法指导”,需要的同学可查阅。

输入格式:

输入两个正整数w、c,以空格分隔,

其中,w代表重量,单位g;c为1或2,1代表书籍,2代表水果。

输出格式:

输出应支付的金额,保留两位小数

输入样例1:

950 1

输出样例1:

22.50

输入样例2:

1500   2

输出样例2:

52.00
 1 #include
 2 
 3 struct price{
 4     float prices[2];
 5     int g;
 6 };
 7 
 8 float fun(int w, int c, struct price pr);
 9 
10 int main()
11 {
12     struct price pr1{4.5, 7, 200}, pr2{6, 8.5, 300};
13     
14     int w, c;  
15     scanf("%d%d",&w, &c);/* 重量 物品种类 */
16     
17     if( w > 1000 )
18         printf("%.2f",fun(1000, c, pr1) + fun( w-1000, c, pr2 ));
19     else
20         printf("%.2f",fun(w, c, pr1));
21     
22     return 0;
23 }
24 
25 float fun(int w, int c, struct price pr)
26 {   
27     float price = pr.prices[c-1];    /* 单价 */
28     int g = pr.g;  /* 计价重量单位 */
29     
30     int add = w%g ? 1 : 0;/* 不足取整 */
31     
32     return ( w/g + add ) * price; 
33 }
 1 #include
 2 
 3 float fun(int w, int c, int flag = 0);
 4 
 5 int main()
 6 {
 7     int w, c;  
 8     scanf("%d%d",&w, &c);/* 重量 物品种类 */
 9     
10     if( w > 1000 )
11         printf("%.2f",fun(1000, c) + fun( w-1000, c, 1 ));
12     else
13         printf("%.2f",fun(w, c));
14     
15     return 0;
16 }
17 
18 float fun(int w, int c, int flag)/* flag分段计费标志 */
19 {   
20     float price1[3] = {0.0,4.5,7};
21     float price2[3] = {0.0,6,8.5};
22     
23     float price = !flag ? price1[c] : price2[c];    
24     int g = !flag ? 200 : 300; /* 计价重量单位 */
25     
26     int add = w%g ? 1 : 0;/* 不足取整 */
27     
28     return ( w/g + add ) * price; 
29 }
 1 #include
 2 #include 
 3 #include 
 4 
 5 float fun(int w,int c,int g, float c1, float c2);
 6 
 7 int main()
 8 {
 9     int w,c;
10     float f=0;
11     scanf("%d%d",&w,&c);
12 
13     int g = 200; float c1=4.5, c2=7;
14     if(w<1000)//不足1000计费
15         f += fun(w,c,g,c1,c2);
16     else{ //超过1000
17         f += fun(1000,c,g,c1,c2);//1000以内计费    
18         
19         w -= 1000;    //超过部分计费
20         g=300,c1=6,c2=8.5;
21         f += fun(w,c,g,c1,c2);
22     }
23     printf("%.2f",f);
24     
25     return 0;
26 }
27 
28 float fun(int w,int c,int g, float c1, float c2)
29 {
30     float f = 0;
31     if(w%g==0){
32         if(c==1){
33             f = w/g*c1;
34         }
35         else{
36             f = w/g*c2;
37         }
38     }
39     else{
40         if(c==1){
41             f = (w/g+1)*c1;
42         }
43         else{
44             f = (w/g+1)*c2;
45         }
46     }
47     return f;
48 }

5、输出满足条件的数据  

输入自然数n,输出1至n之间所有满足用3除余2、用5除余3、用7除余2的数,要求分行输出,每行5个,每个数据占5列。

提示:

(1)可以模仿本周 for语句-----“找符合要求的数”中的例子

(2)输出占5列可以使用 %5d

输入格式:

输入一个自然数n

输出格式:

每行5个,每个数据占5列

输入样例:

1000

输出样例:

23  128  233  338  443
  548  653  758  863  968
 1 #include 
 2 #include 
 3 int main()
 4 {
 5     int n, count=0;
 6     scanf("%d",&n);    
 7     for(int i=1; i<=n; ++i){
 8         if(i%3==2 && i%5==3 && i%7==2){
 9             printf("%5d",i);
10             count++;
11             if(count%5==0)
12                 printf("\n");
13         }
14     }    
15     return 0;
16 }

6、第几天完成长跑任务 

学校进行长跑训练,规定学生第一天训练300米,第二天训练337.5米,第三天训练379.688米,......,后一天训练长度是前一天的 1+1/8倍,输入一个正整数x,判断学生第几天训练的长度开始超过x米?

注意:

在编程中 1/8 要写为1.0/8

可参考本周MOOC课件“附加例题解析”---------“while附加例题”**

输入格式:

输入一个正整数 x

输出格式:

第k天,k为训练的长度刚开始超过x米的天数

输入样例:

10000

输出样例:

第31天
 1 #include 
 2 #include 
 3 int main()
 4 {
 5     int x, count=1;
 6     double sum=300;
 7     scanf("%d",&x);    
 8     while(sum

7、因式分解 

二次三项式G1.JPG ,p>0,q>0,

如果常数项 q 可分解为2个因数a,b的积,并且a+b=p ,那么 G1.JPG 就可分解为(x+a)(x+b) .

编写因式分解的程序,输入p和q的值 ,如果可以因式分解,则输出因式分解的结果;否则,输出“无分解式”。

提示:

(可以模仿本周MOOC for语句-----“判定素数”的例题)

方法引导:(允许不同的编程方法)

1)可以设计一个标志变量flag=0,当有分解式时,置为1。

2) 循环测试不大于sqrt(q)的范围内的每个数,

{  若a是 q 的因数,则b=q/a

       判断是否满足a+b=p,是则有分解

          {  输出分解式

              flag置为1   }

      }

3) 循环结束后,如果flag的值为0,输出“无分解式”.

输入格式:

在一行内输入p、q的值,用空格分隔,其中p、q为整数,p>0,q>0

输出格式:

输出因式分解的结果;不能分解,则输出“无分解式”

输入样例1:

7   6

输出样例1:

(x+1)(x+6)

输入样例2:

7   5

输出样例2:

无分解式
 1 #include 
 2 #include 
 3 int main()
 4 {
 5     int p,q, flag=0;
 6     scanf("%d%d",&p,&q);    
 7     for(int i=1; i<=q*q; ++i){
 8         if(q%i==0 && (i+q/i == p)){
 9             printf("(x+%d)(x+%d)",i,q/i);
10             flag = 1;
11             break;
12         }        
13     }
14     if(!flag)
15         printf("无分解式");    
16     return 0;
17 }

8、输出1~50之间的所有奇数  

用for循环语句编程输出1~50之间的所有奇数,两数之间以空格分隔,同时,最后一个数49之后带一个空格。

输入格式:

输出格式:

两数之间隔1个空格,最后一个数49之后也有一个空格

输入样例:

输出样例:

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
 1 #include 
 2 #include 
 3 int main()
 4 {
 5     for(int i=1; i<50; ++i){
 6         if(i%2){
 7             printf("%d ",i);
 8         }        
 9     }
10     return 0;
11 }

9、计算1+1/2+1/3+1/4+...+1/n的值

输入整数n,计算1+1/2+1/3+1/4+...+1/n的值,并输出。

输入格式:

输入一个整数n

输出格式:

输出公式的和,采用 %f 的格式

输入样例:

200

输出样例:

5.878032
 1 #include 
 2 #include 
 3 int main()
 4 {
 5     float sum = 0;
 6     int n;
 7     scanf("%d",&n);
 8     for(int i=1; i<=n; ++i){
 9         sum += 1.0/i;        
10     }
11     printf("%f",sum);
12     return 0;
13 }

10、统计输入数的个数及平均值。 

输入一组正整数,以-1作为结束标记,统计输入正整数的个数,并计算其平均值。

输入格式:

输入一组正整数,数与数之间用空格分隔,最后一个为-1

输出格式:

分2行输出, 第一行输出个数, 第二行输出平均值,采用%f的输出格式

输入样例:

1 2 3 -1

输出样例:

3
2.000000
 1 #include 
 2 #include 
 3 int main()
 4 {
 5     float sum = 0;
 6     int x, count = 0;
 7     while(scanf("%d",&x) && x>0){
 8         sum += x;
 9         count++;
10     }
11     printf("%d\n%f",count,sum/count);
12     return 0;
13 }

11、珠宝鉴定大赛

某珠宝鉴定大赛,由主持人输入珠宝的真实价格,再由8位参赛选手输入各自估计的价格,估价与真实价格最接近的选手获胜。

(注:程序不考虑估价相同的情况,只需输出一位估价最接近的选手。)

提示:

1、价格是浮点数,求绝对值函数应使用fabs(x)
2、该题是求最小值的题目,求 fabs(估价-真实价格) 的最小值

可参考MOOC第6周课件“附加例题解析”中“求最值及其位置”文档

输入格式:

第一行输入 :珠宝的真实价格

第二行输入 :选手估计的价格(单位:万)

输出格式:

获胜选手的序号

最接近的估价(保留1位小数,使用%.1f)

输入样例:

6.5
0.8    12    3    6.4    9.5    0.75    5.4    71

输出样例:

4
6.4
 1 #include 
 2 #include 
 3 #include 
 4 int main()
 5 {    
 6     int n=8, ti=0;
 7     float key, x, t;
 8     scanf("%f%f",&key,&t);
 9     
10     for(int i=1; i<8; ++i){
11         scanf("%f",&x);
12         if(fabs(key-x)

12、求解马克思手稿中的数学题 

求解马克思手稿中的数学题:

有30个人,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?(男人、女人和小孩都至少有1人)

提示:

可以参照MOOC第六周教学内容: 常用算法举例----穷举法“百鸡问题”

输入格式:

输出格式:

按样例格式输出,每行一个组合,中间用逗号分隔

输入样例:

输出样例:

man=1,woman=18,child=11
man=2,woman=16,child=12
man=3,woman=14,child=13
man=4,woman=12,child=14
man=5,woman=10,child=15
man=6,woman=8,child=16
man=7,woman=6,child=17
man=8,woman=4,child=18
man=9,woman=2,child=19
 1 #include 
 2 #include 
 3 #include 
 4 int main()
 5 {    
 6     int man,woman,child;
 7     for(man=1; man<50/3; ++man){
 8         for(woman=1; woman<50/2; ++woman){
 9             child = 30 - man - woman;
10             if(man*3+woman*2+child==50)
11                 printf("man=%d,woman=%d,child=%d\n",man,woman,child);
12         }
13     }
14     return 0;
15 }

13、判断完数 

一个正整数如果恰好等于它的因子(不包括自己)之和,这个数就称为“完数”。例如,6的因子为1、2、3,且6=1+2+3,因此6是完数。输入一个正整数,判断该数是否为完数。

输入格式:

输入一个正整数

输出格式:

判断结果,是完数 或 不是完数

输入样例1:

6

输出样例1:

是完数

输入样例2:

53

输出样例2:

不是完数
 1 #include 
 2 #include 
 3 #include 
 4 
 5 int sum(int n){
 6     int s=0;
 7     for(int i=1;i

14、最小公倍数 

输入两个正整数m和n,求其最小公倍数。

输入格式:

输入两个正整数m和n,中间用空格分隔

输出格式:

输出最小公倍数

输入样例:

8 6

输出样例:

24
#include
#include

int LCM(int x, int y);
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);   
    printf("%d",LCM(a,b));
    return 0;
}

int LCM(int x, int y){
    int t = x>y?x:y;
    while(x%t||y%t) t--; //最大公约数
    return x/t*y; //最小公倍数
}

15、求多项式的值 

编写函数,计算多项式f(x)=3*x*x*x+2*x*x+5*x+1的值,并返回该值。

提示:

可以模仿MOOC第七周课件“函数的定义、调用、声明”内第一个文档“请先动手做”的例题。

函数接口定义:

在这里描述函数接口。例如:int f(int x) 

其中 x 是用户传入的参数, x 的值不超过int的范围。函数返回 3*x*x*x+2*x*x+5*x+1 的结果。

裁判测试程序样例:

在main函数中调用 f 函数,计算并输出f(1),f(2),f(12),f(15),f(25)的值 请在下面指定位置填写f函数

#include 
int f(int x); int main() { printf("%d\n",f(1)+f(2)+f(12)+f(15)+f(25)); return 0; } /* f(x)函数的代码嵌套在这里 */ 

输出样例:

在这里给出相应的输出。例如:

64489

1 int f(int x)
2 {
3     return 3*x*x*x+2*x*x+5*x+1;
4 }

16、求正整数n从右边开始数的第k个数字

写一个函数int qshu(n,k),求正整数n从右边开始数的第k个数字, 该函数返回这个数字。例如n为12345,k为2,则该函数返回4。

提示:

1、n反复除以10,当除第k-1次后,商的个位数就是第k个数字,再用%10运算取出商的个位数。

2、可以参考MOOC第二周课堂讨论“讨论一类赋值语句的特点”置顶贴的例子

函数接口定义:

int qshu(int n,int k);

其中 n 和 k 都是用户传入的参数。 n、k 的值不超过int的范围,函数须返回 n 从右边数第 k 个数字。

裁判测试程序样例:

在main()中设计测试qshu函数:输入正整数n和k,调用qshu(n,k)函数,根据返回值,输出第k个数字。 请在下面指定位置完善qshu函数

#include
int qshu(int n,int k);
int main()
{
    int n,k;

    scanf("%d",&n);
    scanf("%d",&k);
    printf("%d从右边数的第%d个数是%d",n,k,qshu(n,k));

    return 0;
}
/* 请在这里编写qshu函数 */

输入样例:

12345
2

输出样例:

12345从右边数的第2个数是4
1 int qshu(int n,int k){
2     int num;
3     while(k--){
4         num = n%10;
5         n /= 10;
6     }
7     return num;
8 }

17、求2个数的最小值函数 

编写函数求两个整数的最小值,并返回最小者。

例如,两个整数3与54,则该函数应该返回3。

函数接口定义:

int  min(int x,int y); 

其中 x 和 y 都是用户传入的参数。 x、y 的值不超过int的范围,函数须返回 x 与 y 中的最小值。

裁判测试程序样例:

主函数中通过键盘输入三个整数,通过2次调用min函数,输出其中的最小值。 请在下面指定位置编写min函数

#include 

int min(int x,int y); int main() { int x,y,z; scanf("%d%d%d",&x,&y,&z); printf("最小数是%d",min(min(x,y),z)); return 0; } /* 请在这里编写min函数 */ 

输入样例:

1 4 -2

输出样例:

在这里给出相应的输出。例如:

最小数是-2
int  min(int x,int y){
    return x>y?y:x;
}

18、水仙花数函数 

编写求水仙花数的函数sxhsu(int i):功能判断 i 是否为水仙花数,如果是,则函数返回1;如果不是,则返回0。例如:x如果是153,则该函数应该返回1;x如果是253,则该函数应该返回0。

(水仙花数是指三位数中 个位数的立方+十位数的立方+百位数的立方=该数,例如,153=1的立方+5的立方+3的立方)

函数接口定义:

int sxhs(int i);

其中 i 是用户传入的参数, i 的值不超过int的范围。如果 i 是水仙花数,则函数返回1;如果不是,则返回0。。

裁判测试程序样例:

main()中输入a、b的值(3位数),调用sxhsu函数,求出[a,b]区间中的所有水仙花数,一行输出1个。 请在下面指定位置填写sxhs函数

#include 
int sxhs(int i);
int main() 
{ 
int i,a,b; 
scanf("%d%d",&a,&b);

for(i=a;i<=b;i++) 
  if(sxhs(i)==1) printf("%d\n",i);
} 

/* 请在这里填写sxhs函数 */

输入样例:

100 999

输出样例:

153
370
371
407
1 int sxhs(int i){
2     int a=i%10;
3     int b=i/10%10;
4     int c=i/100;
5     if(a*a*a+b*b*b+c*c*c==i)
6         return 1;
7     return 0;
8 }

19、绘制图形 

编写两个函数:

函数void triangle(int n),该函数的功能是输出由n行星号组成的直角三角形,第一行1个,每行递增2个

函数void rectangle(int n),该函数的功能是输出矩形,n行,每行3个*;

函数接口定义:

void triangle(int n);

其中 n 是用户传入的参数, n 的值不超过int的范围,函数输出由n行星号组成的直角三角形,第一行1个,每行递增2个

void rectangle(int n);

其中 n 是用户传入的参数, n 的值不超过int的范围,函数输出矩形,n行,每行3个*。

裁判测试程序样例:

main函数的功能:第一行输入图形的行数(大于3),第二行输入图形样式号(1或2或3,其中,1---三角形 2---矩形 3---小旗 ),最后输出指定行数的相应图形。 例如,当输入 5 3 输出小旗(小旗由5行的三角形和5行矩形组成) 请在指定的位置填写triangle和rectangle函数

#include 

void triangle(int n);
void rectangle(int n);
int main()
{int k,i;
 scanf("%d",&i);
 scanf("%d",&k);
 if(1==k) triangle(i);
 if(2==k) rectangle(i);
 if(3==k) {triangle(i);rectangle(i);}	
  return 0;
}
/* 请在这里填写函数 */

输入样例:

5
3

输出样例:

*
***
*****
*******
*********
***
***
***
***
***
 1 void triangle(int n){
 2     for(int i=0; i

20、输出问候语

根据用户输入的时间,输出不同的问候语。

要求输入24小时制的时间,当输入:

6:00-11:59,输出“上午好”;

   12:00-17:59,输出“下午好”; 18:00-24:00 或 0:00-5:59,输出“晚上好”。

提示:

(1)在scanf的格式控制字符串中使用冒号 : 设置输入格式,获取小时,可参考“分数输入案例”

(2)可以用3个单分支if语句完成:

如果小时在6-11之间,输出“上午好”

    如果小时在12-17之间,输出“下午好”

    如果小时在18-24或者0-5之间,输出“晚上好”

需要更多样例参考的同学可查阅第3周MOOC课件 “ 选择结构初步 ” 里的最后一个文档 “ 习题解析 ”中第1题

输入格式:

小时:分

输出格式:

问候语

输入样例:

18:00

输出样例:

晚上好
 1 #include 
 2 
 3 int main()
 4 {
 5     int a,b;
 6     scanf("%d:%02d",&a,&b);
 7     if(a>=6 && a<=11)
 8         printf("上午好");
 9     else if(a>=12 && a<=17)
10         printf("下午好");
11     else 
12         printf("晚上好");
13     return 0;
14 }

21、学号信息提取

某学校的学生编号由12位数字组成,其中前3位是学院代码,第4至7位是入学年份,第8-9位是专业代码,最后3位是班级座号,请编程:输入学号,输出该生的入学年份、学院代码、班级座号。

提示:

(1)在scanf函数中使用%md截取所需的数字,可参考MOOC第3周课件“scanf的附加说明项-数据截取”中的案例

(2)输出005时,使用printf的附加说明符%0md

输入格式:

输入学号(由12位数字组成)

输出格式:

输出入学年份、学院代码、班级座号,其中班级座号是3位数,不足3位,前面补0

输入样例:

312201603005

输出样例:

入学年份:2016
学院代码:312
班级座号:005
 1 #include 
 2 
 3 int main()
 4 {
 5     int a,b,d,c;
 6     scanf("%3d%4d%2d%3d",&a,&b,&d,&c);
 7     
 8     printf("入学年份:%d\n学院代码:%d\n班级座号:%03d\n",b,a,c);
 9     
10     return 0;
11 }

22、判断奇偶数

输入一个整数,当它是偶数时,输出“该数是偶数”,否则,输出“该数是奇数”。

输入格式:

输入一个整数

输出格式:

输出判断结果:该数是偶数,或,该数是奇数

输入样例:

5

输出样例:

该数是奇数
 1 #include 
 2 
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     if(n%2)
 8         printf("该数是奇数");
 9     else
10         printf("该数是偶数");
11     return 0;
12 }

23、判断三角形 

输入三角形三条边的长度,判断是否构成三角形。

输入格式:

输入三角形三条边的长度(整型)

输出格式:

输出判断结果,是三角形,或 ,不是三角形

输入样例:

3 4 5

输出样例:

是三角形
 1 #include 
 2 
 3 int main()
 4 {
 5     int a,b,c;
 6     scanf("%d%d%d",&a,&b,&c);
 7     if(a+b>c && b+c>a && c+a>b)
 8         printf("是三角形");
 9     else
10         printf("不是三角形");
11     return 0;
12 }

24、判断成绩是否合格 

输入成绩,如果在0~59之间,则输出不合格,否则,不输出任何结果。

输入格式:

输入成绩,成绩为整数

输出格式:

不合格 或 无输出

输入样例:

56

输出样例:

不合格
 1 #include 
 2 
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     if(n>=0 && n<=59)
 8         printf("不合格");
 9     return 0;
10 }

25、求4个数的最大数 

输入四个整数,输出其中的最大数。

输入格式:

输入四个整数,数与数之间以空格分隔

输出格式:

输出最大数

输入样例:

5 9 12 3

输出样例:

12
 1 #include 
 2 
 3 int fun(int a, int b)
 4 {
 5     return a>b?a:b;
 6 }
 7 
 8 int main()
 9 {
10     int a,b,c,d;
11     scanf("%d%d%d%d",&a,&b,&c,&d);
12     printf("%d",fun(fun(a,b),fun(c,d)));
13     return 0;
14 }

26、歌唱比赛的评分程序 

某歌唱比赛分2阶段:乐理知识竞赛和演唱比赛。每阶段的比赛,评委人数可能不同,要计算出每个阶段选手的平均得分、最高分、最低分。

其中,

         乐理知识平均分=乐理知识评委的总分数/评委的人数
         演唱平均分=演唱评委的总分数/评委的人数

函数接口定义:

编写float statistic(int num)函数与print_m( )函数。

float statistic(int num)函数,其中num是评委的人数,函数的功能是: 输入每位评委的分数,求平均分、最高分、最低分,函数返回值为平均分。 

其中 num 是用户传入的参数, num 的值不超过int的范围。函数须返回平均分。

print_m( )函数,函数的功能是:输出最高分、最低分。

其中  用户传入的参数,函数无返回值。

提示: statistic函数只能用return语句返回一个值(平均分),最高分、最低分无法直接return,可以设计2个全局变量,用于保存并传递每次调用statistic函数求出的最高分、最低分。

裁判测试程序样例:

main()函数,完成如下功能:输入各类评委的人数,2次调用statistic(int num)函数与print_m( )函数,分别求乐理知识、演唱的平均分、最高分、最低分,并输出。

#include 
int main() { int num1,num2; float avg1,avg2; float statistic(int num); void print_m( ); scanf("%d",&num1); //输入乐理评委的人数 avg1= statistic(num1); printf("乐理知识的平均分是%.2f\n",avg1); print_m( ); scanf("%d",&num2); //输入演唱评委的人数 avg2= statistic(num2); printf("演唱的平均分是%.2f\n",avg2); print_m( ); } /* 请在这里填写答案 */ 

输入格式:

第一行按序输入乐理评委的人数、各评委的分数,中间用空格分隔

第二行按序输入演唱评委的人数、各评委的分数,中间用空格分隔

输出格式:

第1-3行按样例格式输出乐理知识的平均分、最高分、最低分,一行一个

第4-6行按样例格式输出演唱的平均分、最高分、最低分,一行一个

输入样例:

3  98.6  96.5  92
5  88    86    85.6  84  87

输出样例:

乐理知识的平均分是95.70
最高分是98.60
最低分是92.00
演唱的平均分是86.12
最高分是88.00
最低分是84.00
 1 float highest,lowest;
 2 float  statistic(int num)
 3 {
 4     float sum = 0,score;
 5     scanf("%f",&score);
 6     highest = score, lowest = score, sum = score;
 7     
 8     for(int i=2; i<=num; ++i){
 9         scanf("%f",&score);
10         if(score>highest)
11             highest = score;
12         if(score

27、求完数(函数练习)

编写判别完数的函数wanshu(int x):功能判断x是否为完数,如果是,则返回1,不是,则返回0。

在main()函数中,输入n,调用判别完数的函数,求出 1-n 以内所有的完数并输出。

输入格式:

输入n,n为整数。

输出格式:

输出完数,一行一个

输入样例:

100

输出样例:

6
28
 1 #include 
 2 
 3 int wanshu(int x){
 4     int sum=0,t=x;
 5     while(--t)
 6     {
 7         if(x%t==0)
 8             sum+=t;
 9     }
10     if(sum==x)
11         return 1;
12     return 0;
13 }
14 int main()
15 {
16   int n;
17   scanf("%d",&n);                                     
18   for(int i=1; i<=n; ++i)
19       if(wanshu(i))
20           printf("%d\n",i);
21 }

28、计算阶乘和数 

计算阶乘和数。假设有这样一个三位数m,其百位、十位和个位数字分别是a、b、c,如果m= a!+b!+c!,则这个三位数就称为三位阶乘和数(约定0!=1)。

编写计算n的阶乘的函数:long fact(int n);函数返回值是n! 。

在主程序中输入n,调用fact函数,判断该数是否为阶乘和数。

输入格式:

输入n,n为[100,999]间的整数。

输出格式:

判断结果,是阶乘和数不是阶乘和数

输入样例:

300

输出样例:

不是阶乘和数
 1 #include 
 2 long fact(int n);
 3 int fun(int n);
 4 int main()
 5 {
 6   int n;
 7   scanf("%d",&n);                                     
 8   if(!fun(n))
 9       printf("不是阶乘和数");
10   else
11       printf("是阶乘和数");
12  
13 }
14 long fact(int n){
15     long f = 1;
16     for(int i=1; i<=n; ++i)
17         f *= i;
18     return f;
19 }
20 int fun(int n){
21     int a = n%10;
22     int b = n/10%10;
23     int c = n/100;
24     if(fact(a)+fact(b)+fact(c)==n)
25         return 1;
26     return 0;
27 }

29、求最大公约数 

写函数,int fun1(int m,int n)求两个整数的最大公约数,返回值为最大公约数。

在主函数中输入两个整数,调用fun1函数求两个整数的最大公约数,并输出结果,

输入格式:

输入两个整数,用空格分隔

输出格式:

输出最大公约数

输入样例:

18  24

输出样例:

6
 1 #include 
 2 int fun1(int m,int n);
 3 int main()
 4 {
 5   int m,n;
 6   scanf("%d%d",&m,&n);                                     
 7   printf("%d\n",fun1(m,n));
 8  
 9 }
10 int fun1(int m,int n){
11     int t = m

30、求最小公倍数 

写函数,int fun2(int m,int n)求两个整数的最小公倍数,返回值为最小公倍数。

在主函数中输入两个整数,调用这个函数求两个整数的最小公倍数,并输出结果,

输入格式:

输入两个整数,用空格分隔。

输出格式:

输出最小公倍数

输入样例:

6  4

输出样例:

12
 1 #include 
 2 int fun1(int m,int n);
 3 int fun2(int m,int n);
 4 int main()
 5 {
 6   int m,n;
 7   scanf("%d%d",&m,&n);                                     
 8   printf("%d\n",fun2(m,n));
 9  
10 }
11 int fun1(int m,int n){
12     int t = m

31、文本加密 

文本加密。输入一个英文句子,以 . 结束。将其中所有的大写英文字母+3,小写英文字母-3,非英文字母不变,输出加密后的句子。

提示:

(1)当读入的字符为‘.’ 时,可判断输入结束。(即循环条件是:读入的字符!='.')

(2)判断变量c1的值是否为大写字母可以这样写:

if(c1>='A' && c1<='Z') 或 if(c1>=65 && c1<= 90)

输入格式:

输入一行英文句子,以 . 结束。

输出格式:

输出加密后的句子。

输入样例:

This book is AI.

输出样例:

Wefp _llh fp DL.
 1 #include
 2 #define N 100
 3 int main()
 4 {
 5     char s[N] = "";
 6     gets(s);
 7     char *p = s;
 8     while(*p)
 9     {
10         if(*p>='A' && *p<='Z')
11             *p+=3;
12         if(*p>='a' && *p<='z')
13             *p-=3;
14         printf("%c",*p);
15         p++;
16     }
17     return 0;
18 }

32、统计句子中元音字母的个数 

输入一个英文句子,已知:第一个字符是大写,其它字符都是小写,句子以 . 结束。

判断首字母是否为元音字母,并统计句子中元音字母(a、e、i、o、u)的个数,若首字符是大写元音字母,也要统计在内。

提示:

(1)可参考MOOC第9周课件“附加例题解析”中“字符编程例题1”第1题的编程方法。

(2)当读入的字符为 '.' 时,可判断输入结束。

输入格式:

第一个字符是大写,其它字符都是小写,句子以 . 结束。

输出格式:

第一行输出判断结果,不是

第二行输出元音字母的个数(首字符是大写元音字母+句中小写元音字母个数)。

输入样例:

Open the door,please.

输出样例:

是
8
 1 #include
 2 #define N 100
 3 
 4 int fun(char ch)
 5 {
 6     return ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u';
 7 }
 8 int main()
 9 {
10     char s[N] = "";
11     gets(s);
12     char *p = s;
13     int count=0;
14     if(fun(*p+32)){
15         printf("是\n");
16         count++;
17     }        
18     else
19         printf("不是\n");    
20     while(*p++)
21     {
22         if(fun(*p))
23             count++;
24     }
25     printf("%d\n",count);
26     return 0;
27 }

33、数字翻译程序 

编写简单的数字翻译程序:

当输入1-5的数字时,翻译成对应的英文(小写),并输出。

当输入字符e时,结束程序。

提示:

允许不同的编程方法,可以模仿第9周单元测试中统计车辆的多选题编写。

输入格式:

一行输入一个数字,输入e结束

输出格式:

一行输出一个对应的英文(小写)

输入样例:

1
2
e

输出样例:

one
two
 1 #include
 2 #define N 100
 3 int main()
 4 {
 5     char ch;
 6     while((ch=getchar())!='e')
 7     {
 8         switch(ch){
 9             case '1':printf("one\n");break;
10             case '2':printf("two\n");break;
11             case '3':printf("three\n");break;
12             case '4':printf("four\n");break;
13             case '5':printf("five\n");break;
14         }
15     }
16     return 0;
17 }

34、输出平均值之上的数 

有一维数组int a[20],先输入值,然后计算平均值,并输出高于平均值的所有数组元素。

输入格式:

输入20个整数,用空格分隔

输出格式:

第一行:输出平均数,保留2位小数

第二行:顺序输出高于平均值的数组元素,元素间用2个空格分隔。(最后一个元素后也带2个空格)

输入样例:

1  2   3   4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20

输出样例:

10.50
11  12  13  14  15  16  17  18  19  20
 1 #include
 2 
 3 int main()
 4 {
 5     int a[20] = {0};
 6     double sum=0;
 7     for(int i=0; i<20; ++i){
 8         scanf("%d",&a[i]);
 9         sum += a[i];
10     }
11     printf("%.2f\n",sum/20);
12     for(int i=0; i<20; ++i){
13         if(a[i]>sum/20)
14             printf("%d  ",a[i]);
15     }
16     return 0;
17 }

35、选课程序 

有10位学生需要选课,数组score[i]存储第 i 位学生的分数:

int score[11] = {0,80,70,90,100, 81,95,86,45,78,91};

现有序号为1、2、3、4的课程待选。输入每位学生选的课程号,保存在数组no中,其中no[i]存储第 i 位学生想选的课程号。

请编写选课程序,规则如下:

每门课程只余1个名额,只能录取选课学生中分数最高者。

程序运行结果:输出各课程录取的学生号及分数 ,如果某课程无人选修,则输出“...号课程无人报”。

输入格式:

按序输入每位学生选的课程号,中间用空格分隔

输出格式:

一行输出一门课程的录取结果。

在printf中用%d号课程录取第%d位学生%d分\n格式输出各课程号录取的学生及分数。

如果课程无人报,则输出i号课程无人报。

输入样例:

1 2 1 2 2 1 4 4 4 4

输出样例:

1号课程录取第6位学生95分
2号课程录取第4位学生100分
3号课程无人报
4号课程录取第10位学生91分
 1 #include 
 2 struct course{
 3     int score;
 4     int index;
 5 }COURSE[5] = {0};
 6 int main()
 7 {
 8     int score[11] = {0,80,70,90,100, 81,95,86,45,78,91};
 9     int no[11] = {0};
10     
11     for(int i=1; i<=10; ++i)
12         scanf("%d",&no[i]);
13      
14     for(int j=1; j<=10; ++j){   
15         if(COURSE[no[j]].score
 1 #include
 2 
 3 int main()
 4 {
 5     int score[11] = {0,80,70,90,100, 81,95,86,45,78,91};             
 6     int no[11] = {0};
 7     int course[5] = {0};
 8     int index[5] = {0};
 9     for(int i=1; i<=10; ++i)
10         scanf("%d",&no[i]);
11     
12     for(int j=1; j<=10; ++j){    
13         if(course[no[j]]

36、统计单词的个数 

编程:输入一行字符,统计其中有多少个单词,单词之间用空格,逗号,或句号分隔开。

提示:

1、可以模仿“字符数组应用举例”中的第一个例题。

2、如果一行字符中,前一个是“英文的空格或逗号或句号”,并且后一个是字母时,单词数加1

输入格式:

一行字符,长度不超过254个,由英文的空格,逗号,句号和字母组成。

输出格式:

包含的单词数

输入样例1:

Life is a journey, not a destination.

输出样例1:

7

输入样例2:

HELLO WORLD.

输出样例2:

2
 1 #include 
 2 #define N 256
 3 int main( )
 4 {    
 5     char s[N] = "";
 6     gets(s);
 7     int count = 0;
 8     char *p = s;
 9     while(*p)
10     {
11         if(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z'){
12             count++;
13             while(*p&&(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z'))
14                 p++;
15             if(*p=='\0')
16                 break;
17         }
18         p++;
19     }
20     printf("%d\n",count);
21     return 0;
22 }

算法二:

 1 /* 算法二
 2     前一个是“非字母字符”,并且后一个是字母字符时,单词数加1,算法利用锁定机制
 3     1、判断非字母字符的语句优先执行,锁定非字母字符标志;
 4     2、一旦出现字母字符,单词累加,锁定字母字符,使得连续的字母字符只计算一次单词累加
 5  */
 6 #include 
 7 #define N 256
 8 int main( )
 9 {
10     char s[N] = "   Hello  ,  world  123    \n  haha   ."; //
11     //gets(s); //无法把回车符输入到字符数组
12     
13     int count = 0, flag = 1; //为统计第一个单词,假定首个字符为非字母字符
14 
15     for(int i=0; s[i]; i++)
16     {
17         if(!(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z')){ //判断非字母字符的语句优先执行
18             flag = 1;       //锁定非字母字符标志
19         }
20         else if(flag == 1){ //非字母字符标志,单词个数即累加
21             count++;
22             flag = 0;       //锁定字母字符,使得连续的字母字符只计算一次单词累加
23         }
24     }
25     printf("%d\n",count);
26     return 0;
27 }

算法三

 1 /* 算法三:
 2     一旦发现字母,判断下一个字符是否不是字母或是否是字符串结束标志,是,单词++
 3     注:算法一简化代码在其他mooc课程笔记里
 4  */
 5 
 6 #include 
 7 #define N 128
 8 
 9 int main()
10 {
11     char str[N] = "   Hello  ,  world  123 \n  haha   ."; //"";
12     char *p = str;
13     //gets(str);
14     int count = 0;
15 
16     while(*p)
17     {
18         if(    (*p>='a'&&*p<='z'||*p>='A'&&*p<='Z') //当前字符是字母,并且
19             &&(!(*(p+1)>='a'&&*(p+1)<='z'||*(p+1)>='A'&&*(p+1)<='Z')||!(*(p+1)))//下一个字符不是字母或是字符串结束标志
20         )
21         {
22             count++; //单词++
23         }
24         p++;
25     }
26 
27     printf("%d\n",count);
28 
29     return 0;
30 }

37、计算对角线以上所有元素之和

编程:输入一个4*4的整数矩阵,计算对角线以上所有元素之和。

提示:

定义二维数组a保存输入的数,则对角线以上元素保存在a[i][j](j>i)

可以模仿本周的判断题编写,也可以采用不同的编程方式

输入格式:

4*4的整数矩阵,每行数据之间以空格分开

输出格式:

输入样例:

1  2  3  4
5  7  8  1
4  2  7  98
71  8  5  65

输出样例:

116
 1 #include 
 2 int main ()
 3 {
 4     int i,j,a[4][4],sum=0;
 5     for(i=0; i<4; ++i){
 6         for(j=0; j<4; ++j){
 7             scanf("%d",&a[i][j]);
 8             if(j>i)
 9                 sum += a[i][j];
10         }
11     }
12     printf("%d\n",sum);
13     return 0;
14 }

38、两点之间的距离与相对位置 

定义一个结构体,用于表示平面上的一个点。

结构体名为point,有3个成员项float x(横坐标)、float y(纵坐标)、int quadrant(象限)

按序输入每个点的横坐标、纵坐标、象限位置,求两点之间的距离、判断是否在同一象限,然后输出结果。

(注:象限为i,表示点在第i象限)

提示:

输入point的成员数据时,不要忘记取地址符 &

输入格式:

一行一个点的横坐标、纵坐标、象限位置,中间用空格分隔

输出格式:

第一行以%f的格式输出距离

第二行输出象限判断结果: 不在同一象限在同一象限

输入样例:

2.5    3    1 
-1.2   5    2

输出样例:

4.205948
不在同一象限
 1 #include 
 2 #include 
 3 typedef struct point POINT;
 4 struct point{
 5     float x,y;
 6     int quadrant;
 7 };
 8 int main ()
 9 {
10     POINT p1,p2;
11     scanf("%f%f%d",&p1.x,&p1.y,&p1.quadrant);
12     scanf("%f%f%d",&p2.x,&p2.y,&p2.quadrant);
13     printf("%f\n",sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
14     if(p1.quadrant==p2.quadrant)
15         printf("在同一象限\n");
16     else
17         printf("不在同一象限\n");
18     return 0;
19 }

39、编号为1, 2, …, n的n名同学玩抽卡牌游戏,每人抽5张卡牌,其中数字卡牌的点数只能是1-9,另有字母卡牌D,D卡牌点数=最近一次抽中的卡牌的点数乘以2倍。

请编写一个程序求各同学抽出卡牌的总点数,并输出总点数最小值及抽出它的同学的编号。

例如:抽出的卡牌序列为31D,点数和为3+1*2=5点,卡牌序列D92,点数和为0*2+9+2=11点。

---------------------------------------------------------------------------

输入格式:

第一行输入n

第i行输入编号i-1的同学抽出的卡牌序列

输出格式:

min=总点数最小值,no=总点数最小的同学的编号

如果有相同的最小点数,输出编号大者。

---------------------------------------------------------------------------

输入样例1:

3

2D212

345D1

1211D

输出样例1:

min=6 , no=3

提示:

1、可以定义一个数组(长度>5)保存抽出的卡牌序列,例如,char card[6];

2、使用scanf("%c",&card[j]);读入每一张卡牌,注意,%c前有一个空格,读入时能跳过空格与换行回车符。

 1 #include 
 2 int  main()
 3 {
 4     int i,j;
 5     int min=0,mini=0;//最小值及相应序号
 6     int sum=0,temp=0;//累计 字符的临时存储
 7     char c;
 8     int n,flag=0; //flag, min 赋初值标志
 9     scanf("%d",&n); //输入 n
10     getchar();//去回车
11     for(i=1; i<=n; ++i){
12         sum = 0,temp=0;    //累计、临时赋初值        
13         for(j=0; j<5; ++j)
14         {            
15             scanf("%c",&c);//读取字符
16             if(c=='D')
17                 sum += temp;//D 是上次的读取的二倍
18             else{
19                 temp = c-'0';//记录读取的字符,遇到D再次累计
20                 sum += c-'0';//累计读取的字符
21             }            
22         }
23         //printf("%d\n",sum);
24         getchar();//去回车
25         if(!flag) {  
26             min = sum; //min 赋初值
27             flag =1;
28         }
29         if(min>=sum){ //更新最小值
30             min = sum;
31             mini = i;
32         }        
33     }
34     printf("min=%d , no=%d",min,mini);    
35     return 0;
36 }
 1 #include 
 2 int  main()
 3 {
 4     int i,j;
 5     int min=0,mini=0;//最小值及相应序号
 6     int sum=0,temp=0;//累计 字符的临时存储
 7     char c;
 8     int n,flag=0; //flag, min 赋初值标志
 9     scanf("%d",&n); //输入 n
10     for(i=1; i<=n; ++i){
11         sum = 0,temp=0;    //累计、临时赋初值        
12         for(j=0; j<5; ++j)
13         {            
14             scanf(" %c",&c);//去回车, 读取字符
15             if(c=='D')
16                 sum += temp;//D 是上次的读取的二倍
17             else{
18                 temp = c-'0';//记录读取的字符,遇到D再次累计
19                 sum += c-'0';//累计读取的字符
20             }            
21         }
22         if(!flag) {  
23             min = sum; //min 赋初值
24             mini = i;
25             flag =1;
26         }
27         if(min>=sum){ //更新最小值,有相同的最小点数,输出编号大者
28             min = sum;
29             mini = i;
30         }        
31     }
32     printf("min=%d , no=%d",min,mini);    
33     return 0;
34 }
 1 #include 
 2 int  main()
 3 {
 4     int n,min=0,mini=0,flag=0;//学生编号,最小值及相应序号    
 5     scanf("%d",&n);
 6     for(int i=1; i<=n; ++i)
 7     {
 8         int sum=0,temp=0,j=0;//累计,字符的临时存储
 9         char s[256] = "";
10         scanf("%s",&s);
11         while(s[j])
12         {
13             if(s[j]=='D')
14                 sum += temp;//D 是上次的读取的二倍
15             else{
16                 temp = s[j]-'0';//记录读取的字符,遇到D再次累计
17                 sum += s[j]-'0';//累计读取的字符
18             }  
19             j++;
20         }
21         if(!flag){  
22             min = sum; //min 赋初值
23             mini = i;
24             flag =1;
25         }
26         if(min>=sum){ //更新最小值,有相同的最小点数,输出编号大者
27             min = sum;
28             mini = i;
29         }           
30     }
31     printf("min=%d , no=%d",min,mini);    
32     return 0;
33 }

你可能感兴趣的:(C,c语言,算法,c++,开发语言)