目录
C语言程序设计编辑与调试环境
第1关打印输出 Hello World
任务描述
本关任务:通过运行一个C
语言程序,让你初步了解程序的运行方法。
#include<stdio.h>
int main(void)
{
/********* Begin *********/
printf( "Hello World\n" );
system( "pause" );
/********* 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
;
#include<stdio.h>
int main(void)
{
/********* Begin *********/
int a, b, c,ma=-999999;
scanf("%d,%d,%d",&a,&b,&c);
if(a>ma){
ma=a;
}
if(b>ma){
ma=b;
}
if(c>ma){
ma=c;
}
printf("max=%d",ma);
/********* End *********/
return 0;
}
第4关熟悉C语言调试过程
任务描述
本关任务:以下程序源代码有错误,请使用C
语言的调试功能,检查程序的错误并更正,使之能正确运行。
编程要求
程序中要求键盘输入x
的值,当x
的值为5
时输出*****
,否则输出#####
。
-
输入:整数
x
的值。 -
输出:当
x
的值为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 *********/
}
顺序结构程序设计
第1关加法运算
任务描述
本关任务:写一个加法程序,输入整数a,b
,输出他们的和。
#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",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 }
#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=a+b;
b=a-b;
a=a-b;
/*********End**********/
printf("a=%d b=%d\n",a,b);
return 0;
第3关用宏定义常量
任务描述
本关任务:已知某物品单价为30
,数量为x
。求商品的总价钱。用宏定义物品的单价。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,用宏定义物品的单价。
-
输入:一个整数
x
,代表物品的数量。 -
输出:输出总价格。
#include<stdio.h> int main(void) { /*********Begin*********/ int x,y; scanf("%d",&x); y=30*x; printf("%d\n",y); /*********End**********/ return 0; }
第4关数字分离
任务描述
输入一个三位数,分别求出x
的各位数字,十位数字,百位数字的值。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,输入一个三位数,分别求出x
的各位数字,十位数字,百位数字的值。
-
输入:一个三位数
-
输出:输出该数字的百位,十位,个位,数字之间用一个空格隔开。
#include<stdio.h> int main(void) { /*********Begin*********/ int k,l,m,n; scanf("%d",&k); l=k/100; m=k/10%10; n=k%10; printf("%d %d %d\n",l,m,n); /*********End**********/ return 0; }
第5关计算总成绩和平均成绩
任务描述
本关任务:编程求从键盘上输入一个学生的五门成绩,计算出该学生的总成绩和平均成绩。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,编程求从键盘上输入一个学生的五门成绩,计算出该学生的总成绩和平均成绩。
-
输入:五个整数
-
输出:总成绩和平均成绩,其中平均成绩保留小数点后两位。
#include<stdio.h> int main(void) { /*********Begin*********/ int a,b,c,m,n,sum; float s; scanf("%d%d%d%d%d",&a,&b,&c,&m,&n); sum=a+b+c+m+n; s=sum/5.00; printf("%d %.2f",sum,s); /*********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
位小数。#include<stdio.h> int main(void) { /*********Begin*********/ float a,b,c,area,s; scanf("%f %f %f",&a,&b,&c); s=(a+b+c)/2.0; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("%.3f",area); /*********End**********/ return 0; }
第7关立体几何计算题
任务描述
本关任务:设圆半径r
,圆柱高h
, 求圆周长C1
,半径为r的圆球表面积Sb
,圆半径r
,圆柱高为h的圆柱体积Vb
。 用scanf
输入数据,输出计算结果,输出时取小数点后两位数字。请编程序。 PI=3.14
编程要求
-
输入:两个double型浮点数,
r
和h
; -
输出:圆周长
C1
、圆球表面积Sb
、圆柱体积Vb
。 保留两位小数,每个结果后换行。#include<stdio.h> #define PI 3.14 int main(void) { /*********Begin*********/ double r,h,C1,Sb,Vb; scanf("%lf,%lf",&r,&h); C1=2*PI*r; Sb=4*PI*r*r; Vb=PI*r*r*h; printf("C1=%.2lf\n",C1); printf("Sb=%.2lf\n",Sb); printf("Vb=%.2lf\n",Vb); /*********End**********/ return 0; }
第8关计算两个正整数的最大公约数
任务描述
编程计算两个正整数的最大公约数。其中求最大公约数的函数原型已经给出,请在主函数中编程调用函数,输出最大公约数。
程序的运行示例: 12,3↙
3
####函数原型说明 求最大公约数的函数原型如下: int MaxCommonFactor( int a, int b);
返回值:返回的是最大公约数;若输入的数据有任意一个不满足条件,返回值是-1
。 参数:a,
b是两个整型数
相关知识
本任务主要考察函数的调用方法。 ####编程要求 根据提示,在右侧编辑器Begin-End
处补充代码,编程计算两个正整数的最大公约数。
- 输入:输入格式:
"%d,%d"
- 输出:输出格式:
"%d\n"
#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 n,m; scanf("%d,%d",&n,&m); printf("%d\n",MaxCommonFactor(n,m)); /*********End**********/ return 0; }
选择结构程序设计
第1关排序
任务描述
本关任务:下面的程序是从键盘输入三个整数按从小到大的顺序输出。
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
相关知识
输入格式
输入格式如下:
printf("请输入三个整数:");
scanf("%d%d%d",&a,&b,&c);
输出
排序输出从小到大的三个整数。
输出格式如下:
printf("从小到大排列为:%d,%d,%d",a,b,c);
#include<stdio.h>
#include<math.h>
int main(void)
{
/*********Begin*********/
int a[10];
printf("请输入三个整数:");
for(int i=1;i<=3;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<3;i++){
for(int j=i+1;j<4;j++){
if(a[i]>a[j]){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
printf("从小到大排列为:%d,%d,%d",a[1],a[2],a[3]);
/*********End**********/
return 0;
}
第2关选择结构-闰年判断
任务描述
编写程序,完成如下功能:从键盘输入任意年份year
,判别该年份是否闰年。 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
相关知识
输入
从键盘任意输入一个年份 。
输出
根据是否闰年进行输出,是输出"****是闰年!
",否输出"****不是闰年!
",其中****为当前输入的年份。
样例输入
2000
样例输出
2000 是闰年!
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int year;
scanf("%d",&year);
if((year%400==0) || (year%4==0&&year%100!=0)){
printf("%d 是闰年!",year);
}
else{
printf("%d 不是闰年!",year);
}
/*********End**********/
return 0;
}
第3关选择结构-分段函数问题
任务描述
本关任务:编写程序,根据输入的值,输出函数的值。
有一个函数,定义如下
写一段程序,输入x
,输出y
。
相关知识
输入
从键盘任意输入一个数x
输出
一个数y
,保留小数点后三位。
#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("%.3f",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!
”
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n;
scanf("%d",&n);
if(n>100 || n<0)
{
printf("Score is error!");
return 0;
}
else if(n>=90 && n<=100)
{
printf("A");
return 0;
}
else if(n>=80 && n<=89)
{
printf("B");
return 0;
}
else if(n>=70 && n<=79)
{
printf("C");
return 0;
}
else if(n>=60 && n<=69)
{
printf("D");
return 0;
}
else if(n<60)
{
printf("E");
return 0;
}
/*********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"
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
#include<stdio.h>
int main(void)
{
int area;
float weight,price,x1,x2;
scanf("%d,%f",&area,&weight);
if (weight<=1)
{
x1=1.0;
}
else{
x1=1.0;
x2=ceil(weight-1);
}
if (area>0&&area<=4){
switch(area){
case(0):price=x1*10+x2*3;break;
case(1):price=x1*10+x2*4;break;
case(2):price=x1*15+x2*5;break;
case(3):price=x1*15+x2*6.5;break;
case(4):price=x1*15+x2*10;break;
}
printf("Price: %5.2f\n",price);
}
else {
printf("Error in Area\n");
printf("Price: 0.00\n");
}
/*********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"
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
float a,b,c,x1,x2;
printf("Please enter the coefficients a,b,c:\n");
scanf("%0f,%0f,%0f",&a,&b,&c);
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
if((b*b-4*a*c)<0)
{
printf("error!\n");
}
else
{
printf("x1=%.4f, x2=%.4f\n",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"
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
printf("Enter item number:\n");
int n;
scanf("%d",&n);
printf("Enter unit price:\n");
float p;
scanf("%f",&p);
printf("Enter purchase date (mm/dd/yy):\n");
int m,d,y;
scanf("%d/%d/%d",&m,&d,&y);
printf("Item Unit Purchase\n");
printf("%-9d$ %-9.2f%02d%02d%02d\n",n,p,m,d,y);
/*********End**********/
return 0;
}
循环结构程序设计1
第1关小球自由落体运动
任务描述
一球从M
米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N
次落地时反弹多高?共经过多少米? 结果保留两位小数。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,并按照要求完成本关任务。
输入
从键盘输入M
和N
的值。
输出
它在第N
次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
float m,n,h,i,t,sum;
scanf("%f %f",&m,&n);
sum=m;
for(i=1;i<n;i++)
{
t=m/2;
h=t/2;
sum+=2*t;
m=t;
}
printf("%.2f %.2f",h,sum);
/*********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);
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n,y=1,i;
scanf("%d",&n);
for(i=5;i<=n;i+=5)y*=i;
printf("%d\n",y);
return 0;
/*********End**********/
return 0;
}
第3关最大公约数和最小公倍数
任务描述
本关任务:输入两个正整数m
和n
,求其最大公约数和最小公倍数。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,输入两个正整数m
和n
,求其最大公约数和最小公倍数。
输入
从键盘上任意输入两个数。
输出
分两行输出,第一行输出:最大公约数是多少;第二行输出最小公倍数是多少。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int x, y, z, m, n;
scanf("%d%d", &x, &y);
m = x, n = y;
while (y != 0)
{
z = x%y;
x = y;
y = z;
}
printf("最大公约数是:%d\n", x);
printf("最小公倍数是:%d", m*n / x);
/*********End**********/
return 0;
}
第4关字符串中各类字符数的统计
任务描述
本关任务:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
输入
一行字符。
输出
统计每种字符的个数值。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int letter=0,space=0,digit=0,other=0;/*定义变量并初始化*/
char c;/*定义字符串c*/
while((c=getchar())!='\n')/*判断c是否是回车键*/
if(c>='a'&&c<='z'||c>='A'&&c<='Z')/*判断c是否是字母*/
letter++;/*计算字母个数*/
else if(c==' ')/*判断c是否是空格*/
space++;/*计算空格个数*/
else if(c>='0'&&c<='9')/*判断c是否是数字*/
digit++;/*计算数字个数*/
else
other++;/*计算其他字符个数*/
printf("%d %d %d %d",letter,digit,space,other);
/*********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
表示<