第二次集训(P16—P41)
C语言编译预备知识
第二节课的十个问题:
1. CPU 内存条 硬盘 显卡 主板 显示器 之间的关系
操作系统提供操作,把硬盘上的数据调到内存条上。
cpu不能直接处理硬盘里的数据,而是处理内存条上的数据。
如果是图像通过显卡最终在显示器中输出,如果是声音则用声卡进行处理。
主板提供了插槽可以将CPU 内存条 硬盘 显卡 插入(中间传输,组织链接)。
2.HelloWorld程序是如何运行起来的
编译和链接,生成后缀为exe的可执行文件。
软件请求操作系统执行,操作系统控制CPU执行exe文件。(程序不能直接控制硬件)CPU将结果返回软件,在显示器上看到结果。
3.什么是数据类型
基本数据类型:
| 数据类型 | 英文 | 字节数 | 输出控制符 |
|---|---|---|---|
| 整形 | int | 4字节 | %d,%x(或者%X或者%#X),%o |
| 短整型 | short (int) | 2字节 | %ld,%x(或者%X或者%#X),%o |
| 长整型 | long (int) | 8字节 | %c |
| 单精度浮点数 | float | 4字节 | %f |
| 双精度浮点数 | double | 8字节 | %lf |
| 字符 | char | 1字节 | %c |
复合数据类型:
结构体 枚举 共用体
4.什么是变量
变量的本质就是内存中的一段存储空间。
在内存条中找到一个空闲单元并与变量产生联系,将数据赋值给变量既将数据存储在这个空闲单元中。空闲单元中若没被赋值将会是 0 1代码的组合。而如果空闲单元没被初始化,则会有上一次的使用残留(垃圾值),而软件将会自动将垃圾值转化为一个填充数字(提醒未将变量初始化)。
5.cpu 内存条 vc 操作系统 之间的关系
6.变量为什么必须初始化
所谓初始化就是赋值的意思
7.如何定义变量
数据类型 变量名 =要赋的值;
等价于
数据类型 变量名;
变量名=要赋的值;
8.什么是进制
十进制中的5、八进制中05、十六进制中0x5或0X5
printf的用法:%d表示十进制输出
%x或%X表示十六进制输出
%o表示八进制输出
-
进制就是逢几进一
-
在汇编中:在数字后面
- 加字母B表示二进制数
- 加字母O表示八进制数
- 加字母D表示十进制数
- 加字母H表示十六进制数
编译中的注释: / / (多行注释) // (单行注释)
9.常量在C语言中是如何表示的
-
整数
- 十进制:传统写法
- 十六进制:数字前面加0x或0X
- 八进制:数字前面加0(数字0)
-
浮点数(在编程中实数默认为double类型)
-
传统写法:
float x=3.2; -
科学计数法:
float x =3.2e3; *//x的值3200* float x =123.45e-2; *//x的值1.2345*
-
- 字符
单个字符用单引号括起来
字符串用双引号括起来(“a”也是正确的因为这表示了‘a'和’\0')
10.常量以什么样的二进制代码存储在计算机中
- 整数是以补码的形式转化为二进制值代码存储在计算机中的
- 实数是以IEEE754标准转化为二进制值代码存储在计算机中的
- 字符的本质实际上也是与整数的存储方式相同
11.代码规范化
<增强代码可读性、降低代码的出错率>
成对敲,缩进,换行(功能相对独立,换行)
程序分为三部分: 1.定义变量
2.对变量进行操作
3.输出值
12.什么是字节
字节就是存储数据的单位,并且是硬件所能访问的最小单位
1字节 = 8位 1K = 1024字节
1M =1024K 1G = 1024M
13.不同类型数据之间相互赋值(转换)的问题 (暂不考虑)
14.什么是ASCII
ASCII不是一个值,而是一种规定。
ACSII规定了不同字符使用哪个整数值去表示
它规定了:
'A' -- 65
'B' -- 66
'a' -- 97
'b' -- 98
'0' -- 48
15.字符的存储
16.char的使用:
例如:
char ch = ’a'; char ch = 'b' ; char ch = 'A' ;
错误类型:
char ch = "a" ; char ch = "Aa" ;
在同一程序中不能重复定义一个变量
如:
char ch = 'A';
char ch = 'B'; //错误,重复定义
但可以:
char ch = 'A';
ch = 'B';
基本的输入和输出函数的用法
printf ()
四种用法:
- printf ("字符串\n"); *// \n表示换行*
- printf ("输出控制符",输出参数); *//输出控制符指定输出参数(二进制代码)以什么形式输出*
- printf ("输出控制符1 输出控制符2. ...",输出参数1,输出参数2); *//输出控制符和输出参数的个数必须一一对应*
- printf ("输出控制符 非输出控制符",输出参数);
输出控制符包含如下:
%d %ld %c %f %lf **%x(或者%X或者%#X)** %o %s(字符串)
为什么需要输出控制符?
- 01组成的代码 可以表示数值 也可以表示指令
- 如果,01组成的代码 表示的是数据的话,那么 同样的01代码组合,以不同的输出格式输出,就会有不同的输出结果。
scanf()[通过键盘将数据输入到变量中]
两种用法:
- 用法一: scanf("输入控制符", 输入参数);
功能:将从键盘输入的字符,转化为 输出控制符所规定格 式的数据,然后,存入 已输入参数的值为地址的变量中。
- 用法二: scanf("非输入控制符 输入控制符", 输入参数);
功能:将从键盘输入的字符,转化为 输出控制符所规定格式的数据,然后,存入 已输入参数的值为地址的变量中。非输入控制符必须原样输入。
课后习题
4.指出下列常量的类型和含义(如果有的话):
a.'\b' ----- 退格符,相当于按了Backspace
b.1066 --- 整型,十进制数1066
c.99.44 ---浮点型,表示99.44
d.0XAA ---整型,十六进制数,表示十进制中的170
e.2.0e30 ---科学计数法,表示2.0*10^30
6.写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明:
| 常量 | 类型 | 转换说明(%转换字符) |
|---|---|---|
| 12 | 整型 | %d |
| 0X3 | 整型 | %#X |
| 'C' | 字符 | %c |
| 2.34E07 | 浮点型 | %e |
| '\040' | 字符 | %c |
| 7.0 | 浮点型 | %f |
8.假设程序的开头有下列声明:
int imate = 2;
long shot = 53456;
char grade = 'A';
float log = 2.71828;
把下面printf()语句中的转换字符补充完整:
printf("The odds against the %_d_ were %_ld_ to 1.\n", imate, shot);
printf("A score of %_c_ is not an %_f_ grade.\n", log, grade);
编程题
1.通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。
经过多次尝试得出int中最大数为0X7FFFFFFF,溢出后难以描述。
通过查找得知float范围:-3.4E+38 ~ 3.4E+38
测试发现浮点数上 下溢输出结果都不变
但如果上下溢出过多将输出inf与-inf
2.编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。
测试结果:
测试结果:
1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。
这个程序还是有点小问题无法解决(比如名字过长)
代码如下:
#include <stdio.h>
int main(void)
{
char ming[20],xing[20];
printf("请输入您的姓氏\n",ming);
scanf("%s",&ming);
printf("请输入您的名\n",xing);
scanf("%s",&xing);
printf("%s%s\n",ming,xing);
return 0;
}
4.编写一个程序,提示用户输入身高(单位:英寸)和姓名,然后以下面的格式显示用户刚输入的信息: Dabney, you are 6.208 feet tall 使用float类型,并用/作为除号。 如果你愿意,可以要求用户以厘米为 单位输入身高,并以米为单位显示出来。
代码如下:
#include <stdio.h>
int main(void)
{
char name[20];
float height;
printf("请输入你的姓名\n");
scanf("%s",&name);
printf("请输入你的身高(单位:厘米)\n");
scanf("%f",&height);
printf("%s,你高%.2f米。",name,height/100);
return 0;
}
7.编写一个程序,将一个double类型的变量设置为1.0/3.0,一个float类型的变量设置为1.0/3.0。分别显示两次计算的结果各3次:一次显示小数点后面6位数字;一次显示小数点后面12位数字;一次显示小数点后面16位数 字。程序中要包含float.h头文件,并显示FLT_DIG和DBL_DIG的值。1.0/3.0 的值与这些值一致吗?
输出结果:
代码如下:
#include <stdio.h>
#include <float.h>
int main()
{
float i = 1.0/3.0;
double j = 1.0/3.0;
printf("以下为float形式输出:\n");
printf("%.6f\n",i);
printf("%.12f\n",i);
printf("%.16f\n",i);
printf("以下为double形式输出:\n");
printf("%.6lf\n",j);
printf("%.12lf\n",j);
printf("%.16lf\n",j);
printf("以下为FLT_DIG和DBL_DIG的值:\n");
printf("%d\n",FLT_DIG);
printf("%d",DBL_DIG);
return 0;
}
Ubuntu pastebin
代码链接:paste.ubuntu.com/p/rv8XT5kyP…
(这个代码可以打印一架很小很小的飞机。)
图片来源视频:www.bilibili.com/video/BV1os… (如有侵权请在文章下留言。)