C语言集训-电气213殷俊峰-第二次作业

254 阅读8分钟

第二次集训(P16—P41)

C语言编译预备知识

第二节课的十个问题:

1. CPU 内存条 硬盘 显卡 主板 显示器 之间的关系

操作系统提供操作,把硬盘上的数据调到内存条上。

cpu不能直接处理硬盘里的数据,而是处理内存条上的数据。

如果是图像通过显卡最终在显示器中输出,如果是声音则用声卡进行处理。

主板提供了插槽可以将CPU 内存条 硬盘 显卡 插入(中间传输,组织链接)。

2.HelloWorld程序是如何运行起来的

编译和链接,生成后缀为exe的可执行文件。

软件请求操作系统执行,操作系统控制CPU执行exe文件。(程序不能直接控制硬件)CPU将结果返回软件,在显示器上看到结果。

3.什么是数据类型
基本数据类型:
数据类型英文字节数输出控制符
整形int4字节%d,%x(或者%X或者%#X),%o
短整型short (int)2字节%ld,%x(或者%X或者%#X),%o
长整型long (int)8字节%c
单精度浮点数float4字节%f
双精度浮点数double8字节%lf
字符char1字节%c
复合数据类型:

结构体 枚举 共用体

4.什么是变量

变量的本质就是内存中的一段存储空间。

在内存条中找到一个空闲单元并与变量产生联系,将数据赋值给变量将数据存储在这个空闲单元中。空闲单元中若没被赋值将会是 0 1代码的组合。而如果空闲单元没被初始化,则会有上一次的使用残留(垃圾值),而软件将会自动将垃圾值转化为一个填充数字(提醒未将变量初始化)。

5.cpu 内存条 vc 操作系统 之间的关系
6.变量为什么必须初始化

屏幕截图 2021-11-20 193058.png

屏幕截图 2021-11-20 193211.png 所谓初始化就是赋值的意思

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(字符串)
为什么需要输出控制符?
  1. 01组成的代码 可以表示数值 也可以表示指令
  2. 如果,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.通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。

屏幕截图 2021-11-21 225041.png

经过多次尝试得出int中最大数为0X7FFFFFFF,溢出后难以描述。

屏幕截图 2021-11-21 225357.png

屏幕截图 2021-11-21 225548.png

通过查找得知float范围:-3.4E+38 ~ 3.4E+38 屏幕截图 2021-11-21 225847.png

屏幕截图 2021-11-21 230019.png

测试发现浮点数上 下溢输出结果都不变

屏幕截图 2021-11-21 230004.png

但如果上下溢出过多将输出inf与-inf

屏幕截图 2021-11-21 230246.png

屏幕截图 2021-11-21 230519.png

屏幕截图 2021-11-21 230255.png

屏幕截图 2021-11-21 230614.png

2.编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。

屏幕截图 2021-11-21 223717.png

测试结果:

屏幕截图 2021-11-21 223659.png

屏幕截图 2021-11-21 170057.png

测试结果: 屏幕截图 2021-11-21 170332.png 1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。

这个程序还是有点小问题无法解决(比如名字过长)

屏幕截图 2021-11-21 231910.png

屏幕截图 2021-11-21 231901.png

代码如下:

#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类型,并用/作为除号。 如果你愿意,可以要求用户以厘米为 单位输入身高,并以米为单位显示出来。

屏幕截图 2021-11-21 233418.png

屏幕截图 2021-11-21 233431.png

代码如下:

#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 的值与这些值一致吗?

屏幕截图 2021-11-21 234232.png

输出结果:

屏幕截图 2021-11-21 234250.png

代码如下:

#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… (如有侵权请在文章下留言。)