于老师经常告诉我们“学习编程最好的办法就是上机实践,因为你要对计算机下指令,想让计算机帮你
干活,就得多和计算机‘交流’,实践才能出真知。”
输入描述:
无
输出描述:
Practice makes perfect!
参考代码:
//包含(引入)头文件
#include
//写主函数
//main函数是程序的入口 —— 代码是从main函数的第一行开始执行的
//一个工程中,有且仅有一个main函数
int main()
{
printf("Practice makes perfect!");
//printf函数是C语言标准函数库提供的一个格式化输出函数,引用的头文件是"stdio.h"
return 0;
}
答案解析:
本题是一个没有输入要求的题目,只考察输入,所以只需要准确无误的输出结果就行了。
题目描述
每个人都想成为大V (VIP:Very Important Person),但要一点一点积累才行,先从小v做起。要求输出
由小写字母v组成的大V。
输入描述:
无
输出描述:
v v
v v
v
备注:
换行使用转义字符‘\n’
参考代码:
#include
//代码1
//'\n'是一个转义字符,其意义是“回车换行”
int main()
{
printf("v v\n");
printf(" v v\n");
printf(" v\n");
return 0;
}
//代码2
#include
int main()
{
//一行输出的效果
printf("v v\n v v\n v\n");
return 0;
}
答案解析:
这个题也是没有输入要求的题目,所以相对比较简单。
题目中只要能够找到输出的规律和掌握 \n 的使用就没问题。
题目描述
确定不同整型数据类型在内存中占多大(字节),输出不同整型数据类型在内存中占多大(字节)。
输入描述:
无
输出描述:
不同整型数据类型在内存中占多大(字节),具体格式详见输出样例,输出样例中的 ? 为不同整型数据类型在
内存中占的字节数。输出样例如下:
The size of short is ? bytes.
The size of int is ? bytes.
The size of long is ? bytes.
The size of long long is ? bytes.
参考代码:
#include
int main()
{
printf("The size of short is %d bytes.\n", sizeof(short));//2
printf("The size of int is %d bytes.\n", sizeof(int));//4
printf("The size of long is %d bytes.\n", sizeof(long));//4
printf("The size of long long is %d bytes.\n", sizeof(long long));//8
//C语言标准规定:sizeof(long long)>=sizeof(long)>=sizeof(int)
//在有的编译器里sizeof(long long)=sizeof(long)=8
return 0;
}
答案解析:
这类入门的题目基本都是没有输入操作的。
本题的关键是要掌握C语言的 sizeof
这个操作符。
sizeof
是C语言的一种单目操作符,如C语言的其他操作符++、–等,并不是函数。它用来计算不同变量或者类型所占内存空间的大小,单位是字节。
题目描述
我们处理的整数通常用十进制表示,在计算机内存中是以二进制补码形式存储,但通常二进制表示的整数比较长,为了便于在程序设计过程中理解和处理数据,通常采用八进制和十六进制,缩短了二进制补码表示的整数,但保持了二进制数的表达特点。请输出十进制整数1234对应的八进制和十六进制。
输入描述:
无
输出描述:
十进制整数1234对应的八进制和十六进制(字母大写),用空格分开,并且要求,在八进制前显示前导0,在
十六进制数前显示前导0X。
备注:
printf可以使用使用格式控制串“%o”、“%X”分别输出八进制整数和十六进制整数,并使用修饰符“#”控制前
导显示
参考代码:
#include
int main()
{
//printf("0%o 0X%X\n", 1234, 1234);
printf("%#o %#X\n", 1234, 1234);
//X大写,输出的十六进制字母就大写;x小写,输出的十六进制字母就小写
return 0;
}
答案解析:
这里需要我们掌握对个各种数据的格式控制
比如:
% c - 字符
% hd - 短整形
% d - 整形
% s - 字符串
% f - 单精度浮点数
% lf - 双精度浮点数
% p - 地址格式
...
格式参考:https://zh.cppreference.com/w/c/io/fscanf
注意:注意还是严格按照题目要求的格式输出,才能保证正确性
题目描述
将一个四位数,反向输出。
输入描述:
一行,输入一个整数n(1000 <= n <= 9999)。
输出描述:
针对每组输入,反向输出对应四位数。
示例1
输入
1234
输出
4321
参考代码:
#include
int main()
{
int n = 0;
//输入数据
scanf("%d", &n);
//获取每一位
while (n)
{
printf("%d", n % 10);
n /= 10;
}
//1234 % 10 = 4;
//1234 / 10 = 123;
//
//123 % 10 = 3;
//123 / 10 = 12;
//
//12 % 10 = 2;
//12 / 10 = 1;
//
//1 % 10 = 1;
//1 / 10 = 0;
return 0;
}
答案解析:
这里得掌握操作符 %
和 /
的基本使用和特点,其次是循环的使用。
题目描述
实现字母的大小写转换。多组输入输出。
输入描述:
多组输入,每一行输入大写字母。
输出描述:
针对每组输入输出对应的小写字母。
示例1
输入
A
B
输出
a
b
备注:
多组输入过程中要注意“回车”也是字母,所以要“吸收”(getchar())掉该字母。
参考代码:
//代码1-这个代码对吗?(不对,输入字母并回车后,会多转换一个\n)
#include
//getchar()函数的功能是一个一个地读取输入的字符,它的返回值是输入字符的ASCII码值
int main()
{
int ch = 0;
//循环数据输入
while ((ch = getchar()) != EOF)
{
printf("%c\n", (ch + 32));
}
return 0;
}
//代码2-正确的代码实现
#include
int main()
{
int ch = 0;
//循环数据输入
while ((ch = getchar()) != EOF)
{
printf("%c\n", (ch + 32));
getchar();//处理多余的\n字符
}
return 0;
}
注:
EOF是end of file的缩写,表示“文字流”(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。该宏定义在stdio.h中。
EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。#define EOF (-1)
除了表示文件结尾,EOF还可以表示标准输入的结尾。但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。
在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)。
答案解析:
getchar
清理缓冲区的问题,这里得理解输入缓冲区
。例如,我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。
缓冲区就是一块内存区, 它用在输入输出设备和CPU之间,用来缓存数据 。它 使得低速的输入输出设备和高速的CPU能够协调工作 ,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。
全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。
行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行 时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。
不带缓冲
也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
如果我们没有自己设置缓冲区的话,系统会默认为标准输入输出设置一个缓冲区,这个缓冲区的大小通常是 512个字节 的大小。
缓冲区大小由 stdio.h 头文件中的宏 BUFSIZ 定义,如果希望查看它的大小,包含头文件,直接输出它的值即可:printf(“%d”, BUFSIZ);
缓冲区的大小是可以改变的,也可以将文件关联到自定义的缓冲区,详情可以查看 setvbuf()和 setbuf() 函数。
下列情况会引发缓冲区的刷新:
缓冲区满时
行缓冲区遇到回车时
关闭文件
使用特定函数刷新缓冲区
getchar()函数,其原型为: int getchar(void);
当程序调用getchar()函数时,程序就等着用户按键, 用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中) 。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符 。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键 。打个比方,键盘缓冲区就像是一条水管连着你的程序,程序调用getchar()函数用户输入字符就相当于往水管里注水,这个水注多少取决于你输入多少,当你按回车停止注水时,getchar()函数才会开始从键盘缓冲区,也就是我们的水管里取水。每次只会读一个字符也就是每次取一定量的水,当你在这之后继续调用getchar()函数时,会接着在水管里取上次没用完的水,因为你的水管没清空(缓冲区的刷新),那这个阶段就不用你再输入了,因为一调用getchar()函数就有水可取嘛,直到水管里没水了,你还调用getchar()函数,那这个时候你就得注水了也就是程序会等你按键。
通俗一点说,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。
getchar()函数的执行采用的是行缓冲。第一次调用getchar()函数,会让程序使用者(用户)输入一行字符并直至按下回车键函数才返回。此时用户输入的字符和回车符都存放在行缓冲区。再次调用getchar()函数,会逐步输出行缓冲区的内容。