1、求圆的周长和面积
输入圆的半径,计算并输出其周长和面积。常量pi的值取3.14159,周长和面积只输出小数点后2位数字。
输入格式:
输入圆的半径,半径为浮点型数据
输出格式:
第一行输出周长(只显示至小数点后2位数字) 第二行输出面积(只显示至小数点后2位数字)
输入样例:
5
输出样例:
31.42
78.54
1 #include <stdio.h> 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 <stdio.h> 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的值。
提示:
1、注意数学公式的书写规则:乘号*不能少,开根号用sqrt函数,不要忘记加#include
2、注意条件的书写:在 C 中 -1<x≤0 应写为 -1<x && x<=0。
允许不同的编程方法
输入格式:
输入x的值,x为浮点型
输出格式:
输出f(x)的值,保留2位小数
输入样例:
-3.1
输出样例:
-60.58
1 #include<stdio.h> 2 #include <string.h> 3 #include <math.h> 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<stdio.h> 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<stdio.h> 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<stdio.h> 2 #include <string.h> 3 #include <math.h> 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 <stdio.h> 2 #include <math.h> 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 <stdio.h> 2 #include <math.h> 3 int main() 4 { 5 int x, count=1; 6 double sum=300; 7 scanf("%d",&x); 8 while(sum<x) 9 { 10 sum = sum + sum/8; 11 count++; 12 } 13 printf("第%d天",count); 14 return 0; 15 }
7、因式分解
二次三项式 ,p>0,q>0,
如果常数项 q 可分解为2个因数a,b的积,并且a+b=p ,那么 就可分解为(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 <stdio.h> 2 #include <math.h> 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 <stdio.h> 2 #include <math.h> 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 <stdio.h> 2 #include <math.h> 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 <stdio.h> 2 #include <math.h> 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 <stdio.h> 2 #include <math.h> 3 #include <string.h> 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)<fabs(key-t)){ 13 t = x; 14 ti = i; 15 } 16 } 17 printf("%d\n%.1f\n",ti+1,t); 18 return 0; 19 }
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 <stdio.h> 2 #include <math.h> 3 #include <string.h> 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 <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 5 int sum(int n){ 6 int s=0; 7 for(int i=1;i<n;i++){ 8 if(n%i==0){ 9 s += i; 10 } 11 } 12 return s==n; 13 } 14 15 int main() 16 { 17 int n; 18 scanf("%d",&n); 19 if(sum(n)) 20 printf("是完数\n"); 21 else 22 printf("不是完数\n"); 23 return 0; 24 }
14、最小公倍数
输入两个正整数m和n,求其最小公倍数。
输入格式:
输入两个正整数m和n,中间用空格分隔
输出格式:
输出最小公倍数
输入样例:
8 6
输出样例:
24
#include<stdio.h> #include<stdlib.h> 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 <stdio.h>
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<stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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<n; ++i){ 3 int t=2*i+1; 4 while(t--) 5 printf("*"); 6 printf("\n"); 7 } 8 } 9 void rectangle(int n){ 10 while(n--) 11 printf("***\n"); 12 }
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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h>
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<lowest) 13 lowest = score; 14 sum +=score; 15 } 16 return sum/num; 17 } 18 void print_m( ){ 19 printf("最高分是%.2f\n",highest); 20 printf("最低分是%.2f\n",lowest); 21 }
27、求完数(函数练习)
编写判别完数的函数wanshu(int x):功能判断x是否为完数,如果是,则返回1,不是,则返回0。
在main()函数中,输入n,调用判别完数的函数,求出 1-n 以内所有的完数并输出。
输入格式:
输入n,n为整数。
输出格式:
输出完数,一行一个
输入样例:
100
输出样例:
6
28
1 #include <stdio.h> 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 <stdio.h> 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 <stdio.h> 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<n?m:n; 12 13 while(m%t||n%t) t--; 14 /* while(t) 15 { 16 if(m%t==0&&n%t==0) 17 break; 18 t--; 19 } */ 20 return t; 21 }
30、求最小公倍数
写函数,int fun2(int m,int n)求两个整数的最小公倍数,返回值为最小公倍数。
在主函数中输入两个整数,调用这个函数求两个整数的最小公倍数,并输出结果,
输入格式:
输入两个整数,用空格分隔。
输出格式:
输出最小公倍数
输入样例:
6 4
输出样例:
12
1 #include <stdio.h> 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<n?m:n; 13 while(t) 14 { 15 if(m%t==0&&n%t==0) 16 return t; 17 t--; 18 } 19 return t; 20 } 21 int fun2(int m,int n){ 22 return m/fun1(m,n)*n; 23 }
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<stdio.h> 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<stdio.h> 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<stdio.h> 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<stdio.h> 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 <stdio.h> 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<score[j]){ 16 COURSE[no[j]].score = score[j]; 17 COURSE[no[j]].index = j; 18 } 19 } 20 21 for(int i=1;i<5;++i) 22 if(COURSE[i].score) 23 printf("%d号课程录取第%d位学生%d分\n",i,COURSE[i].index,COURSE[i].score); 24 else 25 printf("%d号课程无人报\n",i); 26 return 0; 27 }
1 #include<stdio.h> 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]]<score[j]){ 14 course[no[j]] = score[j]; 15 index[no[j]] = j; 16 } 17 } 18 19 for(int i=1;i<5;++i) 20 if(course[i]) 21 printf("%d号课程录取第%d位学生%d分\n",i,index[i],course[i]); 22 else 23 printf("%d号课程无人报\n",i); 24 return 0; 25 }
36、统计单词的个数
编程:输入一行字符,统计其中有多少个单词,单词之间用空格,逗号,或句号分隔开。
提示:
1、可以模仿“字符数组应用举例”中的第一个例题。
2、如果一行字符中,前一个是“英文的空格或逗号或句号”,并且后一个是字母时,单词数加1
输入格式:
一行字符,长度不超过254个,由英文的空格,逗号,句号和字母组成。
输出格式:
包含的单词数
输入样例1:
Life is a journey, not a destination.
输出样例1:
7
输入样例2:
HELLO WORLD.
输出样例2:
2
1 #include <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 { 20 if(!(*(p+1)>=\'a\'&&*(p+1)<=\'z\'||*(p+1)>=\'A\'&&*(p+1)<=\'Z\')||!(*(p+1))) 21 { 22 count++; 23 } 24 } 25 p++; 26 } 27 28 printf("%d\n",count); 29 30 return 0; 31 }
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 <stdio.h> 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 <stdio.h> 2 #include <math.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 }