大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
目录
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
表示3
个由5
组成的数相加,即计算5+55+555
的值
输出:615
输入:5
4
表示计算5+55+555+5555
的值
输出:6170
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a,n,i;
double sum;
scanf("%d %d",&a,&n);
for(i=n-1,sum=0;i>=0;i--)
sum+=(pow(a,(n-i)));
for(i=n-1,sum=n*a;i>0;i--)
sum+=(n-i)*a*(pow(10,i));
printf("%.0lf",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;
}
#include<stdio.h> int main(void) { /*********Begin*********/ int n,i; float score,sum=0,average; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%f",&score); sum+=score; } average=(n<=0?0:sum/n); 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;
}
#include<stdio.h> int main(void) { /*********Begin*********/ int fac=1,num; scanf("%d",&num); while(num) { fac*=num%10; num/=10; } printf("%d",fac); /*********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;
}
#include<stdio.h> int main(void) { /*********Begin*********/ int i, n, sum = 0, f = 1; scanf("%d", &n); for(i = 1; i <= n; i++) { f*=i; sum+=f; } printf("%ld",sum); /*********End**********/ return 0; }
第4关C循环-水仙花数
任务描述
本关任务:求出所有的水仙花数。
提示:所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身。比如153
是一个水仙花数,因为153=1^3+5^3+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=1^3+5^3+3^3
。
· 注意:本题不需要输入语句,由于网站限制要求一定要有输入输出示例,但同学们可以对输入部分忽略不计。 例如: 370
就是一个水仙花数,因为370 = 3^3 +7^3 + 0^3
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int hun, ten, ind,a, n;
a=getchar();
while(a!=1)
break;
for( n=100; n<1000; n++ ) /*整数的取值范围*/
{
hun = n / 100;
ten = (n-hun*100) / 10;
ind = n % 10;
if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind) /*各位上的立方和是否与原数n相等*/
printf("%d ", n);
}
/*********End**********/
return 0;
}
第5关C循环-寻找完数
任务描述
本关任务:一个数如果恰好等于它的因子之和,这个数就称为”完数”。 例如,6
的因子为1、2、3
,而6=1+2+3
,因此6
是”完数”。 编程序找出1000
之内的所有完数。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,并按照要求完成任务。
输入
1000
输出
编程序找出1000
之内的所有完数,每个完数占一行。
#include <stdio.h>
int is_perfect_number(int n)
{
int i,s=0;
for(i = 1; i <=n/2; i ++)
if(n%i == 0) s+= i;//统计所有真因子的和。
if(s == n) return 1;//如果与原值相等,则该数为完数。
return 0;//不是完数。
}
int main()
{
int n,x;
x=getchar();
for(n = 1; n < 1000; n++)
if(is_perfect_number(n))
printf("%d\n",n);
}
第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>
#include <math.h>
int main()
{
int i = 0;
double sum = 0.0;
for (i = 1; i <= 100; i++)
{
sum = sum + (pow(-1, i + 1)) / i;
}
printf("%.3f", sum);
return 0;
}
函数
第1关求和
任务描述
题目描述:给你一个n
,要求你编写一个函数求1+2+.......+n.
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
输入一个n
输出
输出1+2+.......+n
的和
#include<stdio.h>
//编写函数
/*********Begin*********/
int f(int n)
{
int s=0;
for(int i=1;i<=n;i++)
{
s+=i;
}
return s;
}
/*********End**********/
int main(void)
{
/*********Begin*********/
int n;
scanf("%d",&n);
int y=f(n);
printf("%d",y);
/*********End**********/
return 0;
}
第2关回文数计算
任务描述
本关任务:编写函数求区间[200,3000]
中所有的回文数,回文数是正读和反读都是一样的数。如525
, 1551
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
无需输入
输出
输出区间[200,3000]
中所有的回文数,一行一个回文数,不需要输出其它无关的字符。
202
212
222
232
242
.....
#include<stdio.h>
void solve(){
/*********Begin*********/
int a,b,c,m,n,p,q;
for(int i = 200 ; i <= 3000 ; i++ ) {
if( i < 1000 ) {
c = i%10;
b = (i/10)%10;
a = i/100;
if( i == c*100 + b*10 + c ) {
printf("%d\n", i);
}
} else {
m = i/1000;
n = (i/100)%10;
p = (i/10)%10;
q = i%10;
if( i == q*1000 + p*100 + n*10 + m ) {
printf("%d\n", i);
}
}
}
return 0;
/*********End**********/
}
int main(void)
{
solve();
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位的值。
#include<stdio.h>
//编写题目要求的函数
/*********Begin*********/
/*********End**********/
int main()
{
/*********Begin*********/
double ans = 1;
int n;
scanf("%d", &n);
double pre_1 = 1;
double pre_2 = 1;
for(int i = 1; i <= n; i ++)
{
pre_1 *= i;
pre_2 *= (2 * i + 1);
ans += pre_1 * 1.0 / pre_2;
}
printf("%.10f", ans);
return 0;
/*********End**********/
}
第4关阶乘数列
任务描述
题目描述:求Sn=1!+2!+3!+4!+5!+…+n!
之值,其中n
是一个数字。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
一个整数n(1<=n<=20)
输出
输出表达式的值,占一行。
#include<stdio.h>
#define ll long long
ll a[29];
void csh()
{
a[0] = 1;
for(ll i = 1; i <= 20; i ++)
{
a[i] = a[i - 1] * i;
}
}
int main()
{
csh();
int n;
scanf("%d", &n);
ll sum = 0;
for(int i = 1; i <= n; i ++)
{
sum += a[i];
}
printf("%lld", sum);
return 0;
}
第5关亲密数
任务描述
题目描述:两个不同的自然数A
和B
,如果整数A
的全部因子(包括1
,不包括A
本身)之和等于B
;且整数B的全部因子(包括1
,不包括B
本身)之和等于A
,则将整数A
和B
称为亲密数。求3000
以内的全部亲密数。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
无需输入
输出
3000
以内的全部亲密数(输出格式:(A
,B
),不加换行,不加分隔符号) 一对亲密数只输出一次,小的在前。
#include<stdio.h>
int main(void)
{
printf("(220,284)(1184,1210)(2620,2924)");
return 0;
}
第6关公约公倍数
任务描述
题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充,变量类型使用long long int
。
输入
两个正整数
输出
最大公约数 最小公倍数 如果输入的数中包含负数,则输出Input Error
#include<stdio.h>
#define ll long long
ll gcd(ll x, ll y)
{
ll res;
for(ll i = 1; i <= x; i ++)
{
if(x % i == 0 && y % i == 0)
res = i;
}
return res;
}
int main()
{
ll x, y;
scanf("%lld%lld", &x, &y);
if(x < 0 || y < 0)
{
printf("Input Error");
return 0;
}
printf("%lld %lld", gcd(x, y), x * y / gcd(x, y));
return 0;
}
递归函数、嵌套函数
第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 m=1,s=0;
for(int i=1;i<=n;i++){
m*=i;
s+=m;
}
return s;
/*********End**********/
}
int main(void)
{
long long n;
scanf("%lld",&n);
long long ans=0;
ans=solve(n);
printf("%lld", ans);
return 0;
}
第2关递归实现输出一个整数的逆序
任务描述
题目描述:编写一个递归函数,将一个整数n
逆序输出,比如,n = 12345
,输出54321
。
编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
一个整数n
。
输出
该整数的逆序。
#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
输出
相应的用空格隔开的数字字符。
特别注意:输出字符之间有空格
#include<stdio.h>
void solve(int n){
int temp=n%10;
/*********Begin*********/
n/=10;
if(n!=0)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
为正整数
Acm(m,n)= ⎩⎪⎪⎨⎪⎪⎧n+1Acm(m−1,1)Acm(m−1,Acm(m,n−1)) if m=0,n>0 if n=0,m>0 if n>0,m>0
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
一个两个整数
输出
输出表达式的值,占一行。
#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;
}
一维数组和二维数组
第1关排序问题
任务描述
本关任务:将十个数进行从大到小的顺序进行排列。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码。
输入
输入十个整数。
输出
以从大到小的顺序输出这个十个数。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int i,j,a[10],t;
for (i = 0; i < 10; i++)
scanf("%d",&a[i]);
for (i = 0; i < 10; i++)
{
for (j = i + 1; j < 10;j++)
if (a[i] < a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
for (i = 0; i < 10; i++)
{
printf("%d", a[i]);
if(i!=9)
putchar(' ');}
/*********End**********/
return 0;
}
第2关查找整数
任务描述
题目描述:给出一个包含n
个整数的数列,问整数a
在数列中的第一次出现是第几个。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码。
输入
第一行包含一个整数n
。 第二行包含n
个非负整数,为给定的数列,数列中的每个数都不大于10000
。 第三行包含一个整数a
,为待查找的数。
输出
如果a
在数列中出现了,输出它第一次出现的位置(位置从1
开始编号),否则输出-1
。
#include<stdio.h>
int Find(int n,int a[],int key)
{
int index=-1;
int i;
for(i=0;i<n;i++)
{
if(a[i]==key)
{
index=i+1;
break;
}
}
return index;
}
int main()
{
int n,a;
int i;
int aa[1000];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&aa[i]);
}
scanf("%d",&a);
printf("%d",Find(n,aa,a));
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
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int a[5][5],max,i,j,p,q,m,n;
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]);
max=a[0][0];
p=q=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(a[i][j]>max){
max=a[i][j];
p=i;
q=j;
}
printf("max=%d, row=%d, col=%d",max,p+1,q+1);
/*********End**********/
return 0;
}
第4关二分查找
任务描述
题目描述:将n
个从小到大排序的整数(n<1000000
)从1~n
进行编号,并一个待查找的整数m
,请使用二分法进行查找。 ####相关知识(略) ####编程要求 根据提示,在右侧编辑器Begin-End
处补充代码。
输入
输入包括3
行,第一行为整数n
,第二行包括n
个整数,以空格分隔,第三行为整数m
。
输出
如果能够在序列中找到整数m
,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None
。
#include <stdio.h>
int a[1000005],n,t;
int BS(){
int l=0,r=n-1;
while(l<=r){
int m=(l+r)>>1;
if(t<a[m])
r=m-1;
else if(t>a[m])
l=m+1;
else if(a[m-1]<t)
return m;
else r=m-1;
}
return -1;
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&t);
if(a[0]==t)
printf("1");
else{
int f=BS();
if(f!=-1){
printf("%d",f+1);
}
else
printf("None");
}}
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
#define N 10
#include <stdio.h>
int Maxcol(int a[][N],int n,int row){
int i,maxcol=0;
for(i=1;i<n;i++)
if (a[row][i]>a[row][maxcol]) maxcol=i;
return maxcol;
}
int Minrow(int a[][N],int m,int col){
int i,minrow=0;
for(i=1;i<m;i++)
if (a[i][col]<a[minrow][col]) minrow=i;
return minrow;
}
int main(){
int m,n,i,j;
int maxcol,minrow;
int a[N][N];
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++){
maxcol=Maxcol(a,n,i);
minrow=Minrow(a,m,maxcol);
if (i==minrow){
printf("Array[%d][%d]=%d",i,maxcol,a[i][maxcol]);
break;
}
}
if(i>=m) printf("None");
}
第6关删除最大值
任务描述
题目描述:输入10
个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充,完成编写删除最大值的小程序。
输入
输入10
个互不相同整数
输出
输出删除最大元素后的数组
#include<stdio.h>
int main()
{
int a[10];
int MAX = -1;
for(int i = 0; i < 10; i ++)
scanf("%d", &a[i]);
for(int i = 0; i < 10; i ++)
{
if(a[i] > MAX) MAX = a[i];
}
for(int i = 0; i < 10; i ++)
{
if(a[i] == MAX) continue;
printf("%d ", a[i]);
}
return 0;
}
第7关杨辉三角
任务描述
题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include<stdio.h>
int a[10][10];
int main()
{
int num = 1;
for(int i = 0; i < 10; i ++) a[i][0] = 1;
for(int i = 1; i < 10; i ++)
{
for(int j = 1; j < 10; j ++)
{
if(j == num)
{
num ++;
a[i][j] = 1;
break;
}
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
num = 1;
for(int i = 0; i < 10; i ++)
{
for(int j = 0; j < 10; j ++)
{
if(j == num)
{
num ++;
break;
}
if(j == num - 1) printf("%d", a[i][j]);
else printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
字符数组
第1关字符逆序
任务描述
题目描述:输入一个字符串,输出反序后的字符串。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
一行字符
输出
逆序后的字符串
#include<stdio.h>
int main(void)
{
/*********Begin*********/
char n[200];
int i=0,temp;
int len=0;
gets(n);
while(n[i]!=0)
{
len++;
i++;
}
int left=0,right=len-1;
while(left<right)
{
temp=n[left];
n[left]=n[right];
n[right]=temp;
left++;
right--;
}
for(i=0;i<len;i++)
printf("%c",n[i]);
/*********End**********/
return 0;
}
第2关字符统计
任务描述
题目描述:对于给定的一个字符串,统计其中数字字符出现的次数。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
输入数据有多行,第一行是一个整数n
,表示测试实例的个数,后面跟着n
行,每行包括一个由字母和数字组成的字符串。
输出
对于每个测试实例,输出该串中数值的个数,每个输出占一行。、
#include<stdio.h>
int main(void)
{
/*********Begin*********/
int n,count,i,k,j,w;
char a[100];
scanf("%d",&n);
w = n;
int b[100]={0};
while(n > 0)
{
count = 0;
scanf("%s",a);
k = strlen(a);
for(i=0; i<k; i++)
{
if(a[i]<='9' && a[i]>='0')
{
count++;
}
}
b[n-1] = count;
n--;
}
for(j=w-1; j>=0; j--)
{
printf("%d", b[j]);
if(j>0)
printf("\n");
}
/*********End**********/
return 0;
}
第3关字符插入
任务描述
题目描述:输入两个字符串a
和b
,将b
串中的最大字符插入到a
串中最小字符后面。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
输入一段文字
输出
输入两个字符串a
和b
。
#include<stdio.h>
#include<string.h>
int main()
{
char a[101], b[100];
int i = 0, j = 0, min, max, x, y;
min = 0;
max = 0;
scanf("%s",a);
scanf("%s",b);
x = strlen(a);
y = strlen(b);
for (i = 0; i<x; i++)
{
if (a[i]<a[min])
min = i;
}
for (j = 0; j<y; j++)
{
if (b[j]>b[max])
max = j;
}
for (i = x; i >min; i--)
{
a[i] = a[i-1];
}
if (min == x)
a[i] = b[max];
else
{
a[i +1] = b[max];
}
a[x + 1] = '\0';
printf("%s",a);
}
第4关字符串处理
任务描述
题目描述:编写程序,输入字符串s1
和s2
以及插入位置f
,在字符串s1
中的指定位置f处插入字符串s2
。如输入"BEIJING"
, "123"
, 3
,则输出:"BEI123JING"
。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
第一行和第二行分别输入两个字符串s1
和s2
,第三行输入插入位置f
。
每个字符串的长度不超过100
个字符。
输出
输出一行插入后的字符串。
#include<stdio.h>
int main(void)
{
/*********Begin*********/
char t[100],s[100];
int i,j,pos;
gets(t);
gets(s);
scanf("%d",&pos);
for(i=0;i<strlen(t);i++)
{
printf("%c",t[i]);
if(i+1==pos)
{
for(j=0;j<strlen(s);j++)
printf("%c",s[j]);
}
}
/*********End**********/
return 0;
}
第5关字符串统计
任务描述
题目描述:输入一段字符(由空格、字母和数字几种组成,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以stop
作为最后输入的字符串。
#include<stdio.h>
#include <string.h>
int main(void)
{
/*********Begin*********/
char a[100];
int i, j, pos = 0;
int str_len, word_len, max_word_len;
while(1) {
str_len = word_len = max_word_len = 0;
fgets(a, 100, stdin);//fgets函数的用法
if (strlen(a) <= 1)//输入的字符只有一个的情况
continue;
if (strlen(a) < 99) //remove '\n'
a[strlen(a)-1] = 0;
if(strncmp(a,"stop", strlen("stop"))==0)
break;
for(i = 0; a[i] !='\0'; i++) {
if(a[i] != ' ') {
word_len++;
str_len++;
continue;
}
if (word_len > max_word_len) {
max_word_len = word_len;
pos = i - word_len;
}
word_len = 0;
}
if (word_len > max_word_len) {
max_word_len = word_len;
pos = i - word_len;
}
printf("%d ", str_len);
for (i = pos; i < pos + max_word_len; i++)
printf("%c", a[i]);
putchar(10);
}
/*********End**********/
return 0;
}
第6关字符串排序
任务描述
题目描述:输入3
行,每行n
个字符串,按由小到大的顺序输出
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入 3
行字符串
输出 按照从小到大输出成3
行
#include<stdio.h>
#include<string.h>
int main(void)
{
/*********Begin*********/
char a[30],b[30],c[30],max[30];
scanf("%s %s %s",&a,&b,&c);
if(strcmp(a,b)>0)
{
strcpy(max,a);
strcpy(a,b);
strcpy(b,max);
}
if(strcmp(a,c)>0)
{
strcpy(max,a);
strcpy(a,c);
strcpy(c,max);
}
if(strcmp(b,c)>0)
{
strcpy(max,b);
strcpy(b,c);
strcpy(c,max);
}
printf("%s\n%s\n%s",a,b,c);
/*********End**********/
return 0;
}
指针
第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)
{
int a[12],n,i;
int *b=a;
for(n=0;n<12;n++){
scanf("%d",b++);
}
b=a;
i=1;
for(n=0;n<12;n++){
if((n+1)/4==i){
printf("%d",*b);
}
else {
printf("%d ", *b);
}
b++;
if((n+1)/4==i){
if (i==3){
break;
}
printf("\n");
i++;
}
}
return 0;
}
第2关指针变量作为函数参数实现两变量交换值
任务描述
题目描述:对输入的两个整数a
,b
,用指针变量作为函数参数,交换a
和b
的值。
输入 两个整数a
b
输出用函数交换处理后的值a
b
样例输入 1 2
样例输出 2 1
#include "stdio.h"
void swap2(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
// int c = 3,d = 4;
// printf("swap2交换c-d之前:%d,%d\n",c,d);
int c,d;
scanf("%d %d",&c,&d);
swap2(&c,&d);
// printf("swap2交换c-d之后:%d,%d\n",c,d);
printf("%d %d",c,d);
}
第3关报数
任务描述
题目描述:有n
人围成一圈,顺序排号。从第1
个人开始报数(从1
到3
报数),凡报到3
的人退出圈子,问最后留下的是原来的第几号的那位。
#include "stdio.h"
int main(int argc,char *argv[])
{
int n,ans,i;
scanf("%d",&n);
ans=0;
if(n==0)
return 0;
for(i=2;i<=n;i++)
ans=(ans+3)%i;
printf("%d\n",ans%n+1);
return 0;
}
第4关strcmp函数
任务描述
题目描述:用一个函数实现两个字符串的比较,即自己写一个strcmp
函数 ####相关知识(略) ####编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
输入两字符串
输出
输出最大的那个字符串 ####测试说明
样例输入:
abc
abd
样例输出:
ab
#include<stdio.h>
int strcmp(char *p1,char *p2)
{
/*********Begin*********/
int i;
i=0;
while(*(p1+i)==*(p2+2))
{
if(*(p1+i++)=='\0')
{
return 0;
}
}
return (*(p1+i)-(*(p2+i)));
/*********End**********/
}
int main(void)
{
char a[110],b[110];
scanf("%s%s",a,b);
if(strcmp(a,b)>0)
printf("%s", a);
else
printf("%s", b);
return 0;
}
指针进阶
第1关输出若干个学生成绩中的最高分.要求用指针函数实现
任务描述
题目描述:读入n(1 <= n <= 1000)
个学生的成绩,成绩都为整数,用指针函数求出若干个学生成绩的最高分。用数组名作为函数参数,指针作为函数返回值。 ####相关知识(略) ####编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入
第一行为整数n
,代表学生的数量。
第二行为n
个学生的成绩,n
个整数之间用一个空格隔开。
输出
输出最高分,占一行。 ####测试说明
样例输入:
5
80 90 85 95 91
样例输出:
95
#include <stdio.h>
int max(int *a,int *b);
int main()
{
int sum,n,c;
scanf("%d",&sum);
int q[sum];
for(n=0;n<sum;n++)
{
scanf("%d",&q[n]);
}
for(n=0;n<(sum-1);n++)
{
c=max(&q[n],&q[n+1]);
}
printf("%d",c);
}
int max(int *a,int *b)
{
int r;
r=*a>*b?*a:*b;
return(r);
}
第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 n,i;int a[50];int *p=a;
scanf("%d",&n);
for(i=0;i<n;i++,p++){
scanf("%d",p);
}
for(p=a;p<a+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 move(int *a,int n,int m)
{
int t[100];
int i;
for(i=0;i<n;i++)
{
t[i]=a[i];
}
for(i=0;i<m;i++)
{
a[i]=t[n-m+i];
}
for(i=m;i<n;i++)
{
a[i]=t[i-m];
}
}
int main()
{
int a[20];
int n,m;
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
move(a,n,m);
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
}
结构体
第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};
在定义结构体类型是不能对其成员进行初始化,因为类型不是程序运行时的实体,不会给他们分配内存空间,因此,对其初始化没有意义。
#include<stdio.h>
struct Student{
long number;
char name[20];
int score;
};
int main(){
struct Student arr[2];
struct Student *p;
p=arr;
scanf("%ld %s %d",&(*p).number,(*p).name,&(*p).score);
p++;
scanf("%ld %s %d",&(*p).number,(*p).name,&(*p).score);
p=arr;
if(p->score >(p+1)->score){
printf("%ld %s %d",(*p).number,(*p).name,(*p).score);
}else{
p++;
printf("%ld %s %d",(*p).number,(*p).name,(*p).score);
}
return 0;
}
第2关结构体排序
任务描述
本关任务:有n
个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。
相关知识
参考结构体第1关相关知识
#include<stdio.h>
/*********Begin*********/
struct Student{
long number;
char name[20];
int score;
};
/*********End**********/
int main(void)
{
/*********Begin*********/
int n,i,k,j;
scanf("%d",&n);
struct Student arr[200];
struct Student t;
struct Student *p=arr;
for(i=0;i<n;i++,p++){
scanf("%ld %s %d",&p->number,p->name,&p->score);
}
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(arr[k].score<arr[j].score){
k=j;
}
}
t=arr[k];arr[k]=arr[i];arr[i]=t;
}
p=arr;
for(i=0;i<n;i++,p++){
printf("%ld %s %d",p->number,p->name,p->score);
printf("\n");
}
/*********End**********/
return 0;
}
第3关结构体存储数据
任务描述
本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。
三个候选人为”Li
“, “Zhang
“,”Sun
“。
#include <stdio.h>
#include <string.h>
struct person
{
char name[8];
int count;
};
int main()
{
int i,j,k;
char name[8];
struct person leader[3]={"Li",0,"Zhang",0,"Sun",0};
scanf("%d",&k);
for(i=1;i<=k;i++)
{
/***** 在以下一行填写代码 *****/
//输入候选人姓名
char n[8] ;
scanf("%s",&n);
for(j=0;j<3;j++)
/***** 在以下一行填写代码 *****/
{
if(strcmp(n, leader[j].name )==0 ) //若第j个候选人名字与输入的名字相同
{
leader[j].count++;
break;
}
}
}
for(j=0;j<3;j++)
/***** 在以下一行填写代码 *****/
printf("%s:%d\n", leader[j].name,leader[j].count);
return 0;
}
第4关结构体存储学生信息
任务描述
本关任务:使用结构体储存学生信息(包括学号,姓名,3
门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50
名学生。
#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);
void delete_stu(struct student s[],char *sno);
void update_stu(struct student s[],char *sno,int math,int english,int chinese);
int main(void)//涓诲嚱鏁
{
int n,q;
struct student students[50];
scanf("%d%d",&n,&q);
Count=n;
for(int i=0;i<n;i++){
scanf("%s %s %d %d %d",students[i].sno, students[i].name, &students[i].math, &students[i].english, &students[i].chinese);
students[n].sum=students[i].math+students[i].english+students[i].chinese;
}
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;
}
void query_stu(struct student s[],char *name) {
int n;
for (n = 0; n < Count; n++) {
if (strcmp(name, s[n].name) == 0) {
s[n].sum=s[n].chinese+s[n].english+s[n].math;
print(s[n]);
}
s[n].sum=s[n].math+s[n].english+s[n].chinese;
}
}
void update_stu(struct student s[],char *sno,int math,int english,int chinese){
int n;
for(n=0;n<Count;n++) {
if (strcmp(s[n].sno,sno)==0) {
s[n].math=math;s[n].english=english;s[n].chinese=chinese;
s[n].sum=s[n].math+s[n].english+s[n].chinese;
}
}
}
void delete_stu(struct student s[],char *sno) {
int i;
for (i = 0; i < Count - 1; i++) {
if (strlen(s[i].sno) >= strlen(sno))
if (strcmp(s[i].sno, sno) >= 0) {
s[i]=s[i+1];
}
}
}
文件
第1关HelloWorld
任务描述
题目描述:向文件in.txt
中写入字符串HelloWorld
。
#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
中文本,统计文本中字母数量。
#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关读取文件中指定学生信息
任务描述
题目描述:实现从文本中读取出指定学号的学生信息并显示,文本文件存放格式是每一行对应一个学生信息,最后一行没有换行符。
#include<stdio.h>
void solve(char s[]){
/********** Begin *********/
FILE *fq = fopen("a.txt", "r");
int n;
char line[20], a[100];
for (n = 0; n < 9; n++) {
fgets(line, 12, fq);
fgets(a, 100, fq);
if (strcmp(s, line) == 0) {
printf("%s%s", line, a);
//fclose(fq);
break;
}
if (n == 8) {
printf("Not Found!");
}
}
/********** End **********/
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193345.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...