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 }