[编程笔记]第二章 C语言预备知识

时间:2023-02-11 20:09:26
  1 /*第二讲 C语言预备专业知识
  2 1.CPU 内存条 硬盘 显卡 主板 显示器之间的关系
  3     CPU不能直接处理硬盘上的数据
  4     文件存储在硬盘,当运行时,操作系统把硬盘上的数据调用到内存条上。
  5     图像以数据的形式通过显卡在显示器上输出
  6     声音以数据的形式发送给声卡输出
  7     这些硬件在主板的插槽上通过主板电路组合在一起
  8 
  9 2.Hello World程序是如何运行起来的
 10     源代码,通过编译(Compile) 链接(Build),生成.exe可执行文件。
 11     软件请求操作系统来执行.exe执行文件
 12     操作系统调用CPU来运行程序
 13 
 14 3.什么是数据类型?
 15     基本类型数据(不可再分割)*/
 16         【整数】 
 17             整型 —— int 4个字节
 18             短整型 —— short int  ——2个字节
 19             长整型 —— long int  ——8个字节
 20         /int i = 10 表示i是整型变量,所谓整型变量即指i只能存放整数
 21         【浮点数(实数)】
 22             单精度浮点数 —— float   —— 4个字节
 23             双精度浮点数 —— double  —— 8个字节 
 24         【字符】
 25             单个字符 —— char
 26             字符串 —— 一系列字符的组合
 27 
 28 /*    复合类型数据
 29         结构体
 30         枚举
 31         共用体
 32 
 33 4.什么是变量?
 34     变量的本质就是内存中的一段存储空间。
 35     int i = 3 ;//
 36     数据3最终是存放在内存中,程序终止之后3所占的空间被释放。
 37     定义变量时,程序请求操作系统,
 38     在内存中找到一个空闲的单元,分配给变量i并存储它的内容。
 39     
 40 5.CPU 内存条 VC++6.0 和 操作系统之间的关系
 41     VC++6.0软件请求操作系统,在内存条中分配一段空闲的空间,
 42     将这段空闲的空间与变量i产生关联,以后使用变量i即是在使用
 43     变量i对应的存储空间,最终在CPU中运行程序。
 44 
 45 6.变量为什么必须要进行初始化? **
 46     所谓初始化就是给变量赋初值。
 47     如果不进行初始化,系统会将内存释放前的填充值输出。
 48     
 49 7.如何去定义变量? ** 
 50     数据类型 变量名 = 要赋的值 ;
 51     等价于=> 数据类型 变量名
 52             变量名 = 要赋的值
 53 */
 54     举例:
 55         int i = 3 => int i; i = 3 ;
 56         int i,j => int i;int j ;
 57         int i,j = 3 => int i,int j;i = 3;
 58         int i = 3;int j = 5; => int i;int j;i = 3;j = 5;
 59         int i,j;i = j = 5; => int i,j;i = 5;j = 5 ;
 60 /*
 61 8.什么是进制? **
 62     十进制就是逢十进一,计算机之识别二进制
 63     十进制:基数 0 1 2 3 4 5 6 7 8 9
 64     二进制:基数 0 1
 65 
 66     printf用法
 67         %d 表示以十进制输出
 68         %x或%X 表示以十六进制输出
 69         %o 表示以八进制输出
 70 
 71     进制转换:
 72         把r进制 转成 十进制
 73         把十进制 转成 r进制
 74         不同进制所代表的数值之间的关系
 75             十进制的 3981 转化为十六进制 是 F8D
 76             十进制的3981和十六进制的F8D所代表的本质上都是同一个数字
 77     
 78     二进制全部为零的的含义 —— 00000000 的含义
 79     1. 数值为零
 80     2. 字符串结束标记符 '0'
 81     3. 空指针NULL
 82         NULL 本质上也是零,但这个零不代表数字零
 83         而表示的是内存单元的编号零
 84     我们规定:以零为编号的存储单元的内容 不可读,不可写
 85 */
 86 9.常量在C语言中是如何表示的?
 87     整数:
 88         十进制:    传统写法
 89         十六进制:  前面加0x或0X
 90         八进制:    前面加0()  注意是数字零,不是字母o
 91     浮点数:
 92         传统写法:  float x = 3.2 ;
 93         科学计数法:float x = 3.2e3 ;//x的值是3200
 94                    float x = 1.23.45e-2 ; //x的值是1.2345
 95         #include<stdio.h>
 96         int main(void){
 97             float x = 123.45e-2F ;
 98             printf("%f\n",x)
 99             return 0 ;
100         }
101     字符:
102         单个字符用单引号''括起来 ;'A'表示字符A  'AB'错误
103         字符串用双引号""括起来 ; "A"正确
104         因为"A"代表'A''\0'的组合
105 
106 10.常量是以什么样的二进制代码存储在计算机中?
107     编码
108     int i = 86 ; 
109     整数是以补码的形式转化为二进制代码存储在计算机中的 ;
110     实数是以IEEE754标准转化为二进制代码存储在计算机中的 ;
111     字符的本质实际上也是与整数的存储方式相同 ;
112     字符'A'先转换为对应的ASCII码 -> 再转换为对应的补码形式 ;
113 
114 11.代码规范化
115     优点:
116         1.使得代码的可读性更强,让自己和别人更清楚的看懂程序
117         2.使得代码的健壮性更高,这样程序更不容易出错
118 
119         参考书籍:《高质量C/C++编程》
120         #include<stdio.h>
121         int main(void)
122         {   
123             if (xxxxx(xxxx(xx)))
124             {
125                 while (xxxx(xxx))
126                 {
127                     for (xxxx(xxx))
128                 }
129             }
130             if (xxxxx(xx)xx)
131             {
132                 printf("Say Hello") ;
133             }
134             return 0 ;
135         }
136         1.{}()成对出现
137         2.缩进 区分内部外部的关系
138         3.换行 区分上行下行的功能
139 
140 12.什么是字节?
141     字节就是存储数据的单位,并且是硬件所能访问的最小单位。
142     1字节 (B)= 8 位 ;   1KB = 1024B ;
143     1M = 1024KB ;   1G = 1024MB ;
144     //1.5GB = 1.5*2^30*8b
145 
146 13.不同类型数据之间相互赋值的问题 **
147     //在理解补码的基础上学习,暂不考虑
148     int i = 45 ;    //-45的二进制码为 
149     long j = 102345 ;
150     i = j ;
151     printf("%d %d\n",i,j) ;
152     float x = 6.6 ;
153     double y = 8.8 ;
154     printf("%f %f\n",x,y) ;
155 
156     int i = ;
157     
158 14.什么是ASCII?
159     ASCII码不是一个值,而是一种规定。
160     ASCII规定了不同的字符使用那个整数值去表示。
161     它规定了:
162             'A' = 65 ;  'B' = 66 ;
163             'a' = 97 ;  'b' = 98 ;
164             '0' = 48 ; 
165 
166     #include<stdil.h>
167     int main(void)
168     {
169         char ch = 'A' ;//OK
170         char ch = 'AB' ;//error是因为不能把字符串赋值给单个字符
171         char ch = "A" ;//error
172         char ch = 'B' ;//error 变量不能二次定义
173         ch = 'C' ;
174         printf("%c\n",ch) ;
175         return 0 ;
176     }
177 /*
178 15.字符的存储[字符本质上与整数的存储方式相同]
179 
180 16.对初学编程者的一些建议
181     对于编程基础有了一定了解,再深入或入门其他语言就会相对简单。
182     一定要基础阶段打好基础,学完流程控制之后就可以做一些小项目了。
183 */
184 17.基本的输入输出函数用法
185     printf() —— 将变量的内容输出到显示器上
186         四种用法:
187         1.printf("字符串\n") ;
188         2.printf("输出控制符",输出参数) ;
189         3.printf("输出控制符1 输出控制符2",输出参数1,输出参数2) ;
190             输出控制符和输出参数的个数必须一一对应。
191         4.printf("输出控制符 非输出控制符",输出参数) ;
192             输出控制符包含如下:
193                 %d   ——     int
194                 %ld   ——     long int
195                 %c   ——      char
196                 %f   ——      float
197                 %lf   ——     double
198                  %x   ——     int
199                  %o   ——     同上
200                  %s   ——     字符串
201             非输出控制符以它本身,原样输出。
202 /*
203         为什么需要输出控制符?
204             1. 01组成的代码可以表示数据也可以表示指令。
205             2. 如果01组成的代码是数据的话,同样地,
206                01代码组合以不同的输出格式输出就会有不同输出结果。
207                因此需要有不同的输出控制符。
208 */
209         printf中%x的相关用法:          
210             #include<stdio.h>
211             int main(void)
212             {
213                 //printf("Hello!\n") ;
214                 int i = 10 ;
215                 printf("%d\n",i) ;  //d是十进制
216                 printf("%x\n",x) ;  //输出结果是:2f
217                 printf("%X\n",x) ;  //输出结果是: 2F
218                 printf("%#X\n",x) ; //输出结果是:0X2F 推荐使用
219                 printf("%#x\n",x) ; //输出结果是:0X2F
220                 return 0 ;
221             }
222 
223     scanf() —— 通过键盘将数据输入到变量中
224         两种用法:
225             用法1: scanf("输入控制符",输入参数) ;
226             功能:  将从键盘输入的字符转化为输入控制符所规定格式
227                     的数据,然后存入以输入参数的值为地址的变量。
228 
229             #include<stdio.h>
230             int main(void)
231             {
232                 int i ;
233                 scanf("%d",&i) ; //&i表示取地址符,表示i的地址
234                 printf("i = %d\n",i) ;
235             }
236 
237             用法2: scanf("非输入控制符 输入控制符",输入参数) ;
238             功能:将从键盘输入的字符转化为输入控制符所规定格式
239                  的数据,然后存入以输入参数的值为地址的变量中。
240                  非输入控制符必须原样输入。
241             #include<stdio.h>
242             int main(void)
243             {
244                 int i ;
245                 scanf("m%d",&i) ; //m123为正确输入 123非法输入
246                 printf("i = %d\n",i) ;
247 
248                 return 0 ;
249             }
250             用法3:一次给多个变量键盘赋值
251             #include<stdio.h>
252             int main(void)
253             {
254                 int i,j,k ;
255                 printf("请输入三个值,中间以逗号分隔:\n") ;
256                 scanf("%d %d %d".&i,&j,&k) ;
257                 printf("i = %d,j = %d,k = %d\n",i,j,k) ;
258 
259                 return 0 ;
260             }
261             如何使用scanf()编写出高质量代码
262             1. 使用scanf之前最好先使用printf()作为输入的提示信息。
263             2. scanf中尽量不要使用非输入控制符,尤其是不要用\n 。
264             3. 应该编写代码对用户的非法输入做适当的处理
265                 while ((ch = getchar()) != '\n') 
266                     continue ;
267              
268 18.如何编写出更有保存价值和更具有学习价值的程序
269 /*-----------------------------------
270     时间:2018-12-28 00:31:42
271     功能:()
272     目的:()
273         测试%x,%X,%#x,%#X的用法
274     程序代码段:*/
275         #include<stdio.h>
276         int main(void)
277         {
278 
279             return 0 ;
280         }
281 /*
282     在Vc++6.0中的输出结果是:
283     ----------------------
284     2f
285     2F
286     0X2F
287     0X2F
288     -----------------------
289     总结:
290 ---------------------------------------
291 */ /*
292 19.如何看懂一个程序 如何掌握一个程序
293 判断一个数字是否是素数
294 判断一个数字是否是回文数
295 编程实现求一个十进制数字的二进制形式
296 把一个数字的每位是奇数的数字取出来组合形成的新数字
297 求一个数字倒过来的数字
298 
299 【如何掌握一个程序】
300 1. 尝试自己去编程解决它
301     但要意识到大部分人都是无法自己解决的,这时不要气馁,也不要放弃。
302     如果十五分钟内还想不出来,此时建议直接看答案。
303 2. 如果解决不了,就看答案
304     关键是把答案看懂,这个要花很大的精力,也是我们学习的重点。
305     看懂一个程序要分三步:流程、每个语句的功能、试数
306 3. 看懂之后尝试自己去修改程序,并且知道修改之后,程序的输出结果。
307     不建议看懂程序之后就立即自己敲程序
308 4. 照着答案去敲
309 5. 调试错误
310 6. 不看答案,自己独立把答案敲出来
311 7. 如果程序实在无法彻底理解,就把它背会,没有无法理解的程序。    
312 
313 算法: 解题的方法和步骤
314 看懂一个程序,分三步:
315     1. 流程
316     2. 每个语句功能
317     3. 试数 调试
318 看流程 —> 看功能语句  —> 改代码  —> 调试
319 */
320     【试数】
321     1. 把自己当成计算机,按照流程流程执行
322     2. 不要遗漏省略某一步
323     3. 注意格式清楚,逻辑清晰
324 
325 //试数详细步骤举例
326 {
327  #include<stdio.h>
328     int main(void)
329         {
330         int i ;
331         float sum ;
332 
333         for (i=1; i<=100; ++i)
334         {
335             sum = sum + 1/i ; //error
336             sum = sum + 1 / (float)(i)  //ture
337             //sum = sum + (float)(1/i) ;是错的
338             //更简单的写法是 sum = sum + 1.0/i ;
339             }
340             printf("sum = %d\n",sum) ;
341 
342             return 0 ;
343         }
344 ------------------
345 //试数
346 1-> i = 1 1<=100 成立
347     sum = 0+1/1.0=1  ++i i = 2
348 2-> i = 2 2<=100 成立
349     sum = 1+1/2.0   ++i i = 3 
350 3-> i = 3 3<=100 成立
351     sum = 1+1/2.0+1/3.0 ++i i = 4
352 4-> i = 4 4<=100 成立
353     sum = 1+1/2.0+1/3.0+1/4.0 ++i i = 5
354 }