C程序设计(第5版)——谭浩强(1)
参考:https://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题思路