主页 > 创业  > 

C程序设计(第5版)——谭浩强(1)

C程序设计(第5版)——谭浩强(1)

参考: blog.csdn.net/qq_50696399/article/details/141574823

ch1 程序设计和C语言

ch1.1 什么是计算机程序 程序:一组计算机能识别和执行的指令; 指令:每条指令使计算机执行特定的操作; 只要让计算机执行这个程序,计算机就会“自动地”执行各条指令,有条不紊地进行工作。 计算机的本质是程序的机器,程序和指令是计算机系统中最基本的概念。

ch1.2 什么是计算机语言 机器指令(machine instruction):计算机能直接识别和接受的二进制代码; 机器语言(machine language):机器指令的集合;

汇编语言、符号汇编语言、符号语言(symbolic assembler language):计算机不能直接识别和执行符号语言的指令,需要一种称为汇编程序的软件把符号语言的指令转换为机器指令。一般,一条符号语言的指令对应转换为一条机器指令。转换过程称为“代真”或“汇编”;

高级语言(high level language):语言功能性强,且不依赖于具体机器,用它写出的程序对任何型号的计算机都适用(或只须作很少的修改); 计算机不能直接识别高级语言程序,要进行“翻译”。用一种称为编译程序的软件把高级语言写的程序(源程序source program)转换为机器指令的程序(目标程序object program),然后让计算机执行机器指令程序,最后得到结果。高级语言的一个语句往往对应多条机器指令。

ch1.4 最简单的C语言程序

//例1.1 int main() { printf("This is a C program.\n"); return 0; } //例1.2 int main() { int a, b, sum; a = 123; b = 456; sum = a + b; printf("sum is %d.\n", sum); return 0; } //例1.3 int main() { int max(int x, int y); int a, b, c; scanf("%d %d", &a, &b); c = max(a, b); printf("max=%d\n", c); return 0; } int max(int x, int y) { int z; if (x > y) z = x; else z = y; return z; }

C语言程序的结构有以下特点: (1)一个程序由一个或多个源程序文件组成,一个源程序文件包括:预处理指令(#include <stdio.h>)、全局声明(在函数之外进行的数据声明)、函数定义(main函数、max函数); (2)函数是C程序的主要组成部分; (3)一个函数包括:函数首部(函数的第1行)、函数体(函数首部下面的花括号内的部分)包括:声明部分(int a, b, c; int max(int x, int y))、执行部分; (4)程序总是从main函数开始执行的; (5)程序中要求计算机的操作是由函数中的C语句完成的; (6)每个数据声明和语句的最后必须有一个分号; (7)C语言本身不提供输入输出语句; (8)程序应当包含注释;

ch1.5 运行C程序的步骤与方法 实线表示操作流程,虚线表示文件的输入输出。编辑后得到一个源程序文件f.c,编译时把源程序文件f.c输入,经过编译得到目标程序文件f.obj,再将所有目标模块输入计算机,与系统提供的库函数等进行连接,得到可执行目标程序f.exe,最后把f.exe输入计算机,并使之运行得到结果。

习题1

程序:一组计算机能识别和执行的指令; 程序设计:(1)问题分析;(2)设计算法;(3)编写程序;(4)对源程序进行编辑、编译和连接;(5)运行程序、分析结果;(6)编写程序文档

人和计算机交流信息需要解决语言问题。需要创造一种计算机和人都能识别的语言,这就是计算机语言。 高级语言(high level language):语言功能性强,且不依赖于具体机器,用它写出的程序对任何型号的计算机都适用(或只须作很少的修改);

(1)源程序:C语言编写的程序;目标程序:机器指令的程序;可执行程序:计算机能够执行的机器指令的程序; (2)程序编辑;程序编译:源程序转为目标程序;程序连接:将所有目标模块输入计算机,与系统提供的库函数等进行连接,得到可执行目标程序f.exe (3)程序:一组计算机能识别和执行的指令;程序模块:一个源程序文件,即将一个程序分成若干个程序模块; (4)函数:C程序的主要组成部分;主函数:程序总是从main函数开始执行的;被调用函数:被某个函数所调用的函数称为被调函数,调用函数称为主调函数;库函数:系统提供的函数; (5)程序调试:发现和排除程序中故障的过程;程序测试:设计多组测试数据,检查程序对不同数据的运行情况,从中尽量发现程序中存在的漏洞,并修改程序,使之能适用于各种情况。

//4. int main() { printf("Hello World!.\n"); return 0; } //5. int main() { printf("*****\n"); printf(" *****\n"); printf(" *****\n"); printf(" *****\n"); return 0; } //5. int main() { int max(int a, int b, int c); int a, b, c; scanf("%d %d %d", &a, &b, &c); printf("max=%d\n", max(a, b, c)); return 0; } int max(int a, int b, int c) { int z; if (a > b) if (a > c) z = a; else z = c; else if (b > c) z = b; else z = c; return z; } ch2 算法——程序的灵魂

ch2.1 程序=算法+数据结构 一个程序包括:对数据的描述(数据结构data structure);对操作的描述(算法algorithm);

闰年:能被4整除,但不能被100整除;能被400整除; 素数:除了1和本身之外,不能被其他任何整数整除;

ch2.4 算法的特性 有穷性;确定性;有零个或多个输入;有一个或多个输出;有效性(可行性);

ch2.6 结构化程序设计方法 (1)自顶向下; (2)逐步细化; (3)模块化设计; (4)结构化编码(强调程序应该使用顺序、选择(条件)、和重复(循环)这三种基本控制结构来构建);

习题2

算法:为解决一个问题而采取的方法和步骤;

结构化的算法:由基本结构(顺序、选择、循环)所构成的算法;

结构化程序设计:强调程序设计风格和程序结构的规范化,提倡清晰的结构。 主要内容:自顶向下;逐步细化;模块化设计;结构化编码

ch3 顺序程序设计

ch3.1 顺序程序设计举例

//例3.1 int main() { float f, c; f = 64.0; c = 5.0 / 9 * (f - 32); printf("f = %f\nc = %f\n",f, c); return 0; } //例3.2 int main() { float r1 = 0.0036, r2 = 0.0225, r3 = 0.0198; float f1 = 1000 * (1 + r1); float f2 = 1000 * (1 + r2); float f3 = 1000 * (1 + r3 / 2) * (1 + r3 / 2); printf("f1 = %f\nf2 = %f\nf3 = %f\n", f1, f2, f3); return 0; }

ch3.2 数据的表现形式及其运算 ch3.2.1 常量和变量

常量 (1)整形常量 (2)实型常量 ①十进制小数形式:123.456,0.345 ②指数形式:12.34e3(代表12.34乘十的三次方),0.145E-25(代表0.145乘十的负二十五次方) (3)字符常量 ①普通字符 ②转义字符 (4)字符串常量 (5)符号常量 用#define指令

变量

常变量 定义变量时,前面加一个关键字const; 常变量具有变量的基本属性:有类型,占存储单元,只是不允许改变其值。常变量是有名字的不变量,常量是没有名字的不变量。有名字便于在程序中被引用。

标识符

ch3.2.2 数据类型 ch3.2.3 整型数据 ch3.2.4 字符型数据 ch3.2.5 浮点型数据

ch3.3 运算符和表达式

//例3.3 int main() { char c1, c2; c1 = 'A'; c2 = c1 + 32; printf("%c\n%d\n", c2, c2); return 0; }

ch3.4 C语句

//例3.4 int main() { float a, b, c, s, area; scanf("%f %f %f", &a, &b, &c); s = (a + b + c) / 2; area = sqrt(s * (s - a) * (s - b) * (s - c)); printf("area = %f\n", area); return 0; }

ch3.5 数据的输入输出

//例3.5 int main() { double a, b, c, disc, x1, x2, p, q; scanf("%lf %lf %lf", &a, &b, &c); disc = b*b - 4*a*c; p = -b / 2*a; q = sqrt(disc) / 2*a; x1 = p + q;x2 = p - q; printf("x1 = %7.2f\nx2 = %7.2f\n", x1, x2); return 0; } //例3.6 int main() { double a = 1.0; printf("%20.15f\n", a / 3); return 0; } //例3.7 int main() { float a; a = 10000 / 3.0; printf("-25.15%f\n", a); return 0; }

//例3.8 int main() { int a = 66, b = 79, c = 89; putchar(a); putchar(b); putchar(c); putchar('\n'); return 0; } //例3.9 int main() { char a, b, c; a = getchar(); b = getchar(); c = getchar(); putchar(a); putchar(b); putchar(c); putchar('\n'); return 0; } //例3.10 int main() { char c1, c2; c1 = getchar(); c2 = c1 + 32; putchar(c2); putchar('\n'); return 0; } 习题3 //1. int main() { float r = 0.07; int n = 10; float p = pow((1 + r), n); printf("p = %f\n", p); return 0; } //2. int main() { float r1 = 0.015, r2 = 0.021, r3 = 0.0275, r5 = 0.03, r = 0.0035; printf("一次存5年 = %f\n", 1000 * (1 + 5 * r5)); printf("先存2年再存3年 = %f\n", 1000 * (1 + 2 * r2) * (1 + 3 * r3)); printf("先存3年再存2年 = %f\n", 1000 * (1 + 3 * r3) * (1 + 2 * r2)); printf("存1年存5次 = %f\n", 1000 * pow(1 + r1, 5)); printf("存活期存5年 = %f\n", 1000 * pow(1 + r/4, 20)); return 0; } //3. int main() { float d = 300000, p = 6000, r = 0.01, m; m = log(p / (p - d * r)) / log(1 + r); printf("m=%.1f\n", m); return 0; } //4. int main() { char c1 = 97, c2 = 98;//因为ASCII表中只有128个字符,197和198都超出了范围,所以值是随机的 printf("c1 = %c,c2 = %c\n", c1, c2); printf("c1 = %d,c2 = %d\n", c1, c2); return 0; } //5. int main() { int a, b; float x, y; char c1, c2; scanf("a = %d b = %d", &a, &b); scanf("%f %e", &x, &y); scanf("%c %c", &c1, &c2); printf("a = %d b = %d\nx = %f y = %f\nc1 = %c c2 = %c\n", a, b, x, y, c1, c2); return 0; } //6. int main() { char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a'; c1 += 4; c2 += 4; c3 += 4; c4 += 4; c5 += 4; putchar(c1); putchar(c2); putchar(c3); printf("%c%c\n", c4, c5); return 0; } //7. int main() { float r, h, y1, y2, y3, y4, y5; scanf("%f %f", &r, &h); printf("圆周长为:%.2f\n", 2 * 3.14 * r); printf("圆面积为:%.2f\n", 3.14 * r * r); printf("圆球表面积为:%.2f\n", 4 * 3.14 * r * r); printf("圆球体积为:%.2f\n", 4 / 3 * 3.14 * r * r * r); printf("圆柱体积为:%.2f\n", 3.14 * r * r * h); return 0; } //8. int main() { char c1; int c2; c1 = getchar(); c2 = getchar(); printf("%c\n", c1); putchar(c2); return 0; } //若整型变量的值在0~127的范围内,char和int是等价的 ch4 选择结构程序设计 //例4.1 int main() { double a, b, c, disc, x1, x2, p, q; scanf("%lf %lf %lf", &a, &b, &c); disc = b * b - 4 * a * c; if (disc < 0) printf("This equation hasn't real root\n"); else { p = -b / (2 * a); q = sqrt(disc) / (2 * a); x1 = p + q; x2 = p - q; printf("real roots:%8.4f and %8.4f\n", x1, x2); } return 0; } //例4.2 int main() { float a, b, t; scanf("%f %f", &a, &b); if (a > b) { t = a; a = b; b = t; } printf("min = %f, max = %f\n", a, b); return 0; } //例4.3 int main() { float a, b, c, t; scanf("%f %f %f", &a, &b, &c); if (a > b) { t = a; a = b; b = t; } if (a > c) { t = a; a = c; c = t; } if (b > c) { t = b; b = c; c = t; } printf("min = %f, mid = %f, max = %f\n", a, b, c); return 0; } //例4.4 int main() { char ch; scanf("%c", &ch); ch = (ch >= 'A' && ch <= 'Z') ? ch + 32 : ch; printf("%c\n", ch); return 0; } //例4.5 int main() { int x,y; scanf("%d", &x); if (x>=0) if(x>0) y = 1; else y = 0; else y = -1; printf("x = %d,y = %d\n", x,y); return 0; } //例4.6 int main() { char grade; scanf("%c", &grade); printf("Your score : \n"); switch (grade) { case 'A': printf("85-100\n"); break; case 'B': printf("70-84\n"); break; case 'C': printf("60-69\n"); break; case 'D': printf("0-59\n"); break; default: printf("Error\n"); break; } return 0; } //例4.7 int main() { void action1(int x, int y); void action2(int x, int y); char ch; int a = 15, b = 23; ch = getchar(); switch (ch) { case 'a': case 'A': action1(a, b); break; case 'b': case 'B': action2(a, b); break; default: printf("Error\n"); break; } return 0; } //例4.10 int main() { int c, s;//250的倍数;距离 float price, weight, discount, freight;//基本运费;重量;折扣;总运费; printf("Enter price, weight, s:"); scanf("%f %f %d", &price, &weight, &s); if (s >= 3000) c = 12; else c = s / 250; switch (c) { case 0: discount = 0; break; case 1: discount = 2; break; case 2: case 3: discount = 5; break; case 4: case 5: case 6: case 7: discount = 8; break; case 8: case 9: case 10: case 11: discount = 10; break; case 12: discount = 15; break; } freight = price * weight * s * (1 - discount / 100); printf("freight = %10.2f\n", freight); return 0; } 习题4

2. 在C语言中,“真”和“假”通常通过整数值来表示: 假:在C语言中,值为0被视为逻辑假。 真:任何非零值都被视为逻辑真。尽管如此,在实践中,通常使用1来代表逻辑真,但这不是强制的。

在条件语句(如if、while等)中,C语言通过评估表达式的值来决定其真假: 如果表达式的计算结果为0,则被认为是假。 如果表达式的计算结果为非零值,则被认为是真。

//3. int main() { int a = 3, b = 4, c = 5, x, y; printf("a + b > c && b == c的值为%d\n", a + b > c && b == c);//0 printf("a || b + c && b - c的值为%d\n", a || b + c && b - c);//1 printf("!(a > b) && !c || 1的值为%d\n", !(a > b) && !c || 1);//1 printf("!(x = a) && (y = b) && 0的值为%d\n", !(x = a) && (y = b) && 0);//0 printf("!(a + b) + c - 1 && b + c / 2的值为%d\n", !(a + b) + c - 1 && b + c / 2);//1 return 0; } //4. int main() { int a, b, c; printf("Input a b c:\n"); scanf("%d %d %d", &a, &b, &c); if (a > b) if (a > c) printf("max=%d\n", a); else printf("max=%d\n", c); else if (b > c) printf("max=%d\n", b); else printf("max=%d\n", c); return 0; } //5. int main() { int a; while (1) { printf("Input a num:\n"); scanf("%d", &a); if (a >= 1000 || a <= 0) printf("Input error, please input again\n"); else break; } printf("%d\n",(int)sqrt(a)); return 0; } //6. int main() { double x, y; scanf("%lf", &x); if (x < 1) y = x; else if (x <= 1 && x < 10) y = 2 * x - 1; else if (x >= 10) y = 3 * x - 11; printf("y = %lf\n", y); return 0; } //7. int main() { int x,y; printf("Input x:\n"); scanf("%d", &x); y = -1;//x=0时,y=-1 if (x != 0) if (x > 0) y = 1;//x>0时,y=1 else//else始终与上方离它最近的且未配对的if配对 y = 0;//x<0时,y=0 printf("x = %d,y = %d\n",x,y); return 0; } int main() { int x,y; printf("Input x:\n"); scanf("%d", &x); y = 0;//x<0时,y=0 if (x >= 0) if (x > 0) y = 1;//x>0时,y=1 else//else始终与上方离它最近的且未配对的if配对 y = -1;//x=0时,y=-1 printf("x = %d,y = %d\n",x,y); return 0; } //8. int main() { int score; printf("Input score:\n"); scanf("%d", &score); switch (score / 10) { case(10): case(9): printf("A\n"); break; case(8): printf("B\n"); break; case(7): printf("C\n"); break; case(6): printf("D\n"); break; default: printf("E\n"); break; } return 0; } //10. int main() { int num, b[5]; printf("Input num:\n"); scanf("%d", &num); int i; for (i = 0; i < 5; i++) { b[i] = num % 10; if((num /= 10) == 0) break; } printf("它是%d位数\n", i+1); printf("分别输出每一位数字:\n"); for (int j = i; j >= 0 ; j--) { printf("%d", b[j]); } printf("逆序输出各位数字:\n"); for (int j = 0; j < i+1; j++) { printf("%d", b[j]); } return 0; } //9. int main() { int i; printf("Input i:\n"); scanf("%d", &i); if(i <= 100000) { printf("price = %f\n", i*0.1); } else if (i <= 200000) { printf("price = %f\n", 10000 + (i - 100000) * 0.075); } else if (i <= 400000) { printf("price = %f\n", 17500 + (i - 200000) * 0.05); } else if (i <= 600000) { printf("price = %f\n", 27500 + (i - 400000) * 0.03); } else if (i <= 1000000) { printf("price = %f\n", 33500 + (i - 600000) * 0.015); } else { printf("price = %f\n", 39500 + (i - 1000000) * 0.01); } return 0; } int main() { int i,j; printf("Input i:\n"); scanf("%d", &i); j = i / 100000; switch (j) { case 0: printf("price = %f\n", i * 0.1); break; case 1: printf("price = %f\n", 10000 + (i - 100000) * 0.075); break; case 2: case 3: printf("price = %f\n", 17500 + (i - 200000) * 0.05); break; case 4: case 5: printf("price = %f\n", 27500 + (i - 400000) * 0.03); break; case 6: case 7: case 8: case 9: printf("price = %f\n", 33500 + (i - 600000) * 0.015); break; default: printf("price = %f\n", 39500 + (i - 1000000) * 0.01); break; } return 0; } //11. int main() { int a,b,c,d,t; printf("Input a,b,c,d:\n"); scanf("%d,%d,%d,%d", &a, &b, &c, &d); if (a > b) { t = a; a = b; b = t; } if (a > c) { t = a; a = c; c = t; } if (a > d) { t = a; a = d; d = t; } if (b > c) { t = b; b = c; c = t; } if (b > d) { t = b; b = d; d = t; } if (c > d) { t = c; c = d; d = t; } printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d); return 0; } //12. int main() { int h = 10; float x, y, x1 = 2, y1 = 2, x2 = -2, y2 = 2, x3 = -2, y3 = -2, x4 = 2, y4 = -2, d1, d2, d3, d4; printf("\n请输入一个点(x,y):"); scanf("%f,%f", &x, &y); // 求该点到各中心点的距离 d1 = (x - x1) * (x - x1) + (y - y1) * (y - y1); d2 = (x - x2) * (x - x2) + (y - y2) * (y - y2); d3 = (x - x3) * (x - x3) + (y - y3) * (y - y3); d4 = (x - x4) * (x - x4) + (y - y4) * (y - y4); if (d1 > 1 && d2 > 1 && d3 > 1 && d4 > 1) h = 0; printf("\nh = %d\n", h); return 0; } ch5 循环结构程序设计 //例5.1 int main() { int i = 1, sum = 0; while (i <= 100) { sum += i; i++; } printf("sum=%d\n", sum); return 0; } //例5.2 int main() { int i = 1, sum = 0; do { sum += i; i++; } while (i <= 100); printf("sum=%d\n", sum); return 0; } //例5.3 int main() { int i, sum = 0; printf("please enter i, i = ?\n"); scanf("%d", &i); while (i <= 10) { sum += i; i++; } ; printf("sum=%d\n", sum); return 0; } int main() { int i, sum = 0; printf("please enter i, i = ?\n"); scanf("%d", &i); do { sum += i; i++; } while (i <= 10); printf("sum=%d\n", sum); return 0; } //例5.4 #define SUM 100000 int main() { float amount, aver, total; int i; for (i = 0, total = 0; i < 1000; i++) { printf("please enter amountd\n"); scanf("%f", &amount); total += amount; if(total >= SUM) break; } aver = total / (i+1); printf("num = %d\nave = %f\n", i+1, aver); return 0; } //例5.5 int main() { int n; for (n = 100; n <= 200; n++) { if(n % 3 == 0) continue; printf("%d ", n); } return 0; } //例5.6 int main() { int i, j, n = 0; for (i = 1; i <= 4; i++) { for (j = 1; j <= 5; j++) { printf("%d\t", i * j); n++; } printf("\n"); } return 0; } //例5.7 int main() { int n, sign = 1; double term, pi = 0; for (n = 1; ; n += 2) { term = 1.0 / n; if (term < 1e-6) break; pi += sign * term; sign = -sign; } printf("pi = %f\n", 4 * pi); return 0; } //例5.8 int main() { int fn(int n); int n; double term, pi = 0; for (n = 1; n<=40; n++) { printf("fn = %d\n", fn(n)); } return 0; } int fn(int n) { if (n == 1 || n == 2) return 1; else return fn(n - 1) + fn(n - 2); } int main() { double term, pi = 0; printf("f1 = 1\nf2 = 1\n"); for (int n = 3, f1 = 1, f2 = 1, f3; n<=40; n++) { f3 = f1 + f2; printf("f%d = %d\n", n, f3); f1 = f2; f2 = f3; } return 0; } //例5.9 int main() { int n, i; printf("please enter a intefer number, n = ?"); scanf("%d", &n); for (i = 2; i < n;i++) { if (n % i == 0) break; } if (i == n) printf("%d is a prime number\n", n); else printf("%d is not a prime number\n", n); return 0; } //例5.10 int main() { int n, i; for (n = 100; n <= 200; n++) { for (i = 2; i < sqrt(n); i++) { if (n % i == 0) break; } if (i >= sqrt(n)) printf("%d is a prime number\n", n); } return 0; } //例5.11 int main() { char c; c = getchar(); while (c != '\n') { if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') { if (c >= 'W' && c <= 'Z' || c >= 'w' && c <= 'z') c -= 22; else c += 4; } putchar(c); c = getchar(); } return 0; } 习题5 //2. int main() { int n, sign = 1; double term, pi = 0; for (n = 1; ; n += 2) { term = 1.0 / n; if (term < 1e-8) break; pi += sign * term; sign = -sign; } printf("pi = %f\n", 4 * pi); printf("执行循环体的次数 = %d\n", (n+1) / 2 ); return 0; } //3. int main() { int m, n; printf("输入两个正整数m和n\n", &m, &n); scanf("%d %d", &m, &n); if(m > n) { int temp = m; m = n; n = temp; } for (int i = m; ; i--) { if (m % i == 0 && n % i == 0) { printf("最大公约数是%d\n", i); break; } } for (int i = 2; ; i++) { if (m * i % n == 0) { printf("最小公倍数是%d\n", m * i); break; } } return 0; } //4. int main() { char ch; int num1 = 0, num2 = 0, num3 = 0, num4 = 0; printf("输入一行字符串\n"); while ((ch = getchar()) != '\n')//scanf空格就结束了字符串的输入 { if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') num1++; else if (ch == ' ') num2++; else if (ch >= '0' && ch <= '9') num3++; else num4++; } printf("英文字母 = %d\n", num1); printf("空格 = %d\n", num2); printf("数字 = %d\n", num3); printf("其他字符 = %d\n", num4); return 0; } //5. int main() { int a, n, sn = 0; printf("输入a n\n"); scanf("%d %d", &a, &n); for (int i = 1; i <= n; i++) { int term = 0; for (int j = 1, t = 1; j <= i; j++, t *= 10) { term += a * t; } sn += term; } printf("sn = %d\n", sn); return 0; } //6. int main() { double sn = 0; for (int i = 1; i <= 20; i++) { double term = 1; for (int j = 1; j <= i; j++) { term *= j; } printf("term = %f\n", term); sn += term; } printf("sn = %f\n", sn); return 0; } //7. int main() { double s1 = 0, s2 = 0, s3 = 0; for (int i = 1; i <= 100; i++) { s1 += i; } for (int i = 1; i <= 50; i++) { s2 += i * i; } for (int i = 1; i <= 10; i++) { s3 += 1.0 / i; } printf("s = %f\n", s1 + s2 + s3); return 0; } //8. int main() { for (int i = 100; i <= 999; i++) { int a = i / 100; int b = i / 10 % 10; int c = i % 10; if (a * a * a + b * b * b + c * c * c == i) printf("%d\n", i); } return 0; } //9. int main() { for (int i = 1; i <= 1000; i++) { int sum = 0; int num[10] = { 0 }; for (int j = 1, k = 0; j < i; j++) { if (i % j == 0) { sum += j; num[k++] = j; } } if (sum == i) { printf("%d its factors are ", i); for (int k = 0; num[k] != 0; k++) { printf("%d ", num[k]); } } } return 0; } //10. int main() { double sum = 0, term, term1, term1_1 = 2, term1_2 = 3, term2, term2_1=1, term2_2=2; for (int i = 1; i <= 20; i++) { if (i == 1) { term1 = 2; term2 = 1; } else if (i == 2) { term1 = 3; term2 = 2; } else { term1 = term1_1 + term1_2; term1_1 = term1_2; term1_2 = term1; term2 = term2_1 + term2_2; term2_1 = term2_2; term2_2 = term2; } term = term1 / term2; sum += term; } printf("sum = %f\n", sum); return 0; } //11. int main() { double height = 100, s = 0; for (int i = 1; i <= 10; i++)//一下一上为一个循环,最后一次落地不算上 { s += height; height /= 2; s += height; } printf("第10次落地时共经过%f米,第10次反弹%f高\n", s-height, height); return 0; } //12. int main() { int t = 1; for (int i = 1; i < 10; i++) { t = 2 * (t + 1); } printf("第1天共摘了%d个桃子\n", t); return 0; } //13. int main() { double x1 = 1,x2 = 1,a = 2; do { x1 = x2; x2 = 1.0 / 2.0 * (x1 + a / x1); } while (fabs(x1 - x2) > 1e-5); printf("%lf", x2); return 0; } //14. int main() { double x1 = 1.5, x2 = 1.5; do { x2 = x1 - (2 * x1 * x1 * x1 - 4 * x1 * x1 + 3 * x1 - 6) / (6 * x1 * x1 - 8 * x1 + 3); x1 = x2; } while (fabs(2 * x1 * x1 * x1 - 4 * x1 * x1 + 3 * x1 - 6) > 1e-5); printf("%lf", x2); return 0; } //15. int main() { double l = -10, r = 10, mid; while (r - l >= 1e-5) { mid = (l + r) / 2; if (2 * pow(mid, 3) - 4 * pow(mid, 2) + 3 * mid - 6 >= 0) r = mid; else l = mid; } printf("\nmid=%8.5lf\n", mid); return 0; } //16. int main() { int n; printf("Input n:"); scanf("%d", &n); int j = 0; for (j = 0; j < n / 2; j++) { for (int i = 0; i < n / 2 - j; i++) printf(" "); for (int i = 0; i < 2 * j + 1; i++) printf("*"); printf("\n"); } if (n % 2 != 0) { for (int i = 0; i < n; i++) printf("*"); } printf("\n"); for (j = 0; j < n / 2; j++) { for (int i = 0; i < j + 1; i++) printf(" "); for (int i = 0; i < n - 2 * j - 2; i++) printf("*"); printf("\n"); } return 0; } ch6 利用数组处理批量数据 //例6.1 int main() { int a[10]; for (int i = 0; i < 10; i++) { a[i] = i; } for (int i = 9; i >= 0; i--) { printf("a[%d] = %d\n", i, a[i]); } return 0; } //例6.2 int main() { int f[20] = { 1, 1 }; for (int i = 2; i < 20; i++) { f[i] = f[i - 1] + f[i - 2]; } for (int i = 0; i < 20; i++) { printf("%d\n", f[i]); } return 0; } //例6.3 //起泡法的基本思路:每次将相邻的两个数比较,将小的掉到前面 int main() { int a[10], i, j, t; printf("input 10 numbers:\n"); for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (i = 0; i < 9; i++)//10个数字相邻比较9次 { for (j = 0; j < 9 - i; j++)//比较完一次少一次,比较时交换大小 { if (a[j] > a[j + 1]) { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } for (i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; } //例6.4 int main() { int a[2][3] = { 1,2,3,4,5,6 }, b[3][2], i, j; printf("a:\n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { printf("\t%d",a[i][j]); b[j][i] = a[i][j]; } printf("\n"); } printf("a:\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) { printf("\t%d", b[i][j]); } printf("\n"); } return 0; } //例6.5 int main() { int a[3][4] = { 1,2,3,4,9,8,7,6,-10,10,-5,2 }, max = a[0][0], i, j; printf("a:\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { if (max < a[i][j]) { max = a[i][j]; printf("max:a[%d][%d] = %d\n", i, j, a[i][j]); } } } return 0; } //例6.8 int main() { char str[80]; int i, num = 0, word = 0; fgets(str, sizeof(str), stdin);//scanf把空格当成了'\0',在C11标准中,gets函数已经被正式移除 for (i = 0; str[i] != '\0'; i++) { if (str[i] == ' ') word = 0; else if(word == 0) { word = 1; num++; } } printf("There are %d words\n", num); return 0; } //例6.9 int main() { char str[3][20], t[20]; int i, num = 0, word = 0; for(i = 0;i<3;i++) fgets(str[i], sizeof(str), stdin); if (strcmp(str[0], str[1]) > 0) if (strcmp(str[0], str[2]) > 0) strcpy(t , str[0]); else if (strcmp(str[1], str[2]) > 0) strcpy(t, str[1]); else strcpy(t, str[2]); printf("%s\n", t); return 0; } 习题6 //1. int main() { for (int i = 2; i < 100; i++) { int j; for (j = 2; j < sqrt(i); j++) if (i % j == 0) break; if (j > sqrt(i)) printf("%d ", i); } return 0; } //2. int main() { int a[10], t; for (int i = 0; i < 10; i++) scanf("%d", &a[i]); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9 - i; j++) if (a[j] > a[j + 1]) { t = a[j]; a[j] = a[j+1]; a[j + 1] = t; } } for (int i = 0; i < 10; i++) printf("%d ", a[i]); return 0; } //3. int main() { int a[3][3] = { {1,5,8},{2,4,6},{9,6,3} }, sum = 0; for (int i = 0; i < 3; i++) { sum += a[i][i]; } printf("%d", sum); return 0; } //4. int main() { int a[5] = {-100,1,7,7,80}, b[6], t, gap[5], min, index = 0; scanf("%d", &t); for (int i = 0; i < 5; i++) { gap[i] = fabs(a[i] - t); } min = gap[0]; for (int i = 1; i < 5; i++) { if (min > gap[i]) { index = i; min = gap[i]; } } printf("插入数字与第%d个最接近\n", index); if (t <= a[index]) { for (int i = 0; i < index; i++)//前面保持不变 b[i] = a[i]; b[index] = t;//插入 for (int i = index + 1; i < 6; i++)//后面重新赋值 b[i] = a[i - 1]; } else { for (int i = 0; i <= index; i++) b[i] = a[i]; b[index+1] = t; for (int i = index + 2; i < 6; i++) b[i] = a[i - 1]; } for (int i = 0; i < 6; i++) { printf("%d ", b[i]); } return 0; } //5. int main() { int a[5] = {8,6,5,4,1}, b[5]; for (int i = 0; i < 5; i++) { b[4-i] = a[i]; } for (int i = 0; i < 5; i++) { printf("%d ", b[i]); } return 0; } //6. int main() { int a[10][10]; for (int i = 0; i < 10; i++) { a[i][0] = 1;//每行第一个元素为1 a[i][i] = 1;//每行最后一个元素为1 } for (int i = 2; i < 10; i++) { for (int j = 1; j < i; j++) { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } } for (int i = 0; i < 10; i++) { for (int j = 0; j<i+1;j++) { printf("%d\t", a[i][j]); } printf("\n"); } return 0; } //8. int max_index[4][2], min_index[5][2];//每行最大与每列最小值的索引 int main() { void max(int n, int a[][5]); void min(int n, int a[][5]); int a[4][5] = { {1, 2, 3, 4, 5}, {2, 4, 6, 8, 10}, {3, 6, 9, 12, 15}, {4, 8, 12, 16, 20} }; for (int i = 0; i < 4; i++) { max(i, a); } for (int i = 0; i < 5; i++) { min(i, a); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) printf("%d ", max_index[i][j]); printf("\n"); } for (int i = 0; i < 5; i++) { for (int j = 0; j < 2; j++) printf("%d ", min_index[i][j]); printf("\n"); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) if (max_index[i][0] == min_index[j][0] && max_index[i][1] == min_index[j][1]) { printf("鞍点索引(%d,%d)", max_index[i][0], max_index[i][1]); break; } } return 0; } void max(int n, int a[][5])//每行的最大值 { int max_value = a[n][0]; for (int i = 0; i < 5; i++) { if (max_value <= a[n][i]) { max_value = a[n][i]; max_index[n][0] = n; max_index[n][1] = i; } } } void min(int n, int a[][5])//每列的最小值 { int min_value = a[0][n]; for (int i = 0; i < 4; i++) { if (min_value >= a[i][n]) { min_value = a[i][n]; min_index[n][0] = i; min_index[n][1] = n; } } } //9. int main() { int a[15] = { 99, 91, 87, 80, 76, 71, 64, 58, 52, 47, 46, 38, 31, 22, 16 }; int left = 0,right = 14,mid = left + (right-left)/2; int n; scanf("%d", &n); for (; left < right && mid != left && mid != right;) { if (n > a[mid]) { right = mid; mid = left + (right - left) / 2; } else if (n < a[mid]) { left = mid; mid = left + (right - left) / 2; } else { printf("该数是数组中第%d个元素的值\n", mid + 1); return 0; } } printf("无此数\n"); return 0; } //10. int main() { char str[3][10] = {//'\0'算其他字符 {"fu& 123 S"}, {"(u& jb3 "}, {"fu! sj B"} }; int space[3] = { 0 }, big[3] = { 0 }, small[3] = { 0 }, num[3] = { 0 }, other[3] = { 0 }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 10; j++) { if (str[i][j] == ' ') space[i]++; else if (str[i][j] <= 'Z' && str[i][j] >= 'A') big[i]++; else if (str[i][j] <= 'z' && str[i][j] >= 'a') small[i]++; else if (str[i][j] <= '9' && str[i][j] >= '0') num[i]++; else other[i]++; } } for (int i = 0; i < 3; i++) { printf("space[%d] = %d, big[%d] = %d, small[%d] = %d, num[%d] = %d, other[%d] = %d\n", i,space[i], i,big[i], i,small[i], i,num[i], i,other[i]); } return 0; } //11. int main() { //基数输出,偶数不输出 for (int i = 1; i <= 9; i++) { if (i % 2 == 1) { for (int j = 0; j < i - 1; j++) { printf(" "); } for (int j = 1; j <= 9; j++) { if (j % 2 == 1) printf("*"); else printf(" "); } } else printf("\n\n"); } return 0; } //12. int main() { char str1[20], str2[20]; fgets(str1, sizeof(str1), stdin); for (int i = 0, t; str1[i] != '\n'; i++) { if (str1[i] <= 'M' && str1[i] >= 'A') { t = str1[i] - 65 - 13; str2[i] = str1[i] + (2 * (-t) - 1); } else if(str1[i] <= 'Z' && str1[i] >= 'N') { t = str1[i] - 65 - 12; str2[i] = str1[i] - (2 * t - 1); } else str2[i] = str1[i]; } for (int i = 0, t; str1[i] != '\n'; i++) { if (str1[i] <= 'm' && str1[i] >= 'a') { t = str1[i] - 97 - 13; str2[i] = str1[i] + (2 * (-t) - 1); } else if (str1[i] <= 'z' && str1[i] >= 'n') { t = str1[i] - 97 - 12; str2[i] = str1[i] - (2 * t - 1); } else str2[i] = str1[i]; } for(int i = 0; i<strlen(str1) - 1; i++) printf("%c",str2[i]); return 0; } //13. int main() { char str1[80], str2[40]; fgets(str1, sizeof(str1)-40, stdin); fgets(str2, sizeof(str1), stdin); int i, j; for (i = 0; str1[i] != '\n'; i++); for (j = 0; str2[j] != '\n'; j++) { str1[i++] = str2[j]; } str1[i] = '\0'; printf("%s", str1); return 0; } //14. int main() { char str1[40], str2[40]; fgets(str1, sizeof(str1), stdin); fgets(str2, sizeof(str1), stdin); int i, j; for (i = 0; str1[i] != '\n' && str2[i] != '\n'; i++) { if (str1[i] > str2[i]) { printf("%d", str1[i] - str2[i]); break; } else if (str1[i] < str2[i]) { printf("%d", str1[i] - str2[i]); break; } else continue; } if (str1[i] == '\n') printf("s1=s2"); return 0; } //15. int main() { char str1[40], str2[40] = { 'F','u','\0','你' }; int i = 0; for (i = 0; str2[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s", str1); return 0; }

ch7 用函数实现模块化程序设计 //例7.1 int main() { void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0; } void print_star() { printf("******\n"); } void print_message() { printf("Hello World!\n"); } //例7.2 int main() { int find(int x, int y); int x, y, max; scanf("%d %d", &x, &y); max = find(x, y); printf("max = %d\n", max); return 0; } int find(int x, int y) { if (x < y) return y; else return x; } //例7.3 int main() { int max(float x, float y); float a,b; int c; scanf("%f %f", &a, &b); c = max(a, b); printf("max = %d\n", c); return 0; } int max(float x, float y) { float z; z = x > y ? x : y; return z; } //例7.4 int main() { float sum(float x, float y); float a,b; float c; scanf("%f %f", &a, &b); c = sum(a, b); printf("sum = %f\n", c); return 0; } float sum(float x, float y) { return x + y; } //例7.5 int max4(int a, int b, int c, int d); int max2(int a, int b); int main() { int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); c = max4(a, b, c, d); printf("max = %d\n", c); return 0; } int max4(int a, int b, int c, int d) { int t1 = max2(a, b); int t2 = max2(c, d); return max2(t1, t2); } int max2(int a, int b) { return a > b ? a : b; } //例7.6 int main() { int age(int n); printf("student5's age = %d\n", age(5)); return 0; } int age(int n) { if (n == 1) return 10; else return age(n-1) + 2; } //例7.7 int main() { int f(int n); int n; scanf("%d", &n); printf("n! = %d\n", f(n)); return 0; } int f(int n) { if (n == 1 || n==0) return 1; else return f(n-1) * n; } //例7.9 int main() { int max(int x, int y); int a[10], t, index, i; printf("enter 10 integer numbers:\n"); for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (i = 1, t = a[0], index = 0; i < 10; i++) { if (max(t, a[i]) > t) { t = max(t, a[i]); index = i; } } printf("The largest number is %d\nit is the %dth number\n", t, index + 1); return 0; } int max(int x, int y) { return x > y ? x : y; } //例7.10 int main() { float average(float array[]); float score[10]; int i; printf("enter 10 scores:\n"); for (i = 0; i < 10; i++) { scanf("%f", &score[i]); } printf("average score is %5.2f\n", average(score)); return 0; } float average(float array[]) { float ave = 0; for (int i = 0; i < 10; i++) { ave += array[i] / 10; } return ave; } //例7.11 int main() { float average(float array[], int n); float score1[5] = { 98.5,97,91.5,60,55 }; float score2[10] = { 67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5 }; printf("average score1 is %5.2f\n", average(score1, 5)); printf("average score2 is %5.2f\n", average(score2, 10)); return 0; } float average(float array[], int n) { float ave = 0; for (int i = 0; i < n; i++) { ave += array[i] / n; } return ave; } //例7.12 int main() { void sort(int array[], int n); int a[10]; printf("enter array:\n"); for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } sort(a, 10); printf("sorted array:\n"); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; } void sort(int array[], int n) { for (int i = 0, t; i < n-1; i++) { int min = array[i]; int min_index = i; for (int j = i + 1; j < n; j++) { if (array[j] < min)//先换索引,值不换保持数组不打乱 { min_index = j; min = array[j]; } } //遍历完找到最小的才换 t = array[i]; array[i] = array[min_index]; array[min_index] = t; } } //例7.13 int main() { int max_value(int array[][4]); int a[3][4] = {1,3,5,7,2,4,6,8,15,17,34,12}; printf("Max value is %d\n", max_value(a)); return 0; } int max_value(int array[][4]) { int max = array[0][0]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { if (array[i][j] > max) { max = array[i][j]; } } } return max; } //例7.14 int main() { void f(float score[], int n); float score[10] = {89, 95, 87.5,100,67.5,97,59,84,73,90}; f(score, 10); return 0; } void f(float score[], int n) { float a[3] = { score[0], score[0], 0}; for (int i = 0; i < 10; i++) { if (score[i] < a[0]) a[0] = score[i]; if (score[i] > a[1]) a[1] = score[i]; a[2] += score[i] / n; } printf("平均分 = %f,最高分 = %f,最低分 = %f\n", a[2], a[1], a[0]); // 修正打印顺序 } //例7.15 int a = 3, b = 5;//全局变量 int main() { int max(int a, int b); int a = 8;//局部变量,局部变量范围内全局变量不起作用 printf("Max value is %d\n", max(a, b));//a = 3,b = 5 return 0; } int max(int a, int b) { return a > b ? a : b;//形参,与全局变量局部变量没有关系 } //例7.16 int main() { int f(int); int a = 2, i; for (i = 0; i < 3; i++) printf("%d\n", f(a)); return 0; } int f(int a) { int b = 0;//auto可省略不写 static int c = 3; b += 1; c += 1; return(a + b + c); } //例7.17 int main() { int fac(int); for (int i = 1; i <= 5; i++) printf("%d! = %d\n", i, fac(i)); return 0; } int fac(int n) { static int f = 1; f *= n; return f; } //例7.18 int main() { int max(); extern int A, B, C;//把下面的ABC变量作用域扩展到从这里开始 printf("Please enter three integer numbers:"); scanf("%d %d %d", &A, &B, &C); printf("max is %d\n", max()); return 0; } int A, B, C;//全局变量,作用范围为从这里往下 int max() { int m; m = A > B ? A : B; if (C > m) m = C; return m; } //例7.19 //file1.c int A; int main() { int power(int); int b = 3, m; printf("Enter the number A and its power m\n"); scanf("%d %d", &A, &m); printf("%d ** %d = %d\n", A,m,power(m)); return 0; } //file2.c extern int A; int power(int n) { int i, y = 1; for (i = 1; i <= n; i++) y *= A; return y; } 习题7 //1. int main() { void f(int x, int y); int x, y; printf("输入两个整数\n"); scanf(" %d %d", &x, &y); f(x, y); return 0; } void f(int x, int y) { int t; for (int i = x > y ? y : x; i > 0 ; i--) if (x % i == 0 && y % i == 0) { printf("最大公约数:%d\n", i); break; } for (int i = x > y ? x : y; ; i++) if (i % x == 0 && i % y == 0) { printf("最小公倍数:%d\n", i); break; } } //2. int main() { void big(double delta, double a, double b); void equal(float delta, float a, float b); void small(float delta, float a, float b); double a, b, c, delta; printf("input a b c\n"); scanf(" %lf %lf %lf", &a, &b, &c); delta = b * b - 4 * a * c; if (delta > 0) big(delta, a, b); else if (delta == 0) equal(delta, a, b); else small(delta, a, b); return 0; } void big(double delta, double a, double b) { double x1 = (-b + sqrt(delta)) / (2 * a); double x2 = (-b - sqrt(delta)) / (2 * a); printf("x1 = %lf, x2 = %lf\n", x1 , x2); } void equal(float delta, float a, float b) { float x = (-b) / (2 * a); printf("x = %f\n", x); } void small(float delta, float a, float b) { float x = (-b) / (2 * a); float i = sqrt(-delta) / (2 * a); printf("x = %f ± %fi\n", x, i); } //3. int main() { void f(int n); int x; printf("输入一个整数\n"); scanf(" %d", &x); f(x); return 0; } void f(int n) { int i; for (i = 2; i < sqrt(n); i++) { if (n % 2 == 0) break; } if (i >= sqrt(n)) printf("%d OK", n); else printf("%d NG", n); } //4. int main() { void f(int a[][3]); int a[3][3] = { 1, 2, 3, 4, 5, 6, 7 , 8, 9 }; f(a); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d\t", a[i][j]); } printf("\n"); } return 0;; } void f(int a[][3]) { for (int i = 0; i < 3; i++) { for (int j = i+1; j < 3; j++)// 注意这里的 j 从 i+1 开始 { int t = a[i][j]; a[i][j] = a[j][i]; a[j][i] = t; } } } //5. int main() { void f(char* str); char str[80]; fgets(str, sizeof(str), stdin); f(str); printf("%s", str); return 0; } void f(char* str) { int len = strlen(str) - 1;//减换行符; for (int i = 0; i < len / 2; i++) { char t = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = t; } str[len] = '\0'; } //6. int main() { void f(char* str1, char* str2); char str1[80], str2[40]; fgets(str1, sizeof(str1), stdin); fgets(str2, sizeof(str2), stdin); f(str1, str2); printf("%s", str1); return 0; } void f(char* str1, char* str2) { int i, j; for (i = 0; str1[i] != '\n'; i++); for (j = 0; str2[j] != '\n'; j++) { str1[i++] = str2[j]; } str1[i] = '\0'; } //7. int main() { void f(char* str1, char* str2); char str1[80], str2[40]; fgets(str1, sizeof(str1), stdin); f(str1, str2); printf("%s", str2); return 0; } void f(char str1[], char str2[]) { int i, j; for (i = 0, j = 0; str1[i] != '\n'; i++) { if (str1[i] == 'a' || str1[i] == 'e' || str1[i] == 'i' || str1[i] == 'o' || str1[i] == 'u' || str1[i] == 'A' || str1[i] == 'E' || str1[i] == 'I' || str1[i] == 'O' || str1[i] == 'U') str2[j++] = str1[i]; } str2[j] = '\0'; } //8. int main() { void f(char str1[]); char str1[80], str2[40]; fgets(str1, sizeof(str1), stdin); f(str1); return 0; } void f(char str1[]) { int i, j; char str2[80]; for (i = 0, j = 0; str1[i] != '\n'; i++) { str2[j++] = str1[i]; if (str1[i + 1] != '\n') str2[j++] = ' '; } str2[j] = '\0'; printf("%s", str2); } //9. int main() { void f(char str[], int count[]); char str[80]; int count[4] = { 0 }; fgets(str, sizeof(str), stdin); f(str, count); printf("字母 = %d,数字 = %d,空格 = %d,其他 = %d,", count[0], count[1], count[2], count[3] ); return 0; } void f(char str[], int count[]) { for (int i = 0; str[i] != '\n'; i++) { if (str[i] >= 'A' && str[i] <= 'Z' || str[i] >= 'a' && str[i] <= 'z') count[0]++; else if (str[i] >= '0' && str[i] <= '9') count[1]++; else if (str[i] == ' ') count[2]++; else count[3]++; } } //10. int main() { void f(char str[], int count[]); char str[80]; char words[10][10] = {0}; fgets(str, sizeof(str), stdin); f(str, words); int max = strlen(words[0]), max_index = 0; for (int i = 1; i < 10; i++) if (strlen(words[i]) > max) { max = strlen(words[i]); max_index = i; } printf("%s", words[max_index]); return 0; } void f(char str[], char words[][10]) { for (int i = 0, k = 0; str[i] != '\n';) { for (; str[i] == ' '&& str[i] != '\n'; i++);//找到单词的首字母 int j = 0; for (; str[i] != ' '&& str[i] != '\n'; i++, j++)//j为单词字母数 { words[k][j] = str[i]; } words[k++][j] = '\0'; } } //11. int main() { void sort(char str[]); char str[11];//最后一个放'\n' fgets(str, sizeof(str), stdin); sort(str); for (int i = 0; i < 10; i++) printf("%c", str[i]); return 0; } void sort(char str[]) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9 - i; j++) { if (str[j] > str[j + 1]) { int t = str[j]; str[j] = str[j + 1]; str[j + 1] = t; } } } } //12. //牛顿迭代法:xn+1 = xn - f(xn) / f'(xn) int main() { double sort(double x1, double a, double b, double c, double d); double a, b, c, d; scanf("%lf %lf %lf %lf", &a, &b, &c, &d); printf("%lf", sort(1.5, a, b, c, d)); return 0; } double sort(double x1, double a, double b, double c, double d) { float fxn; float fpxn; float x2; while (1) { fxn = a * pow(x1, 3) + b * pow(x1, 2) + c * x1 + d; fpxn = 3 * a * pow(x1, 2) + 2 * b * x1 + c; x2 = x1 - fxn / fpxn; if (fabs(x2 - x1) > 1e-6)//当迭代地差不多时,连个x很接近,近似为解 x1 = x2; else return x2; } } //13. int main() { double p(int n, double x); int n; double x; scanf("%d %lf", &n, &x); printf("P%d(%lf) = %lf", n, x, p(n, x)); return 0; } double p(int n, double x) { if (n == 0) return 1; else if (n == 1) return x; else if(n > 1) return ((2 * n - 1) * x * p(n - 1, x) - (n - 1) * p(n - 2, x)) / n;//书本公式有误 } //14. int main() { void ave_stu(double score[][5]); void ave_class(double score[][5]); void find_max(double score[][5]); double a[10][5] = { 87,88,92,67,78, 88,86,87,98,90, 76,75,65,65,78, 67,87,60,90,67, 77,78,85,64,56, 76,89,94,65,76, 78,75,64,67,77, 77,76,56,87,85, 84,67,78,76,89, 86,75,64,69,90 }; ave_stu(a); ave_class(a); find_max(a); return 0; } void ave_stu(double score[][5]) { double ave = 0; for (int i = 0; i < 10; i++) { ave = 0; for (int j = 0; j < 5; j++) { ave += score[i][j] / 5; } printf("第%d个学生的平均分为%lf\n", i, ave); } } void ave_class(double score[][5]) { double ave = 0; for (int i = 0; i < 5; i++) { ave = 0; for (int j = 0; j < 10; j++) { ave += score[j][i] / 10; } printf("第%d个课的平均分为%lf\n", i, ave); } } void find_max(double score[][5]) { double max = score[0][0]; int max_index[2] = { 0 }; for (int i = 0; i < 10; i++) { for (int j = 0; j < 5; j++) { if (score[i][j] > max) { max_index[0] = i; max_index[1] = j; max = score[i][j]; } } } printf("最高分数对应第%d个学生,对应第%d个课程\n", max_index[0], max_index[1]); } //15. int main() { void input(char str[][2][5]);//姓名和职工号最大长度为5(包含'\0') void sort(char str[][2][5]); char str[5][2][5]; char num[5]; input(str); printf("Orignal:\n"); for (int i = 0; i < 5; i++) { printf("姓名:%s 职工号:%s\n", str[i][0], str[i][1]); } sort(str); printf("Sorted:\n"); for (int i = 0; i < 5; i++) { printf("姓名:%s 职工号:%s\n", str[i][0], str[i][1]); } printf("输入职工号:\n"); scanf("%s", num); printf("该职工姓名:%s\n",str[find(str, num)][0]); return 0; } void input(char str[][2][5]) { printf("输入5个职工的姓名和职工号\n"); for (int i = 0; i < 5; i++) { scanf("%s", str[i][0]);//姓名 scanf("%s", str[i][1]);//职工号 } } void sort(char str[][2][5])//交换字符串用strcpy { char t[2][5]; for(int i = 0;i < 4;i++) for(int j = 0;j < 4 - i; j++) if (atoi(str[j][1]) > atoi(str[j + 1][1]))//atoi将字符串为数字的字符串 转换为 数字 { strcpy(t[0], str[j][0]); strcpy(str[j][0], str[j + 1][0]); strcpy(str[j + 1][0], t[0]); strcpy(t[1], str[j][1]); strcpy(str[j][1], str[j + 1][1]); strcpy(str[j + 1][1], t[1]); } } int find(char str[][2][5], char num[5]) { int left = 0, right = 4, mid = left + (right - left) / 2; for (; left < right;) { if (atoi(str[mid][1]) > atoi(num)) { right = mid; mid = left + (right - left) / 2; } else if (atoi(str[mid][1]) < atoi(num)) { left = mid; mid = left + (right - left) / 2; } else return mid; } } //16. int main() { int translate(char num[5]); char num[5]; printf("输入十六进制数:\n"); scanf("%s", num); printf("相应的十进制数:%d\n", translate(num)); return 0; } int translate(char num[5]) { int temp[4];//num[5]最后一个为'\0' int i,sum = 0; for (i = 0; num[i] != '\0'; i++)//i最大为4 if (num[i] >= '0' && num[i] <= '9')//字符0对应的ascii的十进制数为48 temp[i] = num[i] - 48; else { switch (num[i]) { case 'a': case 'A': temp[i] = 10; break; case 'b': case 'B': temp[i] = 11; break; case 'c': case 'C': temp[i] = 12; break; case 'd': case 'D': temp[i] = 13; case 'e': case 'E': temp[i] = 14; break; case 'f': case 'F': temp[i] = 15; break; } } for (int j = 0; j < i; j++) sum += temp[j] * pow(16, i - j - 1); return sum; } //17. int main() { void translate(int n); int num; printf("输入一个的十进制数\n"); scanf("%d", &num); translate(num); return 0; } void translate(int n) { if (n / 10 > 0) translate(n / 10); printf("%d",(char)(n % 10)); } //18. int main() { bool run(int year); int year, month, day; printf("输入年、月、日\n"); scanf("%d %d %d", &year, &month, &day); printf("第%d天\n", count(year, month, day)); return 0; } bool run(int year) { if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) return true; else return false; } int count(int year, int month, int day) { int run_day = 28; if (run(year)) run_day = 29; switch (month) { case 1: return day; case 2: return 31 + day; case 3: return 31 + run_day + day; case 4: return 31 + run_day + 31 + day; case 5: return 31 + run_day + 31 + 30 + day; case 6: return 31 + run_day + 31 + 30 + 31 + day; case 7: return 31 + run_day + 31 + 30 + 31 + 30 + day; case 8: return 31 + run_day + 31 + 30 + 31 + 30 + 31 + day; case 9: return 31 + run_day + 31 + 30 + 31 + 30 + 31 + 30 + day; case 10: return 31 + run_day + 31 + 30 + 31 + 30 + 31 + 30 + 31 + day; case 11: return 31 + run_day + 31 + 30 + 31 + 30 + 31 + 30 + 31 + 30 + day; case 12: return 31 + run_day + 31 + 30 + 31 + 30 + 31 + 30 + 31 + 30 + 31 + day; } }

17题思路

标签:

C程序设计(第5版)——谭浩强(1)由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C程序设计(第5版)——谭浩强(1)