C语言集训-徐赟-第二次作业

337 阅读12分钟

C编程预备计算机知识

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

通过打开一部电影文件说明,先双击电影,双击为操作系统中的一个操作,双击之后,操作系统会将硬盘上的电影拷贝到内存条中。介于cpu无法直接处理硬盘上的数据,所以需要将硬盘上的数据迁移到内存条上,最后通过cpu处理内存条中的数据。图像数据经显卡变成图像,声音数据经声卡变成声音。

2.HelloWorld是如何运行的

输入HelloWord程序代码后

# include<stdio.h>
int main(void)
{
    printf("迎来到C世界!\n");
    
    return 0;
}

vscode会通过编译和链接生成一个后缀为.exe的可执行文件,vscode软件无法直接执行该文件,但可请求操作系统来控制硬件执行,操作系统通过cpu执行该文件,最后在显示器上输出结果。\

3.什么是数据类型

分为两类:
1.基本类型数据
一、整数:
整型 -- int(一般占四个字节)
短整型 -- shoort int(一般占两个字节)
长整型 -- long int(一般占八个字节)
二、浮点数【实数】
单精度浮点数 -- float (存放四个字节)
双精度浮点数 -- double(存放八个字节)
ps:计算机的硬件大小是有限制的,我们需要在有限空间内存储较多的数据,因而需要考虑存储的大小问题。 三、字符
char(占一个字节)\
单个字符
字符串——一系列字符的组合
整型示例\

# include <stdio.h>

int main(void)
{
    int i = 10; //表示i变量是整型变量,所谓整型变量就是指i只能存放整数,不能存放实数
    
    printf("%d\n",i);
    
    return 0;
}

image.png 可根据字节长度使用不同的整型,且可更改i后的等于数值,即使输入的不是整数,程序也可运行,且输出的结果为整数。这便体现了C语言和Java的安全性不同,相比之下,JAVA安全性更高。
字符示例\

# include <stdio.h>

int main(void)
{
//    int i = 10; //表示i变量是整型变量,所谓整型变量就是指i只能存放整数,不能存放实数
    
//    printf("%d\n",i);

      char i = 'm';
      printf("%c\n",i);
      
    return 0;
}

image.png

2.复合类型数据
结构体
枚举
共用体

4.什么是变量

变量的本质是内存中一段存储空间
演示代码:

# include <stdio.h>

int main(void)
{
    int i;
    
    i = 3;  //3最终存放在内春中,程序终止之后3所占的空间被释放掉
    printf("i = %d\n",i);
    
    return 0;
}

5.cpu 内存条 vc++6.0 操作系统 之间的关系

vc++对操作系统发出请求,操作系统将内存条中空闲的空间分配给vc++,进而将所分配的内存空间与字母i产生关联,最终cpu通过读取内存条中的数据将程序运行起来。

6.变量为什么必须初始化

所谓变量的初始化就是赋值的意思\

代码解释:

# include <stdio.h>

int main(void)
{
    int i;
    
    printf("i = %d\n",i);
    
    return i;
}

image.png 得到一个数,且这个数在多次运行程序不会改变。\

文字解释:

软件运行与内存关系(垃圾数据)
内存是在操作系统的统一管理下使用的!
1.软件在运行前需要向操作系统申请存储空间,在内存空
闲空间足够时,操作系统将分配一段内存空间并将外存
中软件拷贝一份存入该内存空间中,并启动该软件的运行!

2.件运行期间,该软件所占内存空间不再分配给其他软件

3.当软件运行完牛后,操作系统将回收该内存空间〈注意:操作系统并不清空该内存空间中遗留下来的数据),以便再次分配给其他软件使用
综上所述,
一个软件所分配到的空间中极可能存在着以前其他软件使用过后的残留数据,这些数据被称之为垃圾数据。所以通常情況下我们为一个变量,为一个数组,分酡好存储空间之后都要对该内存空间初始化.

7.如何定义变量

数据类型 变量名 = 要赋的值
等价于
数据类型 变量名;
变量名 = 要赋的值;
举例:
int i = 3; 等价于 int i; i = 3;
int i , j; 等价于 int i; int j;
int i ,j=3 等价于 int i; int j; i = 3; int i = 3, j = 5; 等价于int i,int j,i = 3,j = 5; int i,j;i = j = 5,等价于 int i,j; i = 5, j = 5

8.什么是进制

十进制就是逢十进一
二进制就是逢二进一

进制转化\

•什么叫进制
•进制就是逢几进一
•我们说N进制实际就是指逢N进一
-我们计算机只识别二进制
•人类最习惯使用的是十进制
•为了实际需要 我们又建立了八进制和十六进制
•C语言规定八进制前要加0(注意是零不是字母o),十六进制前要加0x或0X,十进制前什么都不加!
在汇编中:在数字后加字母B表示二进制数,加字母O表示八进数,如字母D表示十进制数,加字母h表示十六进制数。
例:
1011B为二进制数1011,也记为 (1011)2
1357Q为八进制数1357,也记为(1357)8
2049D为十进制数2049,也记为(2049) 10
3FB9H为十六进制数3FB9,也记为(3FB9)16\

十进制

  • 十个基数,逢十进一
  • 基数: 0 1 2 3 4 5 6 7 8 9

二进制

  • 二个基数,逢二进一
  • 基数: 0 1
  • 示例:0 1 10 11 100 101 110 111 1000

八进制

  • 8个基数,逢八进一
  • 基数:0 1 2 3 4 5 6 7
  • 8->10 9->11 10->12

十六进制

  • 十六个基数,逢十六进一
  • 基数:0 1 2 3 4 5 6 7 8 9 A B C D E F
  • 16->10 17->11 18->12 19->13

|  十进制(D)|  二进制(B)|  八进制(D)|  十六进制(H)| |----------|---------|----------||----------| |    0||    0||    0||    0| |    1||    1||    1||    1| |    2||    10||    2||    2| |    3||    11||    3||    3| |    4||    100||    4||    4| |    5||    101||    5|    5| |    6||    110||    6||    6| |    7||    111||    7||    7| |    8||    1000||    10||    8| |    9||    1001||    11||    9| |    10||    1010||    12||    A| |    11||    1011||    13||    B| |    12||    1100||    14||    C| |    13||    1101||    15||    D| |    14||    1110||    16||    E| |    15||    1111||    17||    F|

printf("i = %d\n",i); printf的用法
%d表示以十进制输出
%x或%X表示以十六进制输出
%0表示以八进制输出

9.常量在C语言中是如何表示的

整数

十进制:传统的写法
十六进制:前面加0X或0x
八进制:前面加零(0)

浮点数

传统的写法
float x = 3.2;//传统 科学基数法
float x = 3.2e3; //x的值是3200
float x = 123.45e-2 = 1.2345\

字符

单个字符用单引号括起来
'A'表示字符A
'AB'错误
“AB”正确
字符串用双引号括起来
“A”正确,因为“A"代表了'A''\0'的组合

10.常量以什么样的二进制代码存储在计算机中

整数是以补码的形式转化为二进制代码存储在计算机中的
实数是以IEE754标准转化为二进制代码存储在计算机中的
字符的本质实质也是与整数的存储方式相同

11.代码规范化(可参考《高质量C/C++编程》

1.代码的可读性更强容易让别人和自己更清楚的看懂程序]
2.使程序更不容易出错

# include<stdio.h>
int main(void)
{

    return 0
}

代码、括号成对的敲 括号要对齐

12.什么是字节

字节就是存储数据的单位,并且是硬件所能访问的最小单位。
1字节 = 8位
1K = 1024字节
1M = 1024K
1G = 1024M\

13.不同类型数据之间相互赋值的问题(暂不考虑)

int i = 45;
long j = 102345;
i = j; printf("%d %ld\n", i, j);
float x = 6.6;
double y = 8.8;
printf("%f %f\n , x, y");

14.什么是ASCII

ASCII不是一个值,而是一种规定,ASCII规定了不同的字符是使用哪个整数值去表示
它规定了
'A' -- 65
'B' -- 66
'a' -- 97
'b' -- 98
'0' -- 48

image.png 没有出现错误,正常运行

image.png 出现错误,因为"AB是字符串,我们不能把字符串赋给单个字符"

image.png

出现错误,因为所有的字符串都会添加一个结尾字符\0,所以"A"里面包含两个字符,又因为ch只能存放一个字符,出错!

image.png 出错,单引号内只能括单个字符

image.png 出错,ch变量在前面的代码中已经被定义了一次,再将B定义给ch会导致变量名被重复定义

15.字节的存储【字符本质上与整数的存储方式相同】

基本的输和输出函数的用法

一.printf()--将变量的内容输出到显示器上

四种用法

1. printf("字符串\n");

# include <stdio.h>

int main(void)
{
  printf("哈哈\n"); //\n表示换行
  
  return 0;
}

image.png image.png

2.printf("输出控制符",输出参数);

# include <stdio.h>

int main(void)
{
    int i = 10;
    printf("%d\n, i"); //d是十进制

    return 0;
}

3.printf("输出控制符1 输出控制符2.。。",输出参数1, 输出参数2, 。。);

# include <stdio.h>

int main(void)
{
    int i = 3;
    int j = 5;
    printf("%d\n,%d\n", i, j); //正确
    printf("%d\n“, i, j);//错误
    
    return 0;
}

输出控制符和输出参数的个数必须一一对应

4.printf("输出控制符 非输出控制符,输出参数");

# include <stdio.h>

int main(void)
{
    int i = 3;
    int j = 5;
    printf("%d\n,%d\n", i, j); //正确
    printf("%d\n”, i, j); //错误
    printf("i = %d, j = %d\n", i, j); //输出结果为i = 3, j = 5
    
    return 0;
}

image.png

输出控制符包含如下

%d -- int

%ld -- long int

%c -- char

%f -- float

%lf -- double

%x(或者%X或者%#X) -- int 或 long int 或 short int 输出结果为16进制

%o -- 同上

%s -- 字符串

测试%x %X %#X %#x的用法

# include <stdio.h>

int main(void)
{
    int i = 47; //47是十进制
    
    printf("%x\n", i); //输出结果是2f
    printf("%X\n", i); //输出结果是2F
    printf("%#x\n", i); //输出结果是0*2f 
    printf("%#X\n", i); //输出结果是0*2F 推荐使用
    
    return 0;
}

image.png

为什么需要输出控制符合

1.01组成的代码可以表示数据也可以表示指令
2.如果01组成的代码表示的是数据的话,那么同样的01代码组合以不同的输出格式就会有不同的输出结果

二.scanf()【通过键盘将数据输入到变量中】

两种用法

1.scanf("输入控制符",输出参数); 功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中

# include <stdio.h>

int main(void)
{
    int i;
    scanf("%d",&i);  //&i 表示i的地址 &是一个取地址符
    printf("i = %d\n", i);

    return 0;
}

image.png

2.scanf("非输入控制符 输入控制符",输出参数); 功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中,非输入控制符必须原样输入

# include <stdio.h>

int main(void)
{
    int i;
    scanf("m%d",&i);  //m123 正确的输入 123是非法的输入
    printf("i = %d\n", i);

    return 0;
}

一次给多个变量赋值

# include <stdio.h>

int main(void)
{
   int i, j;
   
   scanf("%d %d",&i, &j);
   printf("i = %d, j = %d\n", i, j);
   
   return 0;
}

image.png scanf中的非输出控制符要原样输入!!!!

如何使用scanf编写出高质量代码

1.使用scanf之前最好先使用printf提示用户以什么样的方式来输入\

# include <stdio.h>

int main(void)
{
   int i, j, k;
   
   printf("请输入三个值,中间以空格分隔");
   scanf("%d %d %d", &i, &j, &k);
   printf("i = %d, j = %d, k = %d\n", i, j, k);
   
   return 0;
}

image.png 2.scanf中尽量不要使用非输入控制符,尤其不要用\n

3.应该编写代码对用户的非法输入做适当的处理

image.png

课后作业

1.pastebin分享链接

乌本图·帕斯泰宾 (ubuntu.com)

2.名词翻译

中文英文中文英文
整数integer变量variable
字符character初始化initialise
浮点数float double十进制decimal
结构体structure二进制binary
枚举enumerate十六进制hexadecimal
联合unite打印printing

3.课本习题

4.

a.转义字符
b.整型常量
c. d.十六进制的整型常量272
e.2*10^30

6.

常量类型转换说明(%转换字符)
12int%d
0x3int%#x
'c'char%c
2.34E07float%E
'\040'char%c
7.0float%f

8.

printf("The odds against the %d were %d to 1.\n", imate, shot);
printf("A score of %f is not an %c grade. \n", log, grade);

整数上溢

image.png

浮点数上溢

image.png

浮点数下溢

image.png

1

image.png

4