当前位置: 首页 > news >正文

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

  2. 变量

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

  4. 标识符

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题思路
在这里插入图片描述

相关文章:

  • lazarus 从资源文件中加载PNG图片
  • 【SpringBoot】深度解析 Spring Boot 拦截器:实现统一功能处理的关键路径
  • 跟着李沐老师学习深度学习(十)
  • LabVIEW开发CANopen的TPDO数据读取
  • IDEA集成DeepSeek
  • [特殊字符] 用Rust重塑Web开发速度极限:Hyperlane框架——开启高性能服务的「光年时代」[特殊字符]
  • 模型GPU->NPU(Ascend)迁移训练简述
  • 为AI聊天工具添加一个知识系统 之106 详细设计之47 Lattice
  • 【第13章:自监督学习与少样本学习—13.2 少样本学习(FSL)与元学习(Meta-Learning)的基础理论与应用案例】
  • 善筹网设计与实现(代码+数据库+LW)
  • CI/CD(二)docker-compose安装Jenkins
  • 栈的深度解析:从基础实现到高级算法应用——C++实现与实战指南
  • Java里int和Integer的区别?
  • 【第10章:自然语言处理高级应用—10.4 NLP领域的前沿技术与未来趋势】
  • 基于SpringBoot的医院药房管理系统【源码+答辩PPT++项目部署】高质量论文1-1.5W字
  • 掌握SQLite_轻量级数据库的全面指南
  • python的类装饰器
  • 前端与后端的对接事宜、注意事项
  • FRRouting配置与OSPF介绍,配置,命令,bfd算法:
  • SpringBoot+数据可视化的奶茶点单购物平台(程序+论文+讲解+安装+调试+售后)
  • 上海杨浦:优秀“博主”购房最高可获200万补贴
  • 明明睡够了,怎么还有黑眼圈?可能是身体在求救
  • 纪念|古文字学泰斗裘锡圭:“还有很多事情要做”
  • 中国海警依法驱离日非法进入我钓鱼岛领海船只
  • 中国证监会印发《推动公募基金高质量发展行动方案》
  • 苏丹宣布与阿联酋断交