谭浩强C语言程序设计书籍所包含的代码示例加注释说明如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 | /*笔记记录者:xy;学习教材 谭浩强C语言程序设计*/ /*时间:2022年11月15日14:40:36*/ /*使用本代码测试将 #if 0 ------> #if 1 即可*/ /*代码未必全部理解正确,欢迎萌新大佬对其修正*/ #include <stdio.h> //输入输出头文件 /*--------------------(第一章 C语言教程)--------------------*/ #if 1 /*例1.1,p14*/ int main( void ) { printf ( "hello world!\n" ); return 0; } #endif #if 0 /*例1.2,p15*/ #include <math.h> int main( void ) { double x,s; printf ( "请输入任意一个整数:" ); scanf ( "%lf" ,&x); s = sin (x); printf ( "%lf" ,s); return 0; } #endif #if 0 /*比较两个数的大小*/ //#include "math.h" int max( int a, int b); //函数声明 int main( void ) //主函数 { int x,y,z; //int max(int a,int b);/*可有可无,无影响*/ printf ( "Input two number:\n" ); scanf ( "%d%d" ,&x,&y); z=max(x,y); //----------------调用比较函数max--------------- printf ( "maxnum = %d\n" ,z); } int max( int a, int b) //自定义比较函数 { if (a>b) return a; else return b; } #endif /*--------------------(第二章 程序的灵魂——算法)--------------------*/ #if 0 /*数据结构+算法=程序*/ /* 算法分类: 1)数值运算算法:求解数值. 2)非数值运算算法:事务管理领域. */ /*例2.1 求1*2*3*4*5,p32*/ #if 0 int main() { int i,s = 1; for (i = 1;i <= 5;i++){ s = s*i; } printf ( "s = %d\n" ,s); } #else /*例2.1.1 求1*3*5*7*9*11*/ int main() { int n,m; printf ( "输入相乘的个数m:" ); scanf ( "%d" ,&m); int i = 1,s = 1; for (n = 1;n <= m;n++){ s = s*i; i = i+2; } printf ( "输出m(%d)个数相乘1*3*5*...*%d*%d的值:" ,m,i-2,i); printf ( "s = %d\n" ,s); } #endif #endif #if 0 /*例2.2,输出50(或m)个学生中,分数在80分以上的,p33*/ int main() { int m,i = 0; int n[50] = {0}; //学号(输入的学号不能以0开头如:001,在十进制中以0开头不合法,0无法输出出来,第三章会有介绍) int g[50] = {0}; //分数 printf ( "一共需要录入成绩的人数有m:" ); scanf ( "%d" ,&m); for (i=1;i<=m;i++) //循环输入50个人的成绩 { printf ( "请输入第%d个学生的学号和成绩\n" ,i); scanf ( "%d%d" ,&n[i-1],&g[i-1]); } printf ( "\n\n 成绩大于80的学生的学号和成绩为\n\n" ); for (i=1;i<=m;i++) //有几人则循环几次 { if (g[i-1]>=80) { printf ( "学号:%d 成绩:%d\n" ,n[i-1],g[i-1]); } } return 0; } #endif #if 0 /*例2.3,判断2000——2500年中的闰年,并输出,p33*/ /*在此基础上修改判断任意时间段中的闰年*/ #if 0 int main( void ) { int i; for (i=2000;i<=2500;i++){ if (i%4==0&&i%100!=0){ printf ( "%d是闰年\n" ,i); } else if (i%100==0&&i%400==0){ printf ( "%d是闰年\n" ,i); } } return 0; } #else int main( void ) { int i,m,n; printf ( "输入任意两段年限,判断是否为闰年:" ); scanf ( "%d%d" ,&m,&n); for (i=m;i<=n;i++){ if (i%4==0&&i%100!=0){ printf ( "%d是闰年\n" ,i); } else if (i%100==0&&i%400==0){ printf ( "%d是闰年\n" ,i); } } return 0; } #endif #endif #if 0 /*例2.4,求1-1/2+1/3-1/4+....+1/99-1/100,p34*/ int main( void ) { int i; double a = 1.0,s = 1.0; for (i=2;i<=100;i++){ a = (-1) * a; s = s + a/i; } printf ( "输出1-1/2+1/3-1/4+....+1/99-1/100的值s = %f" ,s); return 0; } #endif #if 0 /*例2.5,对于一个大于或等于3的正整数,判断它是不是一个素数,p34*/ int main( void ) { int i; //要判断的数字 int m; //用于辅助判断 int k; //k用作除数 printf ( "输入一个大于或等于3的正整数i:" ); scanf ( "%d" ,&i); for (k=2;k<=i;k++){ //k用作除数,用于判断是否为素数 m=i%k; if (m==0) break ; } if (k>=i){ printf ( "%d是素数\n" ,i); } else { printf ( "%d不是素数\n" ,i); } return 0; } #endif /*--------------------(第三章 数据类型、运算符与表达式)--------------------*/ /************************************************************************ 3.1数据类型分类: (1)基本数据类型: 1)整型: 1.基本型:int(2 byte(字节)) 2.短整型:short int或short(2 byte) 3.长整型:long int或long(4 byte) 4.无符号型:unsigned *无符号基本型:unsigned int *无符号短整型:unsigned short int *无符号长整型:unsigned long int **无符号型数据,所占空间不变,正数最大范围变为原来的2倍,但无法表示负数(p48)** 2)字符型:char(1 byte) 3)实型(浮点型) 1.单精度型:float(4 byte) 2.双精度型:double(8 byte) 4)枚举类型 (2)构造数据类型 1)数组类型 2)结构体类型 3)共用体(联合)类型 (3)指针类型 (4)空类型 ***************************************************************************/ #if 0 /*例3.1,符号常量的使用,p45*/ #define PRICE 30 //宏定义全局变量 int main( void ) { int num,total; num = 10; total = num*PRICE; printf ( "total = %d\n" ,total); return 0; } #endif #if 0 /*例3.2,整型变量的定义与使用,p49*/ int main( void ) { int a,b,c,d; //a,b,c,d为整型变量 unsigned u; //u为无符号整型变量 a = 12;b = -24;u = 10; //对各个变量赋值 c = a + u; d = b + u; printf ( "a+u = %d,b+u = %d\n" ,c,d); return 0; } #endif #if 0 /*例3.3整型数据的溢出,p49*/ #if 0 int main( void ) { /*在我的编译器中定义int被默认为了long int(4 byte),正常情况下应为基本类型int(2 byte)*/ int a,b; a = 2147483647; //在此处为long int(4 byte) 数值范围-2147483648~2147483647,查看p62 b = a + 1; printf ( "%d,%d\n" ,a,b); return 0; } #else int main( void ) { short int a,b; a = 32767; //此处为short int (2 byte)数值范围-32768~32767,查看p62 b = a + 1; printf ( "%d,%d\n" ,a,b); return 0; } #endif #endif #if 0 /*例3.4,类型转换,p50*/ int main( void ) { long x,y; int a,b,c,d; x = 5,y = 6; a = 7,b = 8; c = x + a; d = y + b; printf ( "c=x+a= %d,d=y+b= %d\n" ,c,d); return 0; } #endif #if 0 /*eg3.5,c允许浮点型使用后缀,p51*/ int main( void ) { printf ( "%f\n" ,356.); printf ( "%f\n" ,356); printf ( "%f\n" ,356f); return 0; } #endif #if 0 /*eg3.6,实行数据的舍入误差,p51*/ int main( void ) { float a,b; a = 123456.789e5; b = a + 20; printf ( "%f\n" ,a); printf ( "%f\n" ,b); } #endif #if 0 /*eg3.7,实行数据的舍入误差,p52*/ int main( void ) { float a; //单精度有效位为7位,所以小数点后2位以后无效 double b; //双精度有效位16位,但C规定小数后最多保留六位,其余部分四舍五入 a=33333.33333; b=33333.33333333333333; printf ( "%f\n%f\n" ,a,b); return 0; } #endif #if 0 /***************************************************************************** 转义字符: 1)\n 回车换行 2)\t 横向跳到下一制表位置 3)\b 退格 4)\r 回车 5)\f 走纸换页 6)\\ 反斜线符"\" 7)\' 单引号符 8)\" 双引号符 9)\a 鸣铃 10)\add 1~3位八进制所代表的字符 11)\xhh 1~2位十六进制所代表的字符 ******************************************************************************/ /*eg3.8,转义字符的使用,p53*/ int main( void ) { int a,b,c; a = 5;b = 6;c = 7; printf ( " ab c\tde\rf\n" ); printf ( "hijk\tL\bM\n" ); return 0; } #endif #if 0 /*eg3.9,向字符变量赋以整数,p54*/ int main( void ) { char a,b; a = 120; b = 121; printf ( "%c,%c\n" ,a,b); //输出字符型数据 printf ( "%d,%d\n" ,a,b); //输出整型数据 return 0; } #endif #if 0 /*eg3.10,字母大小写转换,p54*/ int main( void ) { char a,b; a = 'a' ; b = 'b' ; a = a - 32; //字母大小写的ASSCII码相差32 b = b - 32; printf ( "%c,%c\n%d,%d\n" ,a,b,a,b); //输出转换字符,和相应的ASCII码值 return 0; } #endif #if 0 /*eg3.11,变量赋初值操作,p55*/ int main( void ) { int a = 3,b,c = 5; b = a + c; printf ( "a=%d,b=%d,c=%d\n" ,a,b,c); return 0; } #endif #if 0 /* 数据类型自动转换规则: char,short——>int——>unsigned——>long——>double 将char转为int用atoi()进行转换(该函数包含在stdlib.h头文件中) */ /*eg3.12,数据类型转换,p56*/ #include <stdlib.h> //目的调用atoi函数进行数据转换 int main( void ) { char PI[8] = "3.14159" ; int s,r = 5; s = r*r* atoi (PI); printf ( "s=%d\n" ,s); return 0; } #endif #if 0 /*eg3.13,强制类型转换,p57*/ int main( void ) { float f = 5.75; printf ( "(int)f=%d,f=%f\n" ,( int )f,f); //将float强制转换为int return 0; } #endif #if 0 /*eg3.14,基本的算术运算符,p58*/ int main( void ) { printf ( "\n\n%d,%d\n" ,20/7,-20/7); printf ( "%f,%f\n" ,20.0/7,-20.0/7); return 0; } #endif #if 0 /*eg3.15,%取余运算符的使用,p58*/ int main( void ) { /*100除以3取余数*/ printf ( "%d\n" ,100%3); //本例输出 100 除以 3 所得的余数 1。 return 0; } #endif #if 0 /*eg3.16,自增自减运算符操作,p59*/ int main( void ) { int i = 8; printf ( "%d\n" ,++i); //9,++i先自加,后运算 //printf("%d\n",i);//9 printf ( "%d\n" ,--i); //8,--i先自减,后运算 //printf("%d\n",i);//8 printf ( "%d\n" ,i++); //8,i++先运算,后自加 //printf("%d\n",i);//9 printf ( "%d\n" ,i--); //9,i--先运算,后自减 //printf("%d\n",i);//8 printf ( "%d\n" ,-i++); //-8, //printf("%d\n",i);//9 printf ( "%d\n" ,-i--); //-9 //printf("%d\n",i);//8 return 0; } #endif #if 0 /*eg3.17,自加运算分析,p60*/ /*可运行出结果,会有报错,解决报错需将p,q分行写即可*/ #if 1 int main( void ) { /*报错(Multiple unsequenced modifications to 'i'clang(-Wunsequenced))但可运行*/ int i = 5,j = 5,p,q; p = (i++) + (i++) + (i++); //5+6+7 = 18 q = (++j) + (++j) + (++j); //6+7+8 = 21 printf ( "p=%d,q=%d,i=%d,j=%d\n" ,p,q,i,j); //18,21,7,8 return 0; } #else int main( void ) { /*解决报错*/ int i = 5,j = 5,p,q; p = i++; //5 p = p + (i++); //5+6 = 11 p = p + (i++); //11+7 =18 q = ++j; //6 q = q + (++j); //6+7 = 13 q = q + (++j); //13+8 = 21 printf ( "p=%d,q=%d,i=%d,j=%d\n" ,p,q,i,j); //18,21,7,8 return 0; } #endif #endif #if 0 /*eg3.19,逗号运算符的使用,p62*/ int main( void ) { int a = 2,b = 4,c = 6,x,y; y = (x=a+b),c=(b+c); printf ( "y=%d,x=%d,c=%d" ,y,x,c); //6,6,10 return 0; } #endif |