C语言程序设计实训
C语言程序设计编辑与调试环境
任何高级语言源程序都要“翻译”成机器语言,才能在机器上运行。“翻译”的方式有两种:一种是解释方式,即对源程序解释一句执行一句;另一种是编译方式,即通过编译系统先把源程序“翻译”成目标程序(用机器代码组成的程序),再经过连接装配后生成可执行文件,最后执行可执行文件而得到结果。
C语言是一种编译型的程序设计语言,采用编译的方式将源程序翻译成目标程序(机器代码)。运行一个C程序,从输入源程序开始,要经过编辑源程序文件(.c或.cpp)、编译生成目标文件(.obj)、连接生成可执行文件(.exe)和执行4步。
第1关:打印输出 Hello World
任务描述
本关任务:通过运行一个C语言程序,让你初步了解程序的运行方法。
相关知识(略)
编程要求
请补充Begin-End之间的代码,使用printf()在屏幕上输出 Hello World 。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
视频
输入:无
输出:Hello World
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /********* Begin *********/printf("Hello World\n");/********* End *********/ return 0;}
第2关:打印输出图形
任务描述
本关任务:参照上面调试的程序,编写一个能输出规定图形的程序。
相关知识(略)
编程要求
编写一个C程序,输出以下图案,并上机调试通过。第一行开头有4个空格,第二行开头有3个空格,第三行有2个空格,第四行开头有一个空格,第五行开头没有空格,9个*。
OK
Hello!
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
输入:无
输出:
OK
Hello!
提示
本题通过执行多个printf函数输出每一行即可,暂时不用考虑使用循环。
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /********* Begin *********/printf(" *\n");printf(" ***\n");printf(" OK\n");printf(" Hello!\n");printf("*********\n");/********* End *********/ return 0;}
第3关:求3个数的最大值
任务描述
本关任务:编写一个程序,输入a、b、c三个整数,输出其中最大值。
相关知识
输入
输入一行数据,分别为a b c。
输出
a b c其中最大的数,不用换行。
如何求出最大值
求几个数的最大值?
三个数两两比较,将较大的数存入最大值变量max;
编程要求
根据提示,在右侧编辑器Begin-End中补充代码,计算并输出三个数的最大值。
测试说明
我会对你编写的代码进行测试:
测试输入:10,30,20
预期输出:max=30
测试输入:15,78,85
预期输出:max=85
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /********* Begin *********/int a,b,c,z;scanf("%d,%d,%d",&a,&b,&c);z=a;if(b>a) z=b;if(c>b) z=c;printf("max=%d",z);/********* End *********/ return 0;}
第4关:熟悉C语言调试过程
任务描述
本关任务:以下程序源代码有错误,请使用C语言的调试功能,检查程序的错误并更正,使之能正确运行。
程序源代码:
#include<stdio.h>
int main(void)
{int x;
int y=2,z=3;
scanf(“%d”,&x);
if(x=y+z);
printf("“);
else
printf(”#####" );
return 0;
}
相关知识(略)
编程要求
程序中要求键盘输入x的值,当x的值为5时输出,否则输出#####。
输入:整数x的值。
输出:当x的值为5时输出*****,否则输出#####。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
输入:5
输出:*****
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void) { /********* Begin *********/ int x; int y=2,z=3; scanf("%d",&x); if(x==y+z) printf("*****"); else printf("#####" ); return 0; /********* End *********/ }
顺序结构程序设计
顺序结构是最简单的一种程序结构,其它的结构可以包含顺序结构也可以作为顺序结构的组成部分,可见顺序结构无处不在,他是构成其他程序结构的基础。
C程序是由若干源程序构成的。而在大多数情况下,一个C程序只是由一个源程序构成。一个源程序中又包含编译预处理命令(预编译命令)、全局变量的定义命令和各个用户函数组成。而各函数又由说明部分和执行部分组成。说明部分主要是定义本函数中要用到的变量,执行部分是由语句组成的。
第1关:加法运算
任务描述
本关任务:写一个加法程序,输入整数a,b,输出他们的和。
相关知识(略)
编程要求
请补充Begin-End之间的代码,写一个加法程序,输入整数a,b,输出他们的和。
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
输入格式:scanf(“%d,%d”,&a,&b);
输出格式:printf(“%d+%d=%d\n”,a,b,c);
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:3,4
样例输出:3+4=7
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ int a,b,c; //Please input a,b: /*********Begin*********/ scanf("%d,%d",&a,&b); c=a+b; printf("%d+%d=%d\n",a,b,c); /*********End**********/ return 0;}
第2关:不使用第3个变量,实现两个数的对调
任务描述
本关任务:下列程序是不用第三个变量,实现将两个数进行对调的操作。
程序代码如下:
1 #include<stdio.h>
2 int main(void)
3 {
4 int a,b;printf(“Enter a and b:”);
5 scanf(“%d%d”,&a,&b);
6 printf(“a=%d b=%d\n”,a,b);
7 a= ① ;b= ② ;a= ③ ;
8 printf(“a=%d b=%d\n”,a,b);
9 return 0;
10 }
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,并按照要求完成本关任务。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
输入:3 4
输出:
a=3 b=4
a=4 b=3
输入:7 85
输出:
a=7 b=85
a=85 b=7
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ int a,b; //Enter a and b: scanf("%d%d",&a,&b); printf("a=%d b=%d\n",a,b); /*********Begin*********/ a= /*********End**********/ printf("a=%d b=%d\n",b,a); return 0;}
第3关:用宏定义常量
任务描述
本关任务:已知某物品单价为30,数量为x。求商品的总价钱。用宏定义物品的单价。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,用宏定义物品的单价。
输入:一个整数x,代表物品的数量。
输出:输出总价格。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
5
样例输出:
150
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /*********Begin*********/ int a,b; scanf("%d",&a); b=30*a; printf("%d\n",b); /*********End**********/ return 0;}
第4关:数字分离
任务描述
输入一个三位数,分别求出x的各位数字,十位数字,百位数字的值。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,输入一个三位数,分别求出x的各位数字,十位数字,百位数字的值。
输入:一个三位数
输出:输出该数字的百位,十位,个位,数字之间用一个空格隔开。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
123
样例输出:
1 2 3
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /*********Begin*********/ int a,ge,shi,bai; scanf("%d",&a); ge=a%10; shi=(a/10)%10; bai=a/100; printf("%d %d %d",bai,shi,ge); /*********End**********/ return 0;}
第5关:计算总成绩和平均成绩
任务描述
本关任务:编程求从键盘上输入一个学生的五门成绩,计算出该学生的总成绩和平均成绩。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,编程求从键盘上输入一个学生的五门成绩,计算出该学生的总成绩和平均成绩。
输入:五个整数
输出:总成绩和平均成绩,其中平均成绩保留小数点后两位。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
60 70 80 90 100
样例输出
400 80.00
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /*********Begin*********/int a, b, c, d, e, sum;float aver;scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);sum = a + b + c + d + e;aver = sum / (5.0);printf("%d %.2f", sum, aver); /*********End**********/ return 0;}
第6关:求三角形的面积
任务描述
本关任务:编程求以a、b、c为边长的三角形的面积area。
相关知识
三角形面积计算公式为:
假设三角形三条边长分别为a、b、c,其中s=(a+b+c)/2,则面积:
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,编程求以a、b、c为边长的三角形的面积area。
输入:a b c三角形的三条边,可以是小数;
输出:三角形面积,保留3位小数。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
3 4 5
样例输出:
6.000
开始你的任务吧,祝你成功!
#include<stdio.h>#include <math.h>int main(void){ /*********Begin*********/ double a, b, c;double s;double area;scanf("%lf %lf %lf", &a, &b, &c);s = (a + b + c) / 2;area = sqrt(s * (s - a) * (s - b) * (s - c));printf("%.3lf", area); /*********End**********/ return 0;}
第7关:立体几何计算题
任务描述
本关任务:设圆半径r,圆柱高h , 求圆周长C1,半径为r的圆球表面积Sb,圆半径r,圆柱高为h的圆柱体积Vb。 用scanf输入数据,输出计算结果,输出时取小数点后两位数字。请编程序。 PI=3.14
编程要求
输入:两个double型浮点数,r和h;
输出:圆周长C1、圆球表面积Sb、圆柱体积Vb。 保留两位小数,每个结果后换行。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
1.5,3
样例输出:
C1=9.42
Sb=28.26
Vb=21.20
提示
圆球表面积计算公式为s=4πr × r ,r为球的半径。
圆柱体体积计算公式为:V=πr ×r×h,r为半径,h为高。
开始你的任务吧,祝你成功!
#include<stdio.h>#define PI 3.14int main(void){ /*********Begin*********/double r, h;double C1, Sb, Vb;scanf("%lf,%lf", &r, &h);C1 = PI * 2 * r;Sb = 4 * PI * r * r;Vb = PI * r * r * h;printf("C1=%.2lf\nSb=%.2lf\nVb=%.2lf\n", C1,Sb, Vb); /*********End**********/ return 0;}
第8关:计算两个正整数的最大公约数
任务描述
编程计算两个正整数的最大公约数。其中求最大公约数的函数原型已经给出,请在主函数中编程调用函数,输出最大公约数。
程序的运行示例:
12,3↙
3
####函数原型说明
求最大公约数的函数原型如下:
int MaxCommonFactor( int a, int b);
返回值:返回的是最大公约数;若输入的数据有任意一个不满足条件,返回值是-1。
参数:a,b是两个整型数
相关知识
本任务主要考察函数的调用方法。
####编程要求
根据提示,在右侧编辑器Begin-End处补充代码,编程计算两个正整数的最大公约数。
输入:输入格式:“%d,%d”
输出:输出格式:“%d\n”
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
467,465
样例输出:
1
开始你的任务吧,祝你成功!
#include<stdio.h>int MaxCommonFactor( int a, int b){ int c; if(a<=0||b<=0) return -1; while(b!=0) { c=a%b; a=b; b=c; } return a; } int main(void){ /*********Begin*********/ int a,b; scanf("%d,%d",&a,&b); printf("%d",MaxCommonFactor(a,b)); /*********End**********/ return 0;}
选择结构程序设计
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用选择(分支)结构。
分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序,适合带有逻辑或关系比较等条件判断的计算。编程之前,需要先分析程序中所处理的数据、构造合适的分支条件以及程序流程,再将程序流程用程序流程图绘制出来,最后根据程序流程写出源程序。这样可以把程序的分析、算法流程与程序实现分开,使得问题简单化,易于理解。
第1关:排序
任务描述
本关任务:下面的程序是从键盘输入三个整数按从小到大的顺序输出。
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
相关知识
输入格式
输入格式如下:
printf(“请输入三个整数:”);
scanf(“%d%d%d”,&a,&b,&c);
输出
排序输出从小到大的三个整数。
输出格式如下:
printf(“从小到大排列为:%d,%d,%d”,a,b,c);
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写排序的小程序。
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
样例输入:
请输入三个整数:5 7 6
样例输出:
从小到大排列为:5,6,7
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /*********Begin*********/ int a,b,c,d; printf("请输入三个整数:"); scanf("%d %d %d",&a,&b,&c); if(a>b) { d=a; a=b; b=d; } if(a>c) { d=a; a=c; c=d; } if(b>c) { d=b; b=c; c=d; } printf("从小到大排列为:%d,%d,%d",a,b,c); /*********End**********/ return 0;}
第2关:选择结构-闰年判断
任务描述
编写程序,完成如下功能:从键盘输入任意年份year,判别该年份是否闰年。
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
相关知识
输入
从键盘任意输入一个年份 。
输出
根据是否闰年进行输出,是输出"****是闰年!",否输出"不是闰年!",其中为当前输入的年份。
样例输入
2000
样例输出
2000 是闰年!
开始你的任务吧,祝你成功!
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写选择结构-闰年判断的小程序。
#include<stdio.h>int main(void){ /*********Begin*********/ int year; scanf("%d",&year); if((year % 4 == 0 &&year % 100 != 0)|| year % 400 ==0) printf("%d 是闰年!\n",year); else printf("%d 不是闰年!",year); /*********End**********/ return 0;}
第3关:选择结构-分段函数问题
任务描述
本关任务:编写程序,根据输入的值,输出函数的值。
有一个函数,定义如下
写一段程序,输入x,输出y。
相关知识
输入
从键盘任意输入一个数x
输出
一个数y,保留小数点后三位。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写选择结构-分段函数问题的小程序。
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
样例输入:
14
样例输出:
181.000
开始你的任务吧,祝你成功!
#include<stdio.h>int main(void){ /*********Begin*********/ double x,y; scanf("%lf",&x); if(x<0&&x!=-3) y=x*x+x-6; else if(x>=0&&x<10&&x!=2&&x!=3) y=x*x-5*x+6; else y=x*x-x-1; printf("%.3lf",y); /*********End**********/ return 0;}
第4关:学生成绩等级换算
任务描述
本关任务:给出一百分制成绩,要求输出成绩等级A、B、C、D、E。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E,如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
相关知识
输入
从键盘输入一个成绩,成绩可以使浮点数。
输出
(1)如果输入数据在0到100范围内:一个字符,表示成绩等级。
(2)如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写学生成绩等级换算的小程序。
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
样例输入:
90
样例输出:
A
#include<stdio.h>int main(void){ /*********Begin*********/ float result; int x; scanf("%f",&result); if(result>=0&&result<=100) { x=result/10; switch(x) { case 10: case 9:;printf("A");break; case 8:printf("B");break; case 7:printf("C");break; case 6:printf("D");break; default:printf("E"); } } else printf("Score is error!"); /*********End**********/ return 0;}
选择结构程序设计进阶
第1关:快递费用计算
任务描述
本关任务:编写一个计算机快递费的程序。
上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成5个区域:
快递费按邮件重量计算,由起重费用、续重费用两部分构成:
(1) 起重(首重)1公斤按起重资费计算(不足1公斤,按1公斤计算),超过首重的重量,按公斤(不足1公斤,按1公斤计算)收取续重费;
(2) 同城起重资费10元,续重3元/公斤;
(3) 寄往1区(江浙两省)的邮件,起重资费10元,续重4元;
(4) 寄往其他地区的邮件,起重资费统一为15元。而续重部分,不同区域价格不同:2区的续重5元/公斤,3区的续重6.5元/公斤,4区的续重10元/公斤。
相关知识(略)
编程要求
编写程序,从键盘输入邮件的目的区域编码和重量,计算并输出运费,计算结果保留2位小数。
提示
续重部分不足一公斤,按1公斤计算。因此,如包裹重量2.3公斤:1公斤算起重,剩余的1.3公斤算续重,不足1公斤按1公斤计算,1.3公斤折合续重为2公斤。如果重量应大于0、区域编号不能超出0-4的范围。
输入
用逗号分隔的两个数字,第一个表示区域、第二个是重量:“%d,%f”
输出
价格的输出格式:“Price: %.2f\n”
区域错误的提示信息:“Error in Area\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
测试说明
样例输入:
4,4.5
样例输出:
Price: 55.00
程序运行结果示例1:
输入:4,4.5
输出:Price: 55.00
程序运行结果示例2:
输入:5,3.2
输出:
Error in Area
Price: 0.00
#include<stdio.h>#include<math.h>int main(void){ /*********Begin*********/ int area = 0; float weight,startweight,extraweight,price = 0; int areastartmoney[5] = {10,10,15,15,15}; float areaextramoney[5] = {3,4,5,6.5,10}; scanf("%d,%f",&area,&weight); if(area<0 || area>4) { printf("Error in Area\n"); price = 0; } else if(weight < 0) { printf("Error in Weight!\n"); price = 0; } else { startweight = 1; extraweight = ceil(weight - 1); price = areastartmoney[area] + extraweight * areaextramoney[area]; } printf("Price: %.2f\n",price); /*********End**********/ return 0;}
第2关:计算一元二次方程的根
任务描述
本关任务:根据下面给出的求根公式,计算并输出一元二次方程ax2+bx+c=0的两个实根,要求精确到小数点后4位。其中a,b,c的值由用户从键盘输入。如果用户输入的系数不满足求实根的要求,输出错误提示 “error!”。
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,按照要求完成本关任务。
####输入
输入格式: “%f,%f,%f”
输出
输入提示信息:“Please enter the coefficients a,b,c:\n”
输出格式:“x1=%.4f, x2=%.4f\n”
输入错误提示信息:“error!\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例1
输入:1,2,1
输出:
Please enter the coefficients a,b,c:
x1=-1.0000, x2=-1.0000
样例2
输入:2,1,6
输出:
Please enter the coefficients a,b,c:
error!
#include<stdio.h>#include<math.h>int main(void){ /*********Begin*********/ float a,b,c; double x1,x2,d; printf("Please enter the coefficients a,b,c:\n"); scanf("%f,%f,%f",&a,&b,&c); d = b*b-4*a*c; if (b*b-4*a*c<0) { printf("error!"); return 0; } else { x1 = (-b+sqrt(d))/(2*a); x2 = (-b-sqrt(d))/(2*a); printf("x1=%.4f, x2=%.4f",x1,x2); } /*********End**********/ return 0;}
第3关:产品信息格式化
任务描述
本关任务:编写一个程序, 对用户录入的产品信息进行格式化。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,编写一个程序, 对用户录入的产品信息进行格式化。
以下为程序的运行结果示例:
Enter item number:
385↙
Enter unit price:
12.5↙
Enter purchase date (mm/dd/yy):
12/03/2015↙
Item Unit Purchase
385 $ 12.50 12032015
输入
产品编号输入格式:“%d”
产品价格输入格式:“%f”
购买日期输入格式:“%d/%d/%d”
输出
产品编号输入提示信息:“Enter item number:\n”
产品价格输入提示信息:“Enter unit price:\n”
购买日期输入提示信息:“Enter purchase date (mm/dd/yy):\n”
格式化输出的表头信息:“Item Unit Purchase\n”
输出格式:“%-9d$ %-9.2f%02d%02d%02d\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
385
12.5
12/03/2015
样例输出:
Enter item number:
Enter unit price:
Enter purchase date (mm/dd/yy):
Item Unit Purchase
385 $ 12.50 12032015
#include<stdio.h>int main(void){ /*********Begin*********/float unit; int a,b,c,d; printf ("Enter item number:\n"); scanf ("%d",&a); printf ("Enter unit price:\n"); scanf ("%f",&unit); printf ("Enter purchase date (mm/dd/yy):\n"); scanf ("%d/%d/%d",&b,&c,&d); printf ("Item Unit Purchase\n"); printf ("%-9d$ %-9.2f%02d%02d%02d\n",a,unit,b,c,d); /*********End**********/ return 0;}
循环结构程序设计1
顺序结构是按照从上到下的方式组织程序语句,运行时依次执行,顺序结构中的语句只执行一次。选择结构是根据条件是否成立来选择是否执行某些语句,换言之,选择结构中满足条件的语句执行一次,而不满足的一次也不执行。但现实问题中,我们经常要进行一些重复处理。
在程序设计中,如果需要重复执行某些操作,就要用到循环结构。实际中会遇到大量的按一定规律重复处理的问题,我们把这种按一定规律重复计算的过程称为循环计算过程,或简称为循环过程。使用循环结构进行编程时,首先要明确两个问题:哪些操作需要重复执行?这些操作在什么条件下重复执行?
C语言提供了两种循环结构:当型循环和直到型循环
当型循环的特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。直到型循环特点是,先执行循环体后判断。给定的条件称为循环条件,反复执行的程序段称为循环体。
C语言提供了多种循环语句,while语句、do-while语句、for语句以及if和goto语句配合,可以组成不同形式的循环结构。
第1关:小球自由落体运动
任务描述
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 结果保留两位小数。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,并按照要求完成本关任务。
输入
从键盘输入M和N的值。
输出
它在第N次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
1000 5
样例输出:
31.25 2875.00
#include<stdio.h>int main(void){ /*********Begin*********/ int i,n; float h,M; scanf("%f %d",&M,&n); h=M/2; for (i=2;i<=n;i++) { M=M+2*h; h=h/2; } printf("%.2f %.2f",h,M); /*********End**********/ return 0;}
第2关:求解出n以内所有能被5整除的正整数的乘积
任务描述
本关任务:求解出n以内(包含n)所有能被5整除的正整数数的乘积s。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,求解出n以内(包含n)所有能被5整除的正整数数的乘积s
输入
输入包含多个样例,每个样例一个正整数n,占一行。读取到文件结尾。输入的n不超过100。
输入格式
scanf(“%d”, &n)
输出
对于每个样例n,输出n以内(包含n)所有能被5整除的正整数的乘积。
输出格式
printf(“%d\n”, s);
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
19
样例输出:
750
#include<stdio.h>int main(void){ /*********Begin*********/ int n,i,s; s=1; scanf("%d",&n); for(i=1;i<=n;i++){ if(i%5==0) s*=i; } printf("%d",s); /*********End**********/ return 0;}
第3关:最大公约数和最小公倍数
任务描述
本关任务:输入两个正整数m和n,求其最大公约数和最小公倍数。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,输入两个正整数m和n,求其最大公约数和最小公倍数。
输入
从键盘上任意输入两个数。
输出
分两行输出,第一行输出:最大公约数是多少;第二行输出最小公倍数是多少。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
2 3
样例输出:
最大公约数是:1
最小公倍数是:6
#include<stdio.h>int main(void){ /*********Begin*********/ int a,b,i; scanf("%d %d",&a,&b); for(i=a;i>=1;i--){ if(a%i==0&&b%i==0){ printf("最大公约数是:%d\n",i); break; } } for(i=1;i>0;i++){ if(i%a==0&&i%b==0){ printf("最小公倍数是:%d\n",i); break; } } /*********End**********/ return 0;}
第4关:字符串中各类字符数的统计
任务描述
本关任务:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
输入
一行字符。
输出
统计每种字符的个数值。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
aklsjflj123 sadf918u324 asdf91u32oasdf/.';123
样例输出:
23 16 2 4
#include<stdio.h>int main(void){ /*********Begin*********/ int e=0,n=0,t=0,p=0; char c; while((c=getchar())!='\n') { if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) e++; else if(c==' ') t++; else if(c>='0'&&c<='9') n++; else p++; } printf("%d %d %d %d",e,n,t,p); /*********End**********/ return 0;}
第5关:求sn=a+aa+aaa+aaaa+…的值
任务描述
本关任务:键盘输入正整数a和n,编程 s=a+aa+aaa+aaaa+aa…a(n个a)的值。
例如:
a=2 ,n=5时,表示计算由2组成的数的和:2+22+222+2222+22222 ( 此时 共有5个数相加)。
输入:5 3 表示3个由5组成的数相加,即计算5+55+555的值,输出:615
输入:5 4 表示计算5+55+555+5555的值,输出:6170
相关知识
在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。
C中可利用while、for、do-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。
while语句
基本语法:基于while实现循环的基本语法如下:
while(布尔值){
需要循环的语句或者代码块
}
其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。
应用示例:
// 需要循环输出3次6
int n = 3;
while(n–){
printf(“6”);
}
for语句
基本语法:基于for实现循环的基本语法如下:
for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
需循环的语句或者代码块
}
其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
如果此处为真,则进入循环,执行循环内语句或者代码块。
如果此处为假,则不进入循环,执行之后的代码。
其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。
应用示例:
// 同样需要输出3个6
int i;
for(i=0;i<3;i++){
printf(“6”);
}
编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:
键盘输入正整数a和n,编程 s=a+aa+aaa+aaaa+aa…a(n个a)的值。
例如:
a=2 ,n=5时,表示计算由2组成的数的和:2+22+222+2222+22222 ( 此时 共有5个数相加)。
输入:5 3 表示3个由5组成的数相加,即计算5+55+555的值,输出:615
输入:5 4 表示计算5+55+555+5555的值,输出:6170
本关涉及的代码文件的代码框架如下:
#include <stdio.h>
// 定义main函数
int main(void)
{
// 请在此添加代码
/********** Begin /
/* End **********/
return 0;
}
测试说明
以下是测试样例:
输入:5 3
输出:615
输入:6 4
输出:7404
输入:3 5
输出:37035
#include<stdio.h>int main(void){ /*********Begin*********/ int a,n,s,sum,i; i=0; s=0; sum=0; scanf("%d %d",&a,&n); while(n>0){ s=a; i+=s; sum+=i; a=a*10; n--; } printf("%d\n",sum); /*********End**********/ return 0;}
循环结构程序设计2
第1关:C循环-求平均成绩
任务描述
本关任务:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。
######注意:当输入的学生人数小于等于0时,输出平均成绩为0分!
相关知识
在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。
C中可利用while、for、do-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。
while语句
基本语法:基于while实现循环的基本语法如下:
while(布尔值){
需要循环的语句或者代码块
}
其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。
应用示例:
// 需要循环输出3次6
int n = 3;
while(n–){
printf(“6”);
}
for语句
基本语法:基于for实现循环的基本语法如下:
for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
需循环的语句或者代码块
}
其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
如果此处为真,则进入循环,执行循环内语句或者代码块。
如果此处为假,则不进入循环,执行之后的代码。
其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。
应用示例:
// 同样需要输出3个6
int i;
for(i=0;i<3;i++){
printf(“6”);
}
编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:
编程实现:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。
######注意:当输入的学生人数小于等于0时,输出平均成绩为0分!
本关涉及的代码文件的代码框架如下:
#include <stdio.h>
// 定义main函数
int main()
{
// 请在此添加代码
/********** Begin /
/* End **********/
return 0;
}
测试说明
以下是测试样例:
输入:3 90 70 80
输出:the number of students:the scores:average=80.00
输入:-1
输出:the number of students:the scores:average=0.00
输入:4 78.5 26 73.6 90.1
输出:the number of students:the scores:average=67.05
#include<stdio.h>int main(void){ /*********Begin*********/ int i,num; float average,sum=0,a[1000]; scanf("%d",&num); if(num<=0) {printf("the number of students:the scores:average=0.00"); return 0; } for(i=0;i<num;i++) scanf("%f",&a[i]); for(i=0;i<num;i++) sum=sum+a[i]; average=sum/num; printf("the number of students:the scores:average=%.2f",average); /*********End**********/ return 0;}
第2关:C循环-求各位数字之积
任务描述
本关任务:计算正整数num的各位上的数字之积。
例如:
输入:2583 经过----(2x5x8x3) 输出:240
输入:102 经过----(1x0x2) 输出:0
输入:136 经过----(1x3x6) 输出:18
相关知识
在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。
C中可利用while、for、do-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。
while语句
基本语法:基于while实现循环的基本语法如下:
while(布尔值){
需要循环的语句或者代码块
}
其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。
应用示例:
// 需要循环输出3次6
int n = 3;
while(n–){
printf(“6”);
}
for语句
基本语法:基于for实现循环的基本语法如下:
for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
需循环的语句或者代码块
}
其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
如果此处为真,则进入循环,执行循环内语句或者代码块。
如果此处为假,则不进入循环,执行之后的代码。
其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。
应用示例:
// 同样需要输出3个6
int i;
for(i=0;i<3;i++){
printf(“6”);
}
编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:
计算正整数num的各位上的数字之积。
例如:
输入:2583 经过----(258*3) 输出:240
输入:102 经过----(102) 输出:0
输入:136 经过----(136) 输出:18
本关涉及的代码文件的代码框架如下:
#include <stdio.h>
// 定义main函数
int main()
{
// 请在此添加代码
/********** Begin /
/* End **********/
return 0;
}
测试说明
以下是测试样例:
输入:120
输出:0
输入:314
输出:12
输入:1952
输出:90
#include<stdio.h>int main(void){ /*********Begin*********/int n,a,score=1; scanf("%d",&n); a=n%10; while(n!=0) { score=score*a; n=n/10; a=n%10; } printf("%d",score); /*********End**********/ return 0;}
第3关:C循环-求阶乘之和
任务描述
本关任务:编写一个程序,任意输入n,求S=1!+2!+…+n!。
注意:n!表示n的阶乘。0的阶乘等于1,负数的阶乘等于0。
提示:(n+1)!=n!(n+1)*
例如:
输入:10
输出:4037913
输入:7
输出:5913
输入:-1
输出:0
相关知识
在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。
C中可利用while、for、do-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。
while语句
基本语法:基于while实现循环的基本语法如下:
while(布尔值){
需要循环的语句或者代码块
}
其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。
应用示例:
// 需要循环输出3次6
int n = 3;
while(n–){
printf(“6”);
}
for语句
基本语法:基于for实现循环的基本语法如下:
for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
需循环的语句或者代码块
}
其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
如果此处为真,则进入循环,执行循环内语句或者代码块。
如果此处为假,则不进入循环,执行之后的代码。
其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。
应用示例:
// 同样需要输出3个6
int i;
for(i=0;i<3;i++){
printf(“6”);
}
编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:
编程实现:任意输入n,求S=1!+2!+…+n!。
######注意:n!表示n的阶乘。0的阶乘等于1,负数的阶乘等于0。
本关涉及的代码文件的代码框架如下:
#include <stdio.h>
// 定义main函数
int main()
{
// 请在此添加代码
/********** Begin /
/* End **********/
return 0;
}
测试说明
以下是测试样例:
输入:10
输出:4037913
输入:1
输出:1
输入:-5
输出:0
#include<stdio.h>int main(void){ /*********Begin*********/int n; int S=1,i; int SUM=0; scanf("%d",&n); for(i=1;i<=n;i++) { S*=i; SUM=SUM+S; } printf("%d",SUM); /*********End**********/ return 0;}
第4关:C循环-水仙花数
任务描述
本关任务:求出所有的水仙花数。
提示:所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身。比如153是一个水仙花数,因为153=13+53+3^3。
注意:本题不需要输入语句,由于网站限制要求一定要有输入输出示例,但同学们可以对输入部分忽略不计。
例如:
370就是一个水仙花数,因为370 = 3^3 +7^3 + 0^3
相关知识
在编程中,我们常常遇到需要将一条语句或者一段代码重复运行多次的情况,如没有循环语句,需逐条编写,会导致程序的繁杂与冗余。
C中可利用while、for、do-while等常用循环函数来是语句或代码块进行重复操作,从而省去很多重复的工作,使代码简洁明了。
while语句
基本语法:基于while实现循环的基本语法如下:
while(布尔值){
需要循环的语句或者代码块
}
其中括号中的布尔值如果为真,这进入循环,直到布尔值变为假,则推出循环,继续执行之后代码。
其中括号中的布尔值如果为假,则直接不进入循环,继续执行循环代码块之后代码。
应用示例:
// 需要循环输出3次6
int n = 3;
while(n–){
printf(“6”);
}
for语句
基本语法:基于for实现循环的基本语法如下:
for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
需循环的语句或者代码块
}
其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断
如果此处为真,则进入循环,执行循环内语句或者代码块。
如果此处为假,则不进入循环,执行之后的代码。
其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。
应用示例:
// 同样需要输出3个6
int i;
for(i=0;i<3;i++){
printf(“6”);
}
编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:
求出所有的水仙花数。
提示:所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身。比如153是一个水仙花数,因为153=13+53+3^3。·
注意:本题不需要输入语句,由于网站限制要求一定要有输入输出示例,但同学们可以对输入部分忽略不计。
例如:
370就是一个水仙花数,因为370 = 3^3 +7^3 + 0^3
本关涉及的代码文件的代码框架如下:
#include <stdio.h>
// 定义main函数
int main()
{
// 请在此添加代码
/********** Begin /
/* End **********/
return 0;
}
测试说明
以下是测试样例:
输入: 1
输出:153 370 371 407
#include<stdio.h>#include<math.h>int main(void){ /*********Begin*********/ int i,a,b,c; for(i=100;i<1000;i++) { a=i%10;//个位数 b=(i/10)%10;//十位数 c=(i/10)/10;//百位数 if(i==a*a*a+b*b*b+c*c*c) printf("%d ",i); } /*********End**********/ return 0;}
第5关:C循环-寻找完数
任务描述
本关任务:一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出1000之内的所有完数。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,并按照要求完成任务。
输入
1000
输出
编程序找出1000之内的所有完数,每个完数占一行。
测试说明
输入:1000
输出:
6
28
496
#include<stdio.h>int main(void){ /*********Begin*********/ int i,j,sum=0; for(i=1;i<=1000;i++) { for(j=1;j<i;j++) { if((i%j)==0) sum=sum+j; } if(sum==i) printf("%d\n",i); sum=0; } /*********End**********/ return 0;}
第6关:分数求和
任务描述
本关任务:编写程序计算 1 - 1/2 + 1/3 - 1/4 + … +1/99 - 1/100 的值,并显示出来(保留结果为小数点后三位)。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,编写程序计算 1 - 1/2 + 1/3 - 1/4 + … +1/99 - 1/100 的值,并显示出来(保留结果为小数点后三位)。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
#include<stdio.h>int main(void){ /*********Begin*********/ float i,j,t=1,x,sum=0; for(i=1;i<=100;i++) { x=(1/i)*t; sum=sum+x; t=(-t); } printf("%.3f",sum); /*********End**********/ return 0;}
函数
C语言是函数式的语言,C源程序是由函数组成的。 虽然在前面实训程序中都只有一个主函数main(), 但实用程序往往由多个函数组成。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。
C语言函数是一个自我包含的,能完成一定相关功能的执行代码段,我们可以把C函数看成一个“黑盒子”,只要将数据送进去就能得到结果,而函数的内部究竟是如何工作的,外部程序是不知道的。外部程序所知道的仅限于输入给函数什么数据以及函数输出什么内容。函数提供了编制程序的手段,使之容易读、写、理解、排除错误、修改和维护。
在求解一个复杂问题时,我们通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。
在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C语言程序。利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普遍用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。
第1关:求和
任务描述
题目描述:给你一个n,要求你编写一个函数求1+2+…+n.
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入一个n
输出
输出1+2+…+n的和
测试说明
样例输入:
100
样例输出:
5050
#include<stdio.h>int a(int n){return (1+n)*n/2;}int main(void){int m;scanf("%d",&m);printf("%d",a(m)); return 0;}
第2关:回文数计算
任务描述
本关任务:编写函数求区间[200,3000]中所有的回文数,回文数是正读和反读都是一样的数。如525, 1551
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
无需输入
输出
输出区间[200,3000]中所有的回文数,一行一个回文数,不需要输出其它无关的字符。
202
212
222
232
242
…
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
#include<stdio.h>void solve(int n){ /*********Begin*********/ if(n<1000) {if(n%10==n/100) printf("%d\n",n); } else {if(n%10==n/1000 && n/10%10==n/100%10) printf("%d\n",n); } /*********End**********/ }int main(void){for(int i=200;i<3001;i++){solve(i);}return 0;}
第3关: 编写函数求表达式的值
任务描述
题目描述:有如下表达式 s = 1 + 1 / 3 + (1 * 2) / (3 * 5) + (1 * 2 * 3) / (3 * 5 * 7) + … + (1 * 2 * 3 * … * n) / (3 * 5 * 7 * … * (2 * n + 1))。
编写函数求给出的n所对应的表达式s的值。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
一个整数n
输出
输出表达式的值,保留小数点后10位的值。
测试说明
样例输入:
4
样例输出:
1.5492063492
#include<stdio.h>//编写题目要求的函数/*********Begin*********/double fun(int n){ double s, t; int i;s=1.0; t=1.0;for(i=1;i<=n;i++) { t=t*i/(2*i+1);s+=t; }return s;}/*********End**********/ int main(void){ /*********Begin*********/ int x; scanf("%d",&x); printf("%12.10lf", fun(x)); /*********End**********/ return 0;}
第4关:阶乘数列
任务描述
题目描述:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
一个整数n(1<=n<=20)
输出
输出表达式的值,占一行。
测试说明
样例输入:
5
样例输出:
153
提示:
用int可能会溢出,需要用能表示更大范围的long long int(注:VC6.0不支持此类型,VC下使用可使用__int64替代)
#include<stdio.h>//编写函数/*********Begin*********/typedef int long long ll;ll digui(int n){if(n==1) return 1;else return n*digui(n-1);}/*********End**********/ int main(void){ /*********Begin*********/ int n;ll sum=0;scanf("%d",&n);for(int i=1;i<=n;i++) {sum+=digui(i); }printf("%lld",sum); /*********End**********/ return 0;}
第5关:亲密数
任务描述
题目描述:两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
无需输入
输出
3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号)
一对亲密数只输出一次,小的在前
测试说明
样例输出:
(220,284)(1184,1210)(2620,2924)
提示:
按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。计算数a的各因子的算法:
用a依次对i(i=1~a/2)进行模运算,若模运算结果等于0,则i为a的一个因子;否则i就不是a的因子。
#include<stdio.h>void solve(){ /*********Begin*********/ int a,i,b=0,m=0; for(a=1;a<=3000;a++) {for(i=1;i<a;i++) {if(a%i==0)b=b+i; }for(i=1;i<b;i++) {if(b%i==0)m=m+i; }if(m==a) {if(a!=b&&a<b)printf("(%d,%d)",a,b); }b=0,m=0;} /*********End**********/ }int main(void){ solve(); return 0;}
第6关:公约公倍数
任务描述
题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,变量类型使用long long int。
输入
两个正整数
输出
最大公约数 最小公倍数
如果输入的数中包含负数,则输出Input Error
测试说明
样例输入:
6 15
样例输出:
3 30
提示:
负数没有最大公约数和最小公倍数;
最大公约数和最小公倍数一定为正数,不可以为负数;
需要考虑代码运行效率,否则会评测超时。
#include<stdio.h>typedef int long long ll;ll lcm(ll a,ll b){ll temp,p,r,k,l;k=a;l=b;if(b>a){temp=b;b=a;a=temp;}while(b!=0){r=a%b;a=b;b=r;}return k/a*l;}int main(){ll a,b;scanf("%lld %lld",&a,&b);if(a<0 || b<0) printf("Input Error");elseprintf("%lld %lld",(a*b)/lcm(a,b),lcm(a,b));return 0;}
递归函数、嵌套函数
C语言中不允许作嵌套的函数定义,在定义一个函数时不允许在函数体内再定义另一个函数。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。
####函数的递归调用
C语言函数可以自我调用。如果函数内部一个语句直接或间接调用了函数自己,则称这个函数是“递归”。
第1关:递归求阶乘数列
任务描述
题目描述:用递归求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
一个整数n(1<=n<=20)
输出
输出表达式的值,占一行。
测试说明
样例输入:
5
样例输出:
153
提示:
因阶乘结果变化很快,所以输入数据不可太大。
#include<stdio.h>long long solve(long long n){ /*********Begin*********/ long long p=1,i; for(i=1;i<=n;i++) p*=i; return p; /*********End**********/}int main(void){ long long n; scanf("%lld",&n); long long ans=0; for(long long i=1;i<=n;i++) ans+=solve(i); printf("%lld", ans); return 0;}
第2关:递归实现输出一个整数的逆序
任务描述
题目描述:编写一个递归函数,将一个整数n逆序输出,比如,n = 12345,输出54321。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
一个整数n。
输出
该整数的逆序。
####测试说明
样例输入:
12345
样例输出:
54321
#include<stdio.h>void solve(int n){ printf("%d", n%10); /*********Begin*********/ n/=10; /*********End**********/ if(n>0) solve(n);}int main(void){ int n; scanf("%d",&n); solve(n); return 0;}
第3关:将整数递归转换成字符串
任务描述
题目描述:用递归法将一个整数n转换成字符串。例如,输入n为483,输出字符串 4 8 3,每个数字后面接一个空格用于隔开字符。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
一个整数n
输出
相应的用空格隔开的数字字符。
特别注意:输出字符之间有空格
测试说明
样例输入:
483
样例输出:
4 8 3
#include<stdio.h>void solve(int n){ int temp=n%10; /*********Begin*********/ n/=10; if(n) solve(n); /*********End**********/ if(n) printf(" %d", temp); else printf("%d", temp);}int main(void){ int n; scanf("%d",&n); solve(n); return 0;}
第4关:递归实现Ackman函数
任务描述
题目描述:编写一函数实现下列Ackman函数,其中m,n为正整数
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
一个两个整数
输出
输出表达式的值,占一行。
####测试说明
样例输入:
1 1
样例输出:
3
#include<stdio.h>int Acm(int m,int n){ if(m==0&&n>0) /*********Begin*********/ return n+1; /*********End**********/ else if(n==0&&m>0) /*********Begin*********/ return Acm(m-1,1); /*********End**********/ else /*********Begin*********/ return Acm(m-1,Acm(m,n-1)); /*********End**********/}int main(void){ int m,n; scanf("%d%d",&m,&n); printf("%d", Acm(m,n)); return 0;}
一维数组和二维数组
数组的概念
程序设计所涉及和处理的数据类型有:整型、实型、字符型,它们都属于C语言的基本数据类型。但在实际应用中,需要处理的数据往往是复杂多样的,C语言提供了一些更为复杂的数据类型,称为构造类型。数组是最基本的构造类型,可以方便地处理一批具有相同性质的数据的问题。
什么地方要用到数组
关于数组我们就可以把它看作是一个类型的所有数据的一个集合,并用一个数组下标来区分或指定每一个数。例如一个班级通常会有几十个人,但是老师来认识他们的时候首先会把他们看作是某某班的成员,然后再利用他们的学号来区分每一个学生,这时候,班级就是一个数组,而学号就是数组的下标,当我们指明是几号学号的时候就找到了这个学生。
同样在编程中,如果有一组相同数据类型的数据,例如有10个数字,这时候如果我们要用变量来存放它们的话,就要分别使用10个变量,而且要记住这10个变量的名字,这会十分的麻烦,这时候就可以用一个数组变量来存放他们。使用数组会让程序变的简单,而且避免了定义多个变量的麻烦。
数组的形式
数组有多种形式,通常分为一维数组、二维数组及多维数组。数组的正确定义和引用是我们必须要掌握的知识。利用数组中每个元素的规律变化可以方便的对数组进行操作。
第1关:排序问题
任务描述
本关任务:将十个数进行从大到小的顺序进行排列。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
输入
输入十个整数。
输出
以从大到小的顺序输出这个十个数。
测试说明
样例输入:
1 2 3 4 5 6 7 8 9 10
样例输出:
10 9 8 7 6 5 4 3 2 1
#include<stdio.h>int main(void){ /*********Begin*********/ int a[10]; int i,j,k; for(i=0;i<10;i++) scanf("%d",&a[i]); for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]<a[i+1]) {k=a[i];a[i]=a[i+1];a[i+1]=k;} for (i=0;i<10;i++) printf("%d ",a[i]); /*********End**********/ return 0;}
第2关:查找整数
任务描述
题目描述:给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
输入
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
测试说明
样例输入:
6
1 9 4 8 3 9
9
样例输出:
2
提示:
数据规模与约定。
1 <= n <= 1000
#include<stdio.h>int main(void){ /*********Begin*********/ int c[10000]; int a,i,b; scanf("%d",&a); for(i=0;i<a;i++) scanf("%d",&c[i]); scanf("%d",&b); for(i=0;i<a;i++) if(c[i]==b) break; printf("%d\n",i==a?-1:i+1); /*********End**********/ return 0;}
第3关:计算数组中元素的最大值及其所在的行列下标值
任务描述
题目描述:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中m和n的值由用户键盘输入。已知m和n的值都不超过10。
相关知识(略)
输入
输入数组大小:“%d,%d”
下面输入数组中元素。
输出
输出格式:
数组大小输入提示信息:“Input m, n:”
数组元素输入提示信息:"Input %d*%d array: "
输出格式:“max=%d, row=%d, col=%d”
样例输入
5,5
1 2 3 4 5
4 5 6 100 2
3 2 1 5 6
1 2 3 5 4
3 5 6 4 8
样例输出
Input m, n:Input 5*5 array:
max=100, row=2, col=4
编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
#include<stdio.h>int main(void){ /*********Begin*********/ int m,n,i,j; int a[10][10]; int max=a[0][0],row=0,col=0; printf("Input m, n:"); scanf("%d,%d",&m,&n); printf("Input %d*%d array:\n",m,n); for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%d",&a[i][j]); } } for(i=0;i<m;i++) for(j=0;j<n;j++) if(a[i][j]>max)max=a[i][j],row=i,col=j; printf("max=%d, row=%d, col=%d",max,row+1,col+1); /*********End**********/ return 0;}
第4关:二分查找
任务描述
题目描述:将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。
####相关知识(略)
####编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
输入
输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m。
输出
如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。
测试说明
样例输入:
10
1 2 4 5 6 7 8 9 10 11
10
样例输出:
9
#include<stdio.h>int main(void){ /*********Begin*********/ int a[100]; int n,x,i,j,mid; scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); scanf("%d", &x); int ans = -1; i = 0, j = n - 1; while(i <= j) { mid = (i + j) / 2; if(a[mid] == x) { ans = mid; break; } else if(a[mid] > x) j = mid - 1; else if(a[mid] < x) i = mid + 1; } if(ans == -1) printf("None\n"); else printf("%d\n", ans + 1); /*********End**********/ return 0;}
第5关:鞍点
任务描述
题目描述:找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。
相关知识(略)
编程要求
输入
输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。
输出
按下列格式输出鞍点:
Array[i][j]=x
其中x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。
一个二维数组并不一定存在鞍点,此时请输出None
我们保证不会出现两个鞍点的情况,比如:
3 3
1 2 3
1 2 3
3 6 8
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
样例输入:
3 3
1 2 3
4 5 6
7 8 9
样例输出:
Array[0][2]=3
#include<stdio.h>int main(void){ /*********Begin*********/ int a[10][10], maxa[10], mina[10]; int m, n, i, j; scanf("%d %d", &m, &n); for(i = 0; i < m; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); for(i = 0; i < m; i++) maxa[i] = a[i][0]; for(i = 0; i < n; i++) mina[i] = a[0][i]; for(i = 0; i < m; i++) for(j = 0; j < n; j++) { if(a[i][j] > maxa[i]) maxa[i] = a[i][j]; if(a[i][j] < mina[j]) mina[j] = a[i][j]; } int flag = 1; for(i = 0; i < m; i++) for(j = 0; j < n; j++) if(maxa[i] == mina[j]) { flag = 0; printf("Array[%d][%d]=%d\n", i, j, maxa[i]); break; } if(flag) printf("None\n"); /*********End**********/ return 0;}
第6关:删除最大值
任务描述
题目描述:输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写删除最大值的小程序。
输入
输入10个互不相同整数
输出
输出删除最大元素后的数组
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
样例输入:
1 2 3 4 5 6 7 8 9 0
样例输出:
1 2 3 4 5 6 7 8 0
#include<stdio.h>int main(void){ /*********Begin*********/ int a[10]; int i; for(i = 0; i < 10; i++) scanf("%d", &a[i]); int max = a[0], k = 0; for(i = 1; i < 10; i++) if(a[i] > max) max = a[i], k = i; for(i = 0; i < 10; i++) if(i != k) printf("%d ", a[i]); printf("\n"); /*********End**********/ return 0;}
第7关:杨辉三角
任务描述
题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写杨辉三角的小程序。
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
输出
打印出杨辉三角图形的10行。格式见题目描述部分。每个整数后面接一个空格来分隔开整数
#include<stdio.h>int main(void){ /*********Begin*********/int i,j,a[11][11]; for (i=0;i<10;i++) {a[i][i]=1; a[i][0]=1; } for (i=2;i<10;i++) for (j=1;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for (i=0;i<10;i++) {for (j=0;j<=i;j++) printf("%d",a[i][j]); printf("\n"); } printf("\n"); /*********End**********/ return 0;}
字符数组
用来存放字符量的数组称为字符数组。字符数组类型定义的形式与前面介绍的数值数组相同。例如:char c[10]; 由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占4个字节的内存单元。字符数组也可以是二维或多维数组,例如:char c[5][10];即为二维字符数组。字符数组也允许在类型定义时作初始化赋值。例如:
char c[10]={‘c’,’ ‘,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’};
字符串变量
字符串在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以’\0’作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符’\0’存入数组,并以此作为该字符串是否结束的标志。
第1关:字符逆序
任务描述
题目描述:输入一个字符串,输出反序后的字符串。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
一行字符
输出
逆序后的字符串
测试说明
样例输入:
123456abcdef
样例输出:
fedcba654321
特别注意:样例输出没有进行换行操作
#include<stdio.h>#include<string.h>int main(void){ /*********Begin*********/char a[1000];gets(a);for(int i = strlen(a) - 1;i >= 0;i--)printf("%c", a[i]); /*********End**********/ return 0;}
第2关:字符统计
任务描述
题目描述:对于给定的一个字符串,统计其中数字字符出现的次数。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
输出
对于每个测试实例,输出该串中数值的个数,每个输出占一行。、
测试说明
样例输入:
2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf
样例输出:
6
9
#include<stdio.h>#include<string.h>void function(){char s[50];gets(s);if(s[0]!='\0'){int temp=0;for(int i=0;i<strlen(s);i++){if(s[i]>='0'&&s[i]<='9'){temp++;}}printf("%d\n",temp);}}int main(){int n;scanf("%d",&n);n++;for(int i=0;i<n;i++){function();}return 0;}
第3关:字符插入
任务描述
题目描述:输入两个字符串a和b,将b串中的最大字符插入到a串中最小字符后面。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入一段文字
输出
输入两个字符串a和b。
测试说明
样例输入:
MynameisAmy
MynameisJane
样例输出:
MynameisAymy
提示:
字符串长度不超过100
注意:使用gets()**函数会引起警告并不是报错,只要代码编译正确并不会影响测评结果。
**推荐使用:fgets()函数。
#include <stdio.h>#include <string.h>int main(void){char a[20],b[20];gets(a),gets(b);int len=strlen(a),lenn=strlen(b);int min=999,max=0;for(int i=0;i<len;i++){if(a[i]<min) min=a[i];}for(int i=0;i<lenn;i++){if(b[i]>max) max=b[i];}for(int i=0;i<len;i++){if(a[i]==min) printf("%c%c",a[i],max);else printf("%c",a[i]);} return 0;}
第4关:字符串处理
任务描述
题目描述:编写程序,输入字符串s1和s2以及插入位置f,在字符串s1中的指定位置f处插入字符串s2。如输入"BEIJING", “123”, 3,则输出:“BEI123JING”。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
第一行和第二行分别输入两个字符串s1和s2,第三行输入插入位置f。
每个字符串的长度不超过100个字符。
输出
输出一行插入后的字符串。
测试说明
样例输入:
BEIJING
123
3
样例输出:
BEI123JING
注意:使用gets()**函数会引起警告并不是报错,只要代码编译正确并不会影响测评结果。
**推荐使用:fgets()函数。
#include <stdio.h>#include <string.h>int main(void){char a[1000],b[1000];gets(a),gets(b);int Z;scanf("%d",&Z);for(int i=0;i<strlen(a);i++){if(i==Z) printf("%s%c",b,a[i]);else printf("%c",a[i]);} return 0;}
第5关:字符串统计
任务描述
题目描述:输入一段字符(由空格、字母和数字几种组成,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以stop作为最后输入的字符串。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入一段文字
输出
输入一段字符,以stop作为最后输入的字符串。
测试说明
样例输入:
My name is Amy
My name is Jane
stop
样例输出:
11 name
12 name
提示:
字符串长度不超过100。
注意:使用gets()函数会引起警告,但正确使用不影响测评结果。
推荐使用:fgets()函数。
#include<stdio.h>#include <string.h>int main(void){ int sumLength = 0, partLength = 0; char arr[1000]; int max = 0; char Temp_Arr[1000]; gets(arr); int i, j; while (strcmp(arr, "stop") != 0) { for (i = 0; i < strlen(arr); i++) { if (arr[i] != ' ') { sumLength++; partLength++; } else { if (partLength > max) { max = partLength; } partLength = 0; } } if (partLength > max) { max = partLength; } partLength = 0; for (i = 0; i < strlen(arr); i++) { if (arr[i] != ' ') { partLength++; if (partLength == max) { for (j = 0; j < max; j++) { Temp_Arr[j] = arr[j + i - max+1]; } Temp_Arr[max] = '\0'; break; } } else { partLength = 0; } } printf("%d %s", sumLength, Temp_Arr); printf("\n"); sumLength = 0; partLength = 0; max = 0; gets(arr); } return 0;}
第6关:字符串排序
任务描述
题目描述:输入3行,每行n个字符串,按由小到大的顺序输出
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
3行字符串
输出
按照从小到大输出成3行
测试说明
样例输入:
cde
afg
abc
样例输出:
abc
afg
cde
#include<stdio.h>#include<string.h>char s1[50], s2[50], s3[50];int main(void){ scanf("%s%s%s", s1, s2, s3); if(strcmp(s1, s2) <= 0) { if(strcmp(s2, s3) <= 0) printf("%s\n%s\n%s\n", s1, s2, s3); else { if(strcmp(s3, s1) <= 0) printf("%s\n%s\n%s\n", s3, s1, s2); else printf("%s\n%s\n%s\n", s1, s3, s2); } } else { if(strcmp(s1, s3) <= 0) printf("%s\n%s\n%s\n", s2, s1, s3); else { if(strcmp(s3, s2) <= 0) printf("%s\n%s\n%s\n", s3, s2, s1); else printf("%s\n%s\n%s\n", s2, s3, s1); } } return 0;}
指针
指针是C语言中的一个重要概念,也是C语言的一个重要特色。在C语言中,指针被广泛使用,它和数组、字符串、函数间数据的传递等有着密不可分的联系。正确而灵活地运用指针,可以使程序简洁、紧凑、高效。可以说,没有掌握指针就没有掌握C语言的精华。
###为什么要使用指针
指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。
虽然指针并不是必须的,在诸如Java之类的一些高级语言中甚至已经取消了指针,但是只要我们运用得当,指针将使程序变得更加简洁和高效。C语言如果没有指针,就不会在各种新语言层出不穷并流行的今天依旧能够站在计算机程序设计语言的巅峰,这是经历几代编程语言“浪淘沙”之后留下来的精华。
第1关:用指针法输入12个整数,然后按每行4个数输出
任务描述
题目描述:用指针法输入12个整数,然后按每行4个数输出
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入包含一行,有12个整数。
输出
按顺序,每行输出4个整数。
####测试说明
样例输入:
1 2 3 4 5 6 7 8 9 10 11 12
样例输出:
1 2 3 4
5 6 7 8
9 10 11 12
#include<stdio.h>int main(void){ /*********Begin*********/int a[20],*p=a;for(int i=0;i<12;i++){scanf("%d",p++);}p=a;for(int i=0;i<12;i++,p++){if(i%4==0 && i!=0) printf("\n");if(i==3 || i==7 || i==11) printf("%d",*p);else printf("%d ",*p);} /*********End**********/ return 0;}
第2关:指针变量作为函数参数实现两变量交换值
任务描述
题目描述:对输入的两个整数a,b,用指针变量作为函数参数,交换a和b的值。
####输入
两个整数a b
####输出
输出用函数交换处理后的值a b
####样例输入
1 2
####样例输出
2 1
开始你的任务吧,祝你成功!
任务描述
题目描述:对输入的两个整数a,b,用指针变量作为函数参数,交换a和b的值。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
两个整数a b
输出
输出用函数交换处理后的值a b
####测试说明
样例输入:
1 2
样例输出:
2 1
#include<stdio.h>/*********Begin*********/int exchange(int *q1,int *q2){int temp=*q1;*q1=*q2;*q2=temp;}/*********End**********/int main(void){int a,b;scanf("%d%d",&a,&b);/*********Begin*********/ int *o,*p;o=&a,p=&b;exchange(o,p);printf("%d %d",a,b);/*********End**********/ return 0;}
第3关:报数
任务描述
题目描述:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
初始人数n
输出
最后一人的初始编号
####测试说明
样例输入:
3
样例输出:
2
#include<stdio.h>int main(void){ /*********Begin*********/int i,k,m,n,num[50],*p; scanf("%d",&n); p=num; for (i=0;i<n;i++)*(p+i)=i+1; i=0; k=0; m=0; while (m<n-1) {if (*(p+i)!=0) k++;if (k==3) {*(p+i)=0;k=0;m++; }i++;if (i==n) i=0; }while(*p==0) p++;printf("%d\n",*p); /*********End**********/ return 0;}
第4关:strcmp函数
任务描述
题目描述:用一个函数实现两个字符串的比较,即自己写一个strcmp函数
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入两字符串
输出
输出最大的那个字符串
####测试说明
样例输入:
abc
abd
样例输出:
abd
#include<stdio.h>int strcmp(char *p1,char *p2){/*********Begin*********/int i = 0;while(*(p1+i) != '\0' || *(p2+i) != '\0'){if(*(p1+i) > *(p2+i))return 1;else if(*(p1+i) < *(p2+i))return -1;elsei++;}return 0;/*********End**********/}int main(void){char a[110],b[110];scanf("%s%s",a,b);if(strcmp(a,b)>0)printf("%s", a);elseprintf("%s", b); return 0;}
指针进阶
指针作为函数返回值
既然函数返回值可以是整、实型等数据。当然也可以是指针值,只是函数定义头部形式略有不同:
类型名称 *函数名(形参列表)
例如:
int *fun() {…}
其中,fun是函数名,调用它以后返回一个指向整型的指针。*表示其后的函数fun( )是指针型函数(函数返回值是指针),最前面的int表示返回的指针基类型为整型。
###指向函数的指针
指针不但可以指向一般的变量、数组,还可以指向函数。指向函数的指针保存的是函数的入口地址,即这个函数第一条指令的地址。和数组名代表数组的首地址一样,函数名代表函数的入口地址。
###指针数组
元素均为指针类型数据的数组,称为指针数组。
定义形式为:
类型名称 *数组名[数组长度];
例如:
int a[10];
a是一个数组,它有10个元素,每个元素的类型都是整型。
char *b[5];
b是一个数组,它有5个元素,每个元素的类型都是字符指针,用于存放字符数据单元的地址。
###指向指针的指针
如果数组名ptr指向某一个数组的首地址,那么如果定义个指针变量p,把ptr赋值给它,那p即为指向指针的指针变量,也称为二级指针。
C语言中指向指针的指针变量一般定义为:
类型名称 **变量名;
第1关:输出若干个学生成绩中的最高分.要求用指针函数实现
任务描述
题目描述:读入n(1 <= n <= 1000)个学生的成绩,成绩都为整数,用指针函数求出若干个学生成绩的最高分。用数组名作为函数参数,指针作为函数返回值。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
第一行为整数n,代表学生的数量。
第二行为n个学生的成绩,n个整数之间用一个空格隔开。
输出
输出最高分,占一行。
####测试说明
样例输入:
5
80 90 85 95 91
样例输出:
95
#include<stdio.h>/*********Begin*********/int max(int s[],int n){ int temp=0; int *p; p=&temp; for(int i=0;i<n;i++) { if(*p<s[i]) *p=s[i]; } return *p;}/*********End**********/int main(void){ int n,s[110]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&s[i]); /*********Begin*********/ /*********End**********/ printf("%d",max(s,n) ); return 0;}
第2关:采用指针变量表示地址的方法输入输出数组中的个元素
任务描述
题目描述:采用指针变量表示地址的方法输入输出数组中的个元素
第一行为n,表示n个整数,
第二行为n个整数。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
第一行为n,表示n个整数,
第二行为n个整数。
输出
用指针变量表示地址的方法输出数组中的各个元素。
输出占一行,两个整数之间有空格
####测试说明
样例输入:
10
1 2 3 4 5 6 7 8 9 10
样例输出:
1 2 3 4 5 6 7 8 9 10
#include<stdio.h>int main(void){/*********Begin*********/int v[100],n;scanf("%d",&n);int *p;for(p=v;p<v+n;p++){scanf("%d",p);}for(p=v;p<v+n;p++){printf("%d ",*p);}/*********End**********/ return 0;}
第3关:用指针实现数组循环移动
任务描述
题目描述:有n个整数,要求你编写一个函数使其向右循环移动m个位置
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入n m表示有n个整数,移动m位
输出
输出移动后的数组
####测试说明
样例输入:
10 5
1 2 3 4 5 6 7 8 9 0
样例输出:
6 7 8 9 0 1 2 3 4 5
#include<stdio.h>int *solve(int *s, int n, int m){ /*********Begin*********/ int k = m % n; if(k == 0) return s;int *p = &s[n - k];int *q = p + m;for(int i = 0;i < n - k;i++)*q++ = *s++ ; return p; /*********End**********/}int main(void){ int n, m, s[110]; scanf("%d%d", &n, &m); for(int i = 0;i < n;i++) scanf("%d", &s[i]); int *ans; /*********Begin*********/ ans = solve(s, n, m); /*********End**********/ for(int i = 0;i < n;i++){ if(i == 0) printf("%d", *ans++ ); else printf(" %d", *ans++ ); } return 0;}
结构体
复杂数据类型
前面已经介绍了C语言的基本数据类型(整型、实型、字符型)。但实际问题中碰到复杂数据对象时,仅用前面介绍的数据类型显然是不够的。所以,解决的根本方法是允许用户根据实际需要利用已有数据类型构造自己所需要的数据类型,例如C语言中的结构体类型。
结构体是一种比较复杂但却非常灵活的构造型数据类型。通常用数组来表示类型相同的数据,用结构体来表示类型不同的数据。结构体是若干个类型相同或互异的数据项集合。
#####When/Where
在现实中,几个数据之间有着密切联系,它们用来描述事物的几个方面,但它们不属于同一类型,这时可以用结构体数据类型。也就是说结构体为程序员提供了一种封装一组相关数据元素的简便方法。
#####How
结构类型定义仅描述一个结构形式,如果要在程序中使用结构体需要定义结构变量、结构数组或结构指针。存储一个学生基本信息用一个结构变量来描述,存储多个学生基本信息用结构数组来描述。结构数组即数组中每个元素是结构类型的数据。结构体中所包含的数据元素称为成员,对结构体变量成员的引用需要使用成员运算符。
第1关:结构体变量的初始化和引用
任务描述
本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。
相关知识
结构体类型用于描述由多个不同数据类型的数据构成的复合数据,是一种用户自定义数据类型。
结构体的定义
定义格式为:
struct <结构体类型名>
{
<成员表>
}; //分号结束定义
例如,以下是一个描述学生信息的结构体类型定义:
struct student{
long number;
char name[20];
char sex;
float score;
};
在这个结构体定义中,结构体类型名为student,该结构体由4个成员组成。第一个成员为number,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应该注意在花括号后的分号是不可少的
声明结构体变量
声明结构体变量有四种方式,他们在本质上没什么区别,可根据自己习惯和要求选择你喜欢的方式:
先定义结构体,再声明结构体变量
struct student{
long number;
char name[20];
char sex;
float score;
}; //先定义结构体
struct student s1,s2;//声明结构体变量
在定义结构体类型的同时声明结题变量
struct student{
long number;
char name[20];
char sex;
float score;
}s1,s2; //在定义结构体的同时定义结构体变量
直接声明结构体变量
struct{ //省去结构体名
long number;
char name[20];
char sex;
float score;
}s1,s2; //直接给出结构体变量
此方法因为没有给出结构体名,所以不能用来在后面程序中声明此结构体类型的变量,因此在实际编程是这种方法用的较少。
typedef引用别名来定义
typedef struct student STUDENT; //给结构体student定义别名
struct student{
long number;
char name[20];
char sex;
float score;
};
STUDENT s1,s2; //使用别名STUDENT定义结构体
结构体成员的访问
结构体变量的成员访问方式为:
<结构体变量名>.<结构体成员变量>
结构体变量的每个成员都可以看做一个独立的变量,称为成员变量,对成员变量所能做的操作由成员变量的类型决定。
例如,下面的操作是合法的:
s1.number=2010001;//number成员是long类型
strcpy(s1.name,“lili”);//name成员是字符数组类型
结构体成员要和结构体变量名联合使用,即以“结构体变量名.成员名”的访问方式,所以不同结构体类型的成员名字可以相同,并且他们还可以与程序中其他非结构体成员的名字相同,不会引起歧义或冲突。
注意:如果结构体变量的成员本身又是一个结构体类型,则要用若干成员运算符找到最低一级成员,只能对最低一级的成员进行赋值或者读写及运算。
例如:
struct data{
int month;
int day;
int year;
};
struct student{
long num;
char name[20];
char sex;
data birthday;
}stu1;
对以上定义的结构体变量stu1,可以通过以下方式访问其中各成员:
stu1.num;
stu1.birthday.month;
结构体变量初始化
在定义结构体变量的同时可以对其进行初始化,格式与数组变量初始化类似,用花括号吧每个成员的初始值括起来,每个初始值与相应的成员对应。
例如,对student结构体类型的变量s1进行初始化:
struct student s1={2010001,“lili”,‘F’,97};
在定义结构体类型是不能对其成员进行初始化,因为类型不是程序运行时的实体,不会给他们分配内存空间,因此,对其初始化没有意义。
编程要求
在右侧编辑器Begin-End处补充代码,将测试输入信息存入结构体中,完成输出成绩较高的学生的学号,姓名和成绩。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:
14308100238 xiaowang 99
15408122584 xiaoli 78
预期输出:
14308100238 xiaowang 99
测试输入数据说明:
输入包含两行,每行包含学生的学号(11位的整数),姓名(字符串,长度不超过20)和成绩(整数)。
#include<stdio.h>/*********Begin*********/int main(){ struct data{ char num[20]; char name[20]; int score; }s1,s2; scanf("%s%s%d",s1.num,s1.name,&s1.score); scanf("%s%s%d",s2.num,s2.name,&s2.score); if(s1.score>s2.score) { printf("%s %s %d\n",s1.num,s1.name,s1.score); } else { printf("%s %s %d\n",s2.num,s2.name,s2.score); } return 0;}/*********End*********/
第2关:结构体排序
任务描述
本关任务:有n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。
相关知识
参考结构体第1关相关知识
编程要求
在右侧编辑器Begin-End处补充代码,要求按照成绩的高低顺序输出学生的信息。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:
5
10101 Zhang 78
10103 Wang 98
10106 Li 86
10108 Ling 73
10110 Sun 100
预期输出:
10110 Sun 100
10103 Wang 98
10106 Li 86
10101 Zhang 78
10108 Ling 73
测试输入数据说明:
第一行为整数n表示有n个学生, 1<=n<=200。接下来包含n行数据,每行数据代表一个学生的信息,按学号(11位的整数),姓名(字符串,长度不超过20)和成绩(整数)。
#include<stdio.h>/*********Begin*********/typedef struct student{char num[12];char name[20];int score;}m;/*********End**********/int main(void){/*********Begin*********/int i,n,j;m s[200],temp;scanf("%d",&n);for(i=0;i<n;i++){scanf("%s %s %d",&s[i].num,&s[i].name,&s[i].score);}for(i=0;i<n-1;i++){for(j=i+1;j<n;j++){if(s[j].score>s[i].score){ temp=s[i]; s[i]=s[j]; s[j]=temp;}}}for(i=0;i<n;i++){printf("%s %s %d\n",s[i].num,s[i].name,s[i].score);}/*********End**********/ return 0;}
第3关:结构体存储数据
任务描述
本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。
三个候选人为"Li", “Zhang”,“Sun”。
相关知识
参考结构体第1关相关知识
编程要求
在右侧编辑器Begin-End处补充代码,用结构体存储数据,求出得票结果。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:
10
Li
Li
Sun
Zhang
Zhang
Sun
Li
Sun
Zhang
Li
预期输出:
Li:4
Zhang:2
Sun:3
测试输入数据说明:
输入数据第一行包含一个整数n,表示有n个人投票。接下来的每一行包含某个候选人的名字。
#include<stdio.h>#include<string.h>/*********Begin*********//*********End**********/int main(void){/*********Begin*********/char str[10];int i,n,sum1=0,sum2=0,sum3=0;scanf("%d",&n);for(i=0;i<n;i++){scanf("%s",str);if(strcmp(str,"Li")==0) sum1++;else if(strcmp(str,"Zhang")==0) sum2++;else if(strcmp(str,"Sun")==0) sum3++;}printf("Li:%d\n",sum1);printf("Zhang:%d\n",sum2);printf("Sun:%d\n",sum3);/*********End**********/ return 0;}
第4关:结构体存储学生信息
任务描述
本关任务:使用结构体储存学生信息(包括学号,姓名,3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。
相关知识
参考结构体第1关相关知识
编程要求
在右侧编辑器Begin-End处补充代码,使用结构体储存学生信息,实现对学生信息修改和删除操作。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:
10 3
1 Siyu 90 90 90
2 Amy 60 70 94
3 Jack 60 60 98
4 Jack 77 90 60
5 Banana 60 60 40
6 White 60 60 60
7 Pinkman 60 60 60
8 Fring 60 60 70
9 Ehrmantraut 80 63 61
10 Schrader 99 66 100
1 Jack
2 1 100 100 100
3 10
测试输入数据说明:
输入一个n,q,标书下面n行则是n个学生的信息,再下q行则是对应的操作。
1 name //为根据名字查询操作
2 sno num1 num2 num2 //为修改分数操作,修改学号为sno的3门成绩
3 sno //为删除操作
预期输出:
3 Jack 60 60 98 218
4 Jack 77 90 60 227
1 Siyu 100 100 100 300
2 Amy 60 70 94 224
3 Jack 60 60 98 218
4 Jack 77 90 60 227
5 Banana 60 60 40 160
6 White 60 60 60 180
7 Pinkman 60 60 60 180
8 Fring 60 60 70 190
9 Ehrmantraut 80 63 61 204
10 Schrader 99 66 100 265
1 Siyu 100 100 100 300
2 Amy 60 70 94 224
3 Jack 60 60 98 218
4 Jack 77 90 60 227
5 Banana 60 60 40 160
6 White 60 60 60 180
7 Pinkman 60 60 60 180
8 Fring 60 60 70 190
9 Ehrmantraut 80 63 61 204
预期输出数据说明:
每次修改操作则输出全部的学生信息,查询操作则输出查询的学生的信息。
#include<stdio.h>#include<string.h>int Count;struct student{ char sno[20],name[20]; int math,english,chinese,sum;};void print(struct student stu){ printf("%s %s %d %d %d %d\n",stu.sno,stu.name,stu.math,stu.english,stu.chinese,stu.sum);}void query_stu(struct student s[],char *name){ /*********Begin*********/ for(int i=0;i<Count;i++) { if(strcmp(s[i].name,name)==0) { s[i].sum=s[i].math+s[i].english+s[i].chinese; printf("%s %s %d %d %d %d\n",s[i].sno,s[i].name,s[i].math,s[i].english,s[i].chinese,s[i].sum); } } /*********End**********/}void delete_stu(struct student s[],char *sno){ /*********Begin*********/ int k=0; for(int i=0;i<Count;i++) { if(strcmp(s[i].sno,sno)==0) { k=i; for(int j=k;j<Count-1;j++) { s[j]=s[j+1]; } } } /*********End**********/}void update_stu(struct student s[],char *sno,int math,int english,int chinese){ /*********Begin*********/ for(int i=0;i<Count;i++) { if(strcmp(s[i].sno,sno) == 0) { s[i].math=math; s[i].english=english; s[i].chinese=chinese; s[i].sum=s[i].math+s[i].english+s[i].chinese; } else{ s[i].sum=s[i].math+s[i].english+s[i].chinese; } } /*********End**********/}int main(void){ int n,q; struct student students[50]; scanf("%d%d",&n,&q); Count=n; for(int i=0;i<n;i++){ /*********Begin*********/ scanf("%s%s%d%d%d",students[i].sno,students[i].name,&students[i].math,&students[i].english,&students[i].chinese); /*********End**********/ } while(q--) { int op; scanf("%d",&op); char sno[20],name[20]; if(op==1){ scanf("%s",name); query_stu(students,name); } else if(op==2){ int a,b,c; scanf("%s%d%d%d",sno,&a,&b,&c); update_stu(students,sno,a,b,c); for(int i=0;i<Count;i++) print(students[i]); } else{ scanf("%s",sno); delete_stu(students,sno); for(int i=0;i<Count-1;i++) print(students[i]); } } return 0;}
文件
文件的概念
我们在操作系统中,就已经看到很多文件,知道每个文件有唯一的名称(文件名.扩展名)来标识,计算机通过文件名对文件进行读、写、修改或删除等操作。而且知道用文件可长期保存数据,数据在使用时才被调入内存。那么C语言中文件的概念与操作系统中文件的概念是否相同呢?
在C语言中,把文件看做是一个有序的字节流,即文件的读取都是以字节为单位的。它与操作系统中文件的概念是相同的。但C语言中的文件类似于数组、结构体等,它是一种数据组织方式,是程序处理的对象。程序可以创建文件,可以读写文件数据。读文件数据是把文件中有序的一个个字符或字节调入内存作为程序处理对象,写文件数据是把程序处理的中间结果或最终结果以一个个字符或字节的形式写入外存储器的文件中。
#####为什么要使用文件
我们知道,程序运行结束后,程序处理的这些数据所占有的内存空间将被释放,会被其他程序或数据占用而不被保存。这样会出现各种问题。比如,运行学生成绩管理系统,输入学生数据,根据应用把操作结果从显示器或打印机输出,而一旦结束此系统的运行,数据没有保存,内存中的数据被释放,那么,下次需要这些运算结果时,只能再次运行这个系统,又需要重新从键盘输入学生数据;并且,当输入/输出数据量较大时,用键盘和显示器就会受到限制,带来不便。另外,当数据变动时,可能需要修改程序。
文件是解决上述问题的有效办法。有了文件,第一,数据可以长期保存,任何时候都可以查看文件数据,不需要重新从键盘输入数据来执行程序;第二,数据通过文件读入比键盘输入更加方便,特别是数据量比较大时;第三,不同程序可以访问同一文件中的数据,实现数据共享;第四,数据文件的改动不引起程序的变动。
第1关:HelloWorld
任务描述
题目描述:向文件in.txt中写入字符串HelloWorld。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,完成本关要求。
测试说明
平台会对你编写的代码进行测试,若与预期输出一致,则算通关。
#include<stdio.h>void solve(){/********** Begin *********/ FILE * pfile = fopen("in.txt","w");fprintf(pfile,"HelloWorld");fclose(pfile);/********** End **********/}
第2关:文件读取和写入
任务描述
题目描述:从文件a.txt中读取三个整数,然后把这三个整数保存到b.txt中,两整数之间一个空格。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,完成本关要求。
格式如下:
100 110 100
####测试说明
平台会对你编写的代码进行测试,若与预期输出一致,则算通关。
#include<stdio.h>void solve(){/********** Begin *********/ int a,b,c; FILE * r=fopen("a.txt","r"); FILE * w=fopen("b.txt","w"); while(fscanf(r,"%d%d%d",&a,&b,&c)!=EOF) fprintf(w,"%d %d %d",a,b,c); fclose(r); fclose(w); /********** End **********/}
第3关:统计文本字母数量
任务描述
题目描述:读取a.txt中文本,统计文本中字母数量。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,完成本关要求。
测试说明
输入
读取a.txt读入文本
如:
abc abc
输出
输出文本中字母数量
样例输入
abc abc
样例输出
6
#include<stdio.h>void solve(){/********** Begin *********/FILE *fp;char word;int num=0;fp=fopen("a.txt","r");while(!feof(fp)){ fscanf(fp,"%c",&word); if((word>='A'&&word<='Z')||(word>='a'&&word<='z')) { num++; }}printf("%d",num-1);fclose(fp);/********** End **********/}
第4关:读取文件中指定学生信息
任务描述
题目描述:实现从文本中读取出指定学号的学生信息并显示,文本文件存放格式是每一行对应一个学生信息,最后一行没有换行符。
相关知识(略)
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,完成本关要求。
测试说明
输入
solve(char s[])已经给一个字符串s,代表学生学号。
文件a.txt存放所有学生信息。
输出
输出该学号学生信息
如果不存在则输出Not Found!
#####样例输入
11405200102
a.txt中内容为:
11405200101 zhangsan 70 80 90 240 80
11405200102 lisi 80 60 70 210 70
#####样例输出
11405200102 lisi 80 60 70 210 70
#include<stdio.h>#include<string.h>void solve(char s[]){/********** Begin *********/ FILE *fp=fopen("a.txt","r"); char num[12],stu[100]; for(int i=0;i<10;i++) { fgets(num,12,fp); fseek(fp,-11*sizeof(char),1); fgets(stu,100,fp); if(strcmp(num,s)==0) { printf("%s",stu); break; } if(i==9) { printf("Not Found!"); } }/********** End **********/}