C语言刷题——lesson1

1. BC1-实践出真知

于老师经常告诉我们“学习编程最好的办法就是上机实践,因为你要对计算机下指令,想让计算机帮你

干活,就得多和计算机‘交流’,实践才能出真知。”

输入描述:

输出描述:

Practice makes perfect!

参考代码:

//包含(引入)头文件
#include 

//写主函数
//main函数是程序的入口 —— 代码是从main函数的第一行开始执行的
//一个工程中,有且仅有一个main函数
int main()
{
	printf("Practice makes perfect!");
    //printf函数是C语言标准函数库提供的一个格式化输出函数,引用的头文件是"stdio.h"
    
	return 0;
}

答案解析:

本题是一个没有输入要求的题目,只考察输入,所以只需要准确无误的输出结果就行了。

2. BC2-我是大V

题目描述

每个人都想成为大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 的使用就没问题。

3. BC3-有容乃大

题目描述

确定不同整型数据类型在内存中占多大(字节),输出不同整型数据类型在内存中占多大(字节)。

输入描述:

输出描述:

不同整型数据类型在内存中占多大(字节),具体格式详见输出样例,输出样例中的 ? 为不同整型数据类型在
内存中占的字节数。输出样例如下:
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语言的其他操作符++、–等,并不是函数。它用来计算不同变量或者类型所占内存空间的大小,单位是字节

4. BC7-缩短2进制

题目描述

我们处理的整数通常用十进制表示,在计算机内存中是以二进制补码形式存储,但通常二进制表示的整数比较长,为了便于在程序设计过程中理解和处理数据,通常采用八进制和十六进制,缩短了二进制补码表示的整数,但保持了二进制数的表达特点。请输出十进制整数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

注意:注意还是严格按照题目要求的格式输出,才能保证正确性

5. BC19-反向输出4位数

题目描述

将一个四位数,反向输出。

输入描述:

一行,输入一个整数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;
}

答案解析:

这里得掌握操作符 %/的基本使用和特点,其次是循环的使用。

6. BC28-大小写转换

题目描述

实现字母的大小写转换。多组输入输出。

输入描述:

多组输入,每一行输入大写字母。

输出描述:

针对每组输入输出对应的小写字母。

示例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;
}

注:

  1. EOF是end of file的缩写,表示“文字流”(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。该宏定义在stdio.h中。

    • “流”:是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。 它的特性是:有序连续、具有方向性。
  2. EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。#define EOF (-1)

  3. 除了表示文件结尾,EOF还可以表示标准输入的结尾。但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。

  4. 在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)。

答案解析:

  1. 多组数据输入的问题。
  2. getchar清理缓冲区的问题,这里得理解输入缓冲区

7.知识拓展——缓冲区

7.1为什么要引入缓冲区

例如,我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。

缓冲区就是一块内存区, 它用在输入输出设备和CPU之间,用来缓存数据 。它 使得低速的输入输出设备和高速的CPU能够协调工作 ,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

7.2缓冲区的类型

缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。

  1. 全缓冲
    在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

  2. 行缓冲
    在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行 时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。

  3. 不带缓冲
    也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

7.3缓冲区的大小

如果我们没有自己设置缓冲区的话,系统会默认为标准输入输出设置一个缓冲区,这个缓冲区的大小通常是 512个字节 的大小。

缓冲区大小由 stdio.h 头文件中的宏 BUFSIZ 定义,如果希望查看它的大小,包含头文件,直接输出它的值即可:printf(“%d”, BUFSIZ);

缓冲区的大小是可以改变的,也可以将文件关联到自定义的缓冲区,详情可以查看 setvbuf()和 setbuf() 函数。

7.4缓冲区的刷新(清空)

下列情况会引发缓冲区的刷新:

  • 缓冲区满时

  • 行缓冲区遇到回车时

  • 关闭文件

  • 使用特定函数刷新缓冲区

7.5结合缓冲区了解getchar()

getchar()函数,其原型为: int getchar(void);

  • 当程序调用getchar()函数时,程序就等着用户按键, 用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中) 。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符 。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键 。打个比方,键盘缓冲区就像是一条水管连着你的程序,程序调用getchar()函数用户输入字符就相当于往水管里注水,这个水注多少取决于你输入多少,当你按回车停止注水时,getchar()函数才会开始从键盘缓冲区,也就是我们的水管里取水。每次只会读一个字符也就是每次取一定量的水,当你在这之后继续调用getchar()函数时,会接着在水管里取上次没用完的水,因为你的水管没清空(缓冲区的刷新),那这个阶段就不用你再输入了,因为一调用getchar()函数就有水可取嘛,直到水管里没水了,你还调用getchar()函数,那这个时候你就得注水了也就是程序会等你按键。

  • 通俗一点说,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。

  • getchar()函数的执行采用的是行缓冲。第一次调用getchar()函数,会让程序使用者(用户)输入一行字符并直至按下回车键函数才返回。此时用户输入的字符和回车符都存放在行缓冲区。再次调用getchar()函数,会逐步输出行缓冲区的内容。

你可能感兴趣的:(C语言刷题,c语言)