- Nowcoder 《C语言刷题笔记》 BC1-BC15
- 0x00 写在前面
- 0x01 简单输出
- BC1 Nowcoder
- BC2 小飞机
- 0x02 基本类型
- BC3 整数
- BC4 浮点数
- BC5 字符
- BC6 第二个整数
- BC7 字符矩形
- BC8 字符菱形
- BC9 字符转ASCII码
- BC10 实现四舍五入输出
- BC11 成绩输入输出
- BC12 学生基本信息输入输出
- BC13 出生日期输入输出
- BC14 按照格式输入并交换输出
- BC15 大小写转换
为了夯实基础,除了要学习C语言的知识点,刷题也是必不可少的。
在这里分享一下我的牛客网刷题笔记,希望能够给你带来帮助!传送门
0x01 简单输出 BC1 Nowcoder输出"Hello Nowcoder!",开始你的编程之旅吧。
输入:
输出:hello Nowcoder!
#includeint main() { printf("Hello Nowcoder!"); return 0; }
和第一个C语言程序hello world一样,这是一个简单的程序,使用库函数printf()在屏幕上将hello Nowcoder!输出即可实现,最后我们看一下效果!
程序执行结果如下:
BC2 小飞机
KiKi学会了printf在屏幕输出信息,他想输出一架小飞机。请帮他编写程序输出这架小飞机。
输入:
输出:小飞机图形
#includeint main() { printf(" **n"); printf(" **n"); printf("************n"); printf("************n"); printf(" * *n"); printf(" * *n"); return 0; }
这个程序也比较简单,只需要按照题目要求将星号*组成小飞机的图案再输出即可。
程序执行结果如下:
0x02 基本类型 BC3 整数
牛牛刚刚出生,嗷嗷待哺,一开始他只能学说简单的数字,你跟他说一个整数,他立刻就能学会。
输入一个整数,输出这个整数。
输入:输入一个整数,范围在32位有符号整数范围内
输出:输出这个整数
#includeint main() { int a=0; scanf("%d",&a); printf("%d",a); return 0; }
根据输入输出描述,我们使用int定义一个整形变量a用来接收输入,并以%d的形式打印输出即可!
程序执行结果如下:
备注:程序运行在Lightly环境下。
BC4 浮点数
会说整数之后,牛牛开始尝试浮点数(小数)
输入:输入一个浮点数
输出:输出一个浮点数,保留三位小数
#includeint main() { float f; scanf("%f",&f); printf("%.3f",f); return 0; }
根据输入输出描述,我们使用float定义一个浮点型变量f用来接收输入,并以%f的形式打印输出即可!当然也可以用double,结果以%lf的形式来接收并打印输出。
- 需要注意的一点是如果要保留三位小数,要以%.3f的形式打印输出。
程序执行结果如下:
BC5 字符
会说浮点数之后,牛牛开始尝试字符
输入:输入一个字符,范围在ascii范围内
输出:输出这个字符
#includeint main() { char c; scanf("%c",&c); printf("%c",c); return 0; }
根据输入输出描述,我们使用char定义一个字符型变量c用来接收输入,并以%c的形式打印输出即可!
程序执行结果如下:
BC6 第二个整数
牛牛从键盘上输入三个整数,并尝试在屏幕上显示第二个整数。
输入:一行输入 3 个整数,用空格隔开。
输出:请输出第二个整数的值。
#includeint main() { int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("%d",b); return 0; }
我们定义三个整形变量分别接收三个输入后,打印输出接收到第二个整形变量。
用空格隔开,在scanf里我们每接收一个整形给一个空格即可。
程序执行结果如下:
BC7 字符矩形
牛牛尝试用键盘读入一个字符,然后在屏幕上显示用这个字符组成的 3*3 的矩形。
输入:一行读入一个 char 类型的字符。
输出:输出这个字符组成的 3*3 矩形。
#includeint main() { char c; scanf("%c", &c); int i; for(i=0;i<3;i++) { printf("%c%c%cn", c, c, c); } return 0; }
先接收,再使用一个简单的for循环打印输出三行即可!
程序执行结果如下:
BC8 字符菱形
输入:输入一个char类型字符
输出:输出一个用这个字符填充的对角线长5个字符,倾斜放置的菱形
1、笨方法
先说一个笨方法,题目要求对角线长5个字符,我们可以直接手动打出。
int main()
{
char c;
scanf("%c",&c);
printf(" %c n",c);
printf(" %c%c%c n",c,c,c);
printf("%c%c%c%c%cn",c,c,c,c,c);
printf(" %c%c%c n",c,c,c);
printf(" %c n",c);
return 0;
}
2、思维拓展
如果说要打印出对角线长99个字符的菱形呢,我们可以再卖卖力气敲出来,但是没必要这么辛苦,既然我们懂一点点C语言,就可以用编程的思维来解决问题。
观察一下上面的图形,我们可以把它分为上下两个部分——上面的3行,和下面的2行,对应到对角线的长度就是up=5/2+1,down=5/2,/是C语言中的除号,计算结果会保留商而舍去余数。
因为是菱形,所以每次打印的符号都是奇数行,我们先定义一个全局变量表示对角线字符长度,这样就方便我们推而广之。
- 第一步
#define LEN 5//定义一个全局变量表示对角线字符长度 #includeint main() { char c; scanf("%c",&c); int up=LEN/2+1;//上半部分行数 int down=LEN/2;//下半部分行数 //打印上半部分 //打印下半部分 return 0; }
上面的代码实现了接收字符,接下来我们先打印上半部分。为了减少代码量,可以使用循环语句,每次循环打印一行。
| 行号 | 空格个数 | 符号个数 |
|---|---|---|
| 1 | ⬜⬜ | # |
| 2 | ⬜ | ### |
| 3 | ##### |
我们定义一个从0开始的循环变量i来控制输出的行数,再定义一个从0开始的循环变量j来控制每一行输出的内容。
那么空格个数和循环变量i的内在联系是up-1-i,打印完一行后,i会自增,下一行就会少打一个空格;
符号个数和i的内在联系就是2*i+1,打印完一行后,i会自增,下一行就会多打两个符号。
- 第二步
int i,j; for(i=0;i//打印空格,按照2、1、0递减 for(j=0;j printf(" "); } //打印符号 for(j=0;j<2*i+1;j++) { printf("%c",c); } printf("n");//打印完之后换行 }
我们再打印下半部分
| 行号 | 空格个数 | 符号个数 |
|---|---|---|
| 1 | ⬜ | ### |
| 2 | ⬜⬜ | # |
我们将循环变量初始化为0;
空格个数和循环变量i的关系就是i+1,打印完一行,下一行多打印一个空格;
符号个数和i的内在联系就是2*(down-i)-1,打印完一行后,下一行就会少打两个符号。
- 第三步
for (i = 0; i < down; i++)
{
//打印空格,按照1、2递增
for (j = 0; j
printf(" ");
}
//打印符号
for (j = 0; j < 2*(down-i)-1; j++)
{
printf("%c", c);
}
printf("n");//打印完之后换行
}
最后我们将上面的代码合在一起:
#define LEN 5//定义一个全局变量表示对角线字符长度 #includeint main() { char c; scanf("%c",&c); int up=LEN/2+1;//上半部分行数 int down=LEN/2;//下半部分行数 int i,j; //打印上半部分 for(i=0;i //打印空格,按照2、1、0递减 for(j=0;j printf(" "); } //打印符号 for(j=0;j<2*i+1;j++) { printf("%c",c); } printf("n");//打印完之后换行 } //打印下半部分 for (i = 0; i < down; i++) { //打印空格,按照1、2递增 for (j = 0; j <+1;j++) { printf(" "); } //打印符号 for (j = 0; j < 2*(down-i)-1; j++) { printf("%c", c); } printf("n");//打印完之后换行 } return 0; }
现在我们将LEN定义改为13,在Lightly里编译运行一下,戳我了解该编译器
程序执行结果如下:
BC9 字符转ASCII码
BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,输入一个字符,输出该字符相应的ASCII码。
输入:一行,一个字符。
输出:一行,输出输入字符对应的ASCII码。
#includeint main() { char c; scanf("%c",&c); printf("%d",c); return 0; }
根据输入输出描述,我们使用char定义一个字符型变量c用来接收输入,并以%d的形式打印即可输出对应的ASCII码值!戳我了解ASCII码表,不包含扩展。
程序执行结果如下:
BC10 实现四舍五入输出
将浮点数转换为整数类型,要求四舍五入。
输入:随机输入的浮点数
输出:四舍五入之后的整数
1、直接输出
C语言中浮点数会自动四舍五入,那我们接收输入以后以%0.f输出就可以了,即保留0位小数,上代码:
#includeint main() { float n; scanf("%f",&n); printf("%.0f",n); }
这里我们用while循环让程序不断的接收输入,测试一下。
分别输入:-2.5、-1.5、-0.5、0.3、1.5、2.5、3.5
我们发现这组输入中有几个数没有四舍五入,因此这种方法并不可靠,如果想要输出四舍五入后的整数,必须另行处理。
2、±0.5法
这个方法的依据就是在C语言中,数据类型int会自动舍去一个数的小数部分,向下取整。反映在坐标轴上就是向原点方向靠近。如float f=8.8;int i=f;printf("%d",i);,将f的值换成8.1,输出还是8。
题目要求是四舍五入输出整数,那我们只需要考虑对第一位小数上进行特殊处理即可,因为是向下取整,我们要分正负讨论:
➕如果是正数,+0.5后向下取整,比如3.3+0.5=3.8,向下取整后是3,6.6+0.5=7.1,向下取整后是7;
➖如果是负数,-0.5后向下取整,比如-1.1-0.5=-1.6,向下取整后是-1,-8.8-0.5=9.3,向下取整后是-9;
✅满足四舍五入
#includeint main() { float f; scanf("%f",&f); if(f>=0) { int i=f+0.5; printf("%dn",i); } else { int i=f-0.5; printf("%dn",i); } return 0; }
程序执行结果这里就不再展示,感兴趣的小伙伴可以自行尝试。
3、最笨的办法
因为只保留整数位,可以先*10再%10取出第一位小数,比较它和5的大小再进行四舍五入。
如果保留一位小数,可以*100再%10取出第二位小数与5进行比较,以此类推……
#includeint main() { float f; scanf("%f",&f); int x=f; int y=((int)(f*10))%10;//因为取模的操作数必须是整数,所以强制转换一下 //判断正数进位 if(f>=0&&y>=5) { printf("%d",x+1); } //判断负数进位 else if(f<0&&y<=-5) { printf("%d",x-1); } //其余情况舍去 else { printf("%d",x); } return 0; }
程序执行结果这里就不再展示,感兴趣的小伙伴可以自行尝试。
BC11 成绩输入输出
输入3科成绩,然后把三科成绩输出,成绩为整数形式。数据范围: 0 ≤ n ≤ 100 0≤n≤100 0≤n≤100
输入:一行,3科成绩,用空格分隔,范围(0~100)。
输出:一行,把3科成绩显示出来,输出格式详见输出样例。
比较简单,上代码:
#includeint main() { int score1=0,score2=0,score3=0; scanf("%d %d %d",&score1,&score2,&score3); printf("score1=%d,score2=%d,score3=%d",score1,score2,score3); return 0; }
我们定义三个整形变量分别接收3科成绩,接收时用空格分隔即可。
程序执行结果如下:
BC12 学生基本信息输入输出
依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩(注:输出成绩时需进行四舍五入且保留2位小数)。
数据范围:学号满足 0 ≤ n ≤ 20000000 0≤n≤20000000 0≤n≤20000000,各科成绩使用百分制,且不可能出现负数
输入:学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。
输出:学号,3科成绩,输出格式详见输出样例。
也很简单,上代码:
#includeint main() { int id=0; float c=0.0; float math=0.0; float english=0.0; scanf("%d;%f,%f,%f",&id,&c,&math,&english); printf("The each subject score of No. %d is %.2f, %.2f, %.2f.",id,c,math,english); return 0; }
根据输入输出描述,按接收需求定义变量即可。
程序执行结果如下:
BC13 出生日期输入输出
输入一个人的出生日期(包括年月日),将该生日中的年、月、日分别输出。
数据范围:年份满足 1990 ≤ y ≤ 2015 1990≤y≤2015 1990≤y≤2015,月份满足 1 ≤ m ≤ 12 1≤m≤12 1≤m≤12,日满足 1 ≤ d ≤ 30 1≤d≤30 1≤d≤30
输入:输入只有一行,出生日期,包括年月日,年月日之间的数字没有分隔符。
输出:三行,第一行为出生年份,第二行为出生月份,第三行为出生日期。输出时如果月份或天数为1位数,需要在1位数前面补0。
备注:
- 通过scanf函数的 %m格式控制 可以指定输入域宽,输入数据域宽(列数),按此宽度截取所需数据;
- 通过printf函数的 %0格式控制符 ,输出数值时指定左面不使用的空位置自动填0。
#includeint main() { int year,month,date; scanf("%4d%2d%2d",&year,&month,&date); printf("year=%dn",year); printf("month=%02dn",month); printf("date=%02dn",date); return 0; }
程序执行结果如下:
BC14 按照格式输入并交换输出
输入两个整数,范围-231~231-1,交换两个数并输出。
输入:输入只有一行,按照格式输入两个整数,范围,中间用“,”分隔。
输出:把两个整数按格式输出,中间用“,”分隔。
#includeint main() { int a,b,tmp; scanf("a=%d,b=%d",&a,&b); tmp=a; a=b; b=tmp; printf("a=%d,b=%d",a,b); }
我们多定义一个变量用来交换接收的两个值再输出即可。
程序执行结果如下:
BC15 大小写转换
实现字母的大小写转换。多组输入输出。
输入:多组输入,每一行输入大写字母。
输出:针对每组输入输出对应的小写字母。
根据输入输出描述,我们可以用函数getchar()从标准输入(键盘)中获取一个字符,戳我了解该函数详情
为了满足多组输入的情况,可以使用while循环,不断接收,根据ASCII码表,大写字母的码值比其对应的小写字母码值小32,因此将大写字母转换为小写字母可以在原有输入的基础上+32再输出即可。
int c;
while(1)
{
c=getchar();
printf("%cn",c+32);
}
但是上面的代码停不下来,我们需要添加限制条件,当接收到EOF(end of file)文件结束标志时停止。
int c;
while((c=getchar())!=EOF)
{
printf("%cn",c+32);
}
该代码执行结果如下:
我们发现在输出对应的小写字母之后,又多了一个星号*。因此我们需要想办法将星号消除,在这之前先了解一下getchar()函数的执行过程。
我们在原有代码的基础上,多给上一个getchar(),将n提前拿走,再接收键盘的输入即可。
#includeint main() { int c = 0; while ((c = getchar()) != EOF) { printf("%cn", c+32); getchar();//读取n } return 0; }
程序执行结果如下:



