谭浩强c语言课后习题(更新中)

1.第三章

在这里插入图片描述
纯代公式题

#include<stdio.h>

int main()
{
	float p=1.07; //第一年倍数
	for (int i = 1; i < 10; i++) //只用循环了9次,因为是从第一年开始
	{
		p = p * 1.07;
	}
	printf("%f%%%",p*100);
}

第2题也是代进公式即可
在这里插入图片描述
其实也是代给出的公式,这里我们不用公式换个思路思考

#include<stdio.h>

int main()
{
	float d = 300000, p = 6000, r = 0.01;
	int month = 1; //从第一个月开始,用于计数
	for (int i = 0; d => 0; i++) //换到d小于等于0后就结束循环
	{
		d = (d - p) * (1 + r); //欠的钱每个月都会减p元又会加上减去p后计算的利息
		printf("%f\n",d);
		month++;
	}
	printf("%d",month);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这一题scanf语句中的第二个a应为x
在这里插入图片描述
在这里插入图片描述
char与int之间存在着十分灵活的变换

#include<stdio.h>

int main()
{
	char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';
	c1 += 4;
	putchar(c1);
	c2 += 4;
	putchar(c2);
	c3 += 4;
	putchar(c3);
	c4 += 4;
	putchar(c4);
	c5 += 4;
	putchar(c5);
	printf("%c%c%c%c%c\n",c1,c2,c3,c4,c5);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	float r = 1.5, h = 3;
	float pi = 3.14;
	printf("圆的周长:%.2f\n", 2 * pi * r);
	printf("圆的面积:%.2f\n", pi * r * r);
	printf("球的面积:%.2f\n", 4 * pi * r * r);
	printf("球的体积:%.2f\n", (4.0 / 3.0) * pi * r * r * r);
	printf("圆柱的体积:%.2f\n", pi * r * r * h);
}

在这里插入图片描述
int和char不是无条件替换,仅仅限于在ASCII码中的int。无法识别的int会使用‘?’代替。

2.第四章

在这里插入图片描述
1.0
2.1
3.1
4.0
5.1
在这里插入图片描述

#include<stdio.h>

int main()
{
	int a, b, c, t;
	scanf("%d %d %d",&a,&b,&c);
	if (a > b) //用一个中间变量来装第一次较大的数
	{
		t = a;
	}
	else
	{
		t = b;
	}
	if (t > c)
	{
		printf("%d",t);
	}
	else
	{
		printf("%d", c);
	}
}

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	float a;
	scanf("%f",&a);
	if (a >= 1000) //可以用while要求输入正确为止
	{
		scanf("%f",&a);
	}
	printf("%.0f\n",sqrt(a));
	//下面这种方式会彻底忽略小数部分
	int x = sqrt(a);
	printf("%d\n",x);
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	int x, y;
	scanf("%d", &x);
	if (x < 10)
	{
		if (x >= 1)
		{
			y = 2 * x - 1;
		}
		else
		{
			y = x;
		}
	}
	else
	{
		y = 3 * x - 11;
	}
	printf("%d",y);
}

第7题注意if中嵌套if不带花括号下面的else会实行就近原则即可,两个都不符合。

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	int a;
	char c;
	scanf("%d",&a);
	if (a >= 90)
	{
		c = 'A';
	}
	if (a >= 80 && a < 90)
	{
		c = 'B';
	}
	if (a >= 70 && a < 80)
	{
		c = 'C';
	}
	if (a >= 60 && a < 70)
	{
		c = 'D';
	}
	if (a < 60)
	{
		c = 'E';
	}
	printf("%c",c);
}

在这里插入图片描述
不用循环写就用if判断a是否大于10000,大于1000,大于100,大于10,小于10来判断位数(别忘了还要有下限),

#include<stdio.h>
#include<math.h>

int main()
{
	int a, n, count=0;
	int b[10];
	scanf("%d",&a);
	for (int i = 1; i <= 10000; i *= 10) //计算数字的位数
	{
		if (a > i)
		{
			count++;
		}
	}
	printf("该数字为%d位数\n",count);
	for (int j = 0; j < count; j++) //求出每一位数字
	{
		n = a % 10; //对10求余可以得到每次的最后一位数字
		a = a / 10; //得到最后一位数字可以对a除10来去掉
		b[j] = n;
	}
	for (int z = 0, m=count-1; z < count; z++,m--) //因为上一个for中每次我们得到的是最后一位的数字
	{
		printf("第%d位数字为:%d\n",z+1, b[m]); //所以数组中的数字是反着放的
		if (z == count - 1)
		{
			for (int q = 0; q < count; q++)
				printf("%d",b[q]);
		}
	}

第10题思路和第8题一样
第11题使用冒泡排序法

#include<stdio.h>

int main()
{
	int a,b[10],t;
	for (int i = 0; i < 4; i++)
	{
		printf("请输入第%d个数字:",i+1);
		scanf("%d",&a);
		b[i] = a;
	}
	for (int n = 0; n < 3; n++) //一共只循环数字个数-1次,
	{
		for (int j = 0; j < 3; j++) //每一次的循环要比较数字个数-1次
		{
			if (b[j] > b[j + 1]) //如果后面的数字大于前面的数字则交换顺序
			{
				t = b[j + 1];
				b[j + 1] = b[j];
				b[j] = t;
			}
		}
	}
	for (int z = 0; z < 4; z++)
	{
		printf("%d",b[z]);
	}
}


在这里插入图片描述
转换为求一个点到这四个圆圆心的距离问题,小于1则是在园内,大于1则是在园外。其实不需要判断输入的点在哪个象限,因为这四个圆的对称性,我们只需要把点都变成第一象限的点,这个点到第一象限圆的距离和到其他象限圆的距离是一样的。

#include<stdio.h>
#include<math.h>

int main()
{
	double x, y, len, x1 = 2, y1 = 2;
	scanf("%lf %lf",&x,&y);
	if (x < 0)
	{
		x = -x;
	}
	if (y < 0)
	{
		y = -y;
	}
	len = sqrt((x1 - x) * (x1 - x) + (y1 - y) * (y1 - y));
	if (len <= 1)
	{
		printf("10");
	}
	else
	{
		printf("0");
	}
}


3.第五章

在这里插入图片描述
穷举法

#include<stdio.h>

int main()
{
	int m,n,t=0,d1,d2;
	scanf("%d %d", &m, &n);
	if (m < n) d1 = m, d2 = n;
	else d1 = n, d2 = m; //分出最大最小数有利于减少循环次数
	for (int i = 1; i <= d1; i++) //循环到m,n中最小数即可
	{
		if (m % i == 0 && n % i == 0 && i > t)
		{
			t = i;
		}
	}
	printf("最大公约数为:%d\n", t);
	for (int j = m;; j++) //从m,n中最大数开始循环即可
	{
		if (j % m ==0 && j % n == 0)
		{
			t = j;
			break;
		}
	}
	printf("最小公倍数为:%d", t);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	char a[100], * p = a, t;
	int q=0, m=0, n=0, l=0;
	gets(a);
	for (int i = 0; *p != '\0'; i++, p++)
	{
		t = *p;
		if ((t >= 65 && t <= 90) || (t >= 97 && t <= 122))
		{
			q++;
		}
		else if (t == 32)
		{
			m++;
		}
		else if (t >= 48 && t <= 57)
		{
			n++;
		}
		else
		{
			l++;
		}
	}
	printf("英文字母有%d个\n", q);
	printf("空格有%d个\n", m);
	printf("数字有%d个\n", n);
	printf("其他字符有%d个\n", l);
}

在这里插入图片描述
只要写出1+11+111就能写出n+nn+nnn,11=1+10,111=1+10+100,1111=1+10+100+1000

#include<stdio.h>

int main()
{
	int n, sum = 2;
	int a = 1, b = 1;
	scanf("%d",&n);
	for (int i = 0; i < n-1; i++)
	{
		a *= 10;
		b += a;
		sum += (b * 2);

		printf("%d\n",sum);
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	int sum = 0,t=1;
	for (int i = 1; i <= 20; i++)
	{
		t = 1; //不要忘记每开始一个数字要重置t
		for (int j = 1; j <= i; j++) 
		{
			//这里不可令j*=j,因为j在for中语句执行后会再自增1
			t = t * j;
			printf("%d\n", t);
		}
		sum += t;
	}
	printf("%d", sum);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	float sum = 0;
	float b;
	int a;
	for (int i = 1; i <= 100; i++)
	{
		a = i * i;
		b = 1.0 / i;
		if (i > 50)
		{
			a = 0;
		}
		if (a > 10)
		{
			b = 0;
		}
		sum += i + a + b;
	}
	printf("%f",sum);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	int m, n, l;
	for (int i = 100; i < 1000; i++)
	{
		m = i / 100;
		n = i / 10 % 10;
		l = i % 100 % 10;
		if (i == m * m * m + n * n * n + l * l * l)
		{
			printf("%d\n", i);
		}
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	for (int i = 2; i <= 1000; i++)
	{
		int  sum = 0;
		for (int j = 1; j <= i / 2; j++)
		{
			if (i % j == 0)
			{
				sum += j;
			}
		}
		if (sum == i)
		{
			printf("%d its factors are ",sum);
			for (int j = 1; j <= i / 2; j++)
			{
				if (i % j == 0 && j != i/2)
				{
					printf("%d, ",j);
				}
				else if(i % j == 0 && j == i / 2)
				{
					printf("%d", j);
				}
			}
			printf("\n");
		}
	}
}

在这里插入图片描述
在这里插入图片描述
注意循环的次数,当i=1时sum为2/1,当i=2时,sum=2/1+3/2,所以20项的和要进行20次循环

#include<stdio.h>

int main()
{
	float a = 1, b = 2, sum = 0, t;
	for (int i = 1; i <= 20; i++)
	{
		sum += b / a;
		t = b;
		b = a + b;
		a = t;
	}
	printf("%f",sum);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	float sum = 100, h = 100, t;
	for (int i = 0; i < 9; i++)
	{
		t = h / 2; //每次回弹上一次h一半的距离
		h = h - t; //每次离地面的距离为h-t
		sum += 2 * t; //落下和弹起的距离一样
	}
	printf("%f",sum);


从后向前推,前一天的总数等于后一天的桃子+1个再*2,注意只吃了9天

#include<stdio.h>

int main()
{
	int a=1;
	for (int i = 0; i < 9; i++)
	{
		a = (a + 1) * 2;
	}
	printf("%d",a);
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	double a, x0, x1;
	scanf("%lf",&a);
	x0 = a / 2;
	x1 = 2 * (x0 + a / x0);
	for (int i = 0; fabs(x0 - x1) >= 1e-5; i++)
	{
		x0 = x1;
		x1 = (x0 + a / x0) / 2;
	}
	printf("%lf",x0);
}

在这里插入图片描述
在这里插入图片描述
代入公式即可
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<math.h>

float a3, a2, a1, a0;
float fx(float m) {
    float n;
    n = a3 * m * m * m + a2 * m * m + a1 * m + a0;
    return n;
}

int main() {
    float a, b;
    float y1, y2, mid;
    int flag=0;
    scanf("%f %f %f %f", &a3, &a2, &a1, &a0);
    scanf("%f %f", &a, &b);
    y1 = fx(a);
    y2 = fx(b);
    if (y1 * y2 < 0)
    {
        while (fabs(a-b)>=0.01)
        {
            mid = fx((a + b) / 2);
            if (mid == 0)
            {
                printf("%.2f", (a + b) / 2);
                flag = 1;
                break;
            }
            else
            {
                if (mid * y1 > 0)
                {
                    a = (a + b) / 2;
                }
                if (mid * y2 > 0)
                {
                    b = (a + b) / 2;
                }
            }
            y1 = fx(a);
            y2 = fx(b);
        }
    }
    else if (y1 * y2 == 0)
    {
        flag = 1;
        if (y1 = 0)printf("%.2f",a);
        else printf("%.2f", b);
    }
    if (flag != 1)
    {
        printf("%.2f", (a + b) / 2);
    }
}



在这里插入图片描述
纯用循环写,n只能输入奇数。然后中间最长的只能有一行,所以第二个循环初始数i会比n少2

#include<stdio.h>
#include<math.h>

int main()
{
	int n;
	scanf("%d",&n);
	int t = n / 2; //t用于控制输出空格
	for (int i = 1; i <= n; i += 2) //输出上面的大三角形
	{
		for (int z = t; z > 0; z--)
		{
			printf(" ");
		}
		for (int j = 1; j <= i; j++)
		{
			printf("*");
		}
		printf("\n");
		t--;
	}
	t = 1;
	for (int i = n - 2; i > 0; i -= 2) //输出下面的小三角
	{
		for (int z = 1; z <= t; z++)
		{
			printf(" ");
		}
		for (int j = i; j > 0; j--)
		{
			printf("*");
		}
		printf("\n");
		t++;
	}
}

在这里插入图片描述
先通过下面的例子了解更清晰的思路,穷举法一力降十会

#include<stdio.h>

int main()
{
	int x = 0, y = 1, z = 2;
	int a, b, c;
	for (a = 0; a <= 2; a++)
	{
		for (b = 0; b <= 2; b++)
		{
			for (c = 0; c <= 2; c++)
			{
				if (a != 0 && c != 0 && c != 2 && a != b && a != c && b != c)
				{
					printf("A和%d B和%d C和%d",a,b,c);
				}
			}
		}
	}
}

然后我们会发现把xzy用字符表示,abc定义为字符型,每个循环令a = X,结束为<=Z,这样就更方便输出了

3.第六章

在这里插入图片描述

#include<stdio.h>
/*筛选法:准备一个自然排序的数列,1不是素数,划去;
2是素数,留下,将2的倍数划去;
3没被划去,将3的倍数划去;
以此类推,将i的倍数划去;
留下的就是素数;这里划去我们用标0来实现*/

int main()
{
	int a[100];
	for (int i = 0; i < 100; i++) //准备有序数组
	{
		a[i] = i + 1;
	}
	a[0] = 0; //1不是素数
	for (int i = 0; i < 100; i++)
	{
		if (a[i] != 0) //由于能整除2的数会被变为0,0整除其他的数也是0
		{
			for (int j = i + 1; j < 100; j++) //a[i]后的数能整除a[i]就置0
			{
				if (a[j] % a[i] == 0)
				{
					a[j] = 0;
				}
			}
		}
	}
	for (int i = 0; i < 100; i++)
	{
		if (a[i] != 0)
		{
			printf("%d\n",a[i]);
		}
	}
}

在这里插入图片描述

#include<stdio.h>

int a[10], b, size = 10;
int main()
{
	//srand(10);
	int x;
	void upper();
	void lower();
	for (int i = 0; i < size; i++)
	{
		//随机生成20以内的整数
		int x = rand()%20;
		a[i] = x;
		printf("%d ", x);
	}
	printf("\n");
	printf("选择实现的功能(1.升序 2.降序): ");
	scanf("%d", &x);
	printf("\n");
	switch (x)
	{
	case 1:upper(); break;
	case 2:lower(); break;
	}

	for (int i = 0; i < size; i++)
	{
		printf("%d ",a[i]);
	}
}

void upper()
{

	for (int j = 0; j < size; j++)
	{
		int t = 0; //每次从数组的第一个元素开始比较
		for (int i = 1; i < size - j; i++)
		{
			//通过一个循环找到每次数组最大元素下标
			//注意每一次的内循环要比上一次少1,因为不用比较
			//上一次交换到最后位置的最大数
			if (a[i] > a[t])
			{
				t = i;
			}
		}
		//实现交换,同样注意下标,不要影响到上一次循环已经交换好的值
		b = a[size - j - 1];
		a[size - j - 1] = a[t];
		a[t] = b;
	}
}

void lower()
{

	for (int j = 0; j < size; j++)
	{
		int t = 0; //每次从数组的第一个元素开始比较
		for (int i = 1; i < size - j; i++)
		{
			//通过一个循环找到每次数组最小元素下标
			//注意每一次的内循环要比上一次少1,因为不用比较
			//上一次交换到最后位置的最小数
			if (a[i] < a[t])
			{
				t = i;
			}
		}
		//实现交换,同样注意下标,不要影响到上一次循环已经交换好的值
		b = a[size - j - 1];
		a[size - j - 1] = a[t];
		a[t] = b;
	}
}

在这里插入图片描述

#include<stdio.h>


int main()
{
	int a[3][3], t = 1, sum = 0;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			a[i][j] = t++;
		}
	}
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (i == j)
			{
				sum += a[i][j];
			}
		}
	}
	printf("%d",sum);
}

在这里插入图片描述

#include<stdio.h>
//在升序的数组中插入

int main()
{
	int a[100] = { 2,4,6,8,10,12,14 };
	int n = 9, t, f;
	for (int i = 0; i < 7; i++) //找到要插入的位置
	{
		if (a[i] > n)
		{
			t = i;
			break;
		}
	}
	for (int i = 7 + 1; i > t; i--) //从后面开始遍历将前一个数字放到后一个中
	{
		a[i] = a[i - 1];
	}
	a[t] = n; //插入数字
	for (int i = 0; i < 8; i++)
	{
		printf("%d ",a[i]);
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	int a[10] = { 8, 6, 5, 4, 1 };
	//int a[10] = { 1,4,5,6,8 };
	if (a[0] > a[1])
	{
		for (int i = 0; i < 5; i++)
		{
			int flag = a[0], t = 0, f = 0;
			for (int j = 0; j < 5 - i; j++)
			{
				if (a[j] > flag)
				{
					flag = a[j];
					f = j;
				}
				if (j == 5 - i - 1)
				{
					t = a[j];
					a[j] = flag;
					a[f] = t;
				}
			}
		}
	}
	else
	{
		for (int i = 0; i < 5; i++)
		{
			int flag = a[0], t = 0, f = 0;
			for (int j = 0; j < 5 - i; j++)
			{
				if (a[j] < flag)
				{
					flag = a[j];
					f = j;
				}
				if (j == 5 - i - 1)
				{
					t = a[j];
					a[j] = flag;
					a[f] = t;
				}
			}
		}
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%d ",a[i]);
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	int a[10][10];
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < i + 1; j++)
		{
			//可以观察出第一列和对角线都是1
			if (j == 0 || i == j)
			{
				a[i][j] = 1;
			}
			//其他位置上的数等于该数上一行的数+该数左边一列上一行的数
			//不用担心越界,因为第一第二行都满足if中的条件
			else
			{
				a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
			}
		}
	}
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < i + 1; j++)
		{
			printf("%5d",a[i][j]);
		}
		printf("\n");
	}
}

在这里插入图片描述
由于魔方阵有奇魔方阵,偶魔方阵,奇偶魔方阵,之后再补。
在这里插入图片描述
在该列最小,数组可能没有鞍点

#include<stdio.h>

int main()
{
	int a[3][3] = { {7,8,9},{1,2,3},{4,5,6} };
	int flag = 0, f;
	for (int i = 0; i < 3; i++)
	{
		//有多少行外层循环就有多少次
		int temp = a[i][0], t = 0;
		for (int j = 1; j < 3; j++)
		{
			//找到每一行的最大的值,有多少列就循环多少次
			if (a[i][j] > temp)
			{
				//记录该行的最大值和行号
				temp = a[i][j];
				t = j;
			}
		}
		for (int z = 0; z < 3; z++)
		{
			//比较行上最大值这一列上的值,看是否为列上最小
			if (a[z][t] < temp)
			{
				break;
			}
			//f用于看是否能遍历到最后一行也发现不了小于temp的值
			f = z;
		}
		//遍历到最后一行也没发现这一列上小于temp的值,说明temp为鞍点
		if (f == 2)
		{
			printf("%d", temp);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("该数组没有鞍点");
	}
}

在这里插入图片描述

#include<stdio.h>
# define N 15

int main()
{
	int a[N], t = 15;
	for (int i = 0; i < 15; i++)
	{
		a[i] = t--;
	}
	for (int i = 0; i < 15; i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	int x, f = 0, b = N, mid, flag = 0;
	scanf("%d", &x);
	//二分法,循环次数为数组长度能除多少次2再+1
	for (int i = 0; i < 4; i++)
	{
		mid = (f + b) / 2;
		if (x < a[mid])
		{
			f = mid;
		}
		else if (x > a[mid])
		{
			b = mid;
		}
		else if (x == a[mid])
		{
			printf("数字位置为:%d", mid);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("该数字不在数组中!");
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	for (int i = 0; i < 5; i++)
	{	
		for (int j = 0; j < i; j++)
		{
			printf(" ");
		}
		printf("* * * * *");
		printf("\n");
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	char a[100];
	scanf("%s", a);
	for (int i = 1; a[i - 1] != '\0'; i++)
	{
		if (a[i - 1] >= 65 && a[i - 1] <= 90)
		{
			a[i - 1] = 90 - i + 1;
		}
		else if(a[i - 1] >= 97 && a[i - 1] <= 122)
		{
			a[i - 1] = 122 - i + 1;
		}
		printf("%c", a[i - 1]);
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	char a[10] = { '\0' }, b[10] = { '\0' }, c[20] = { '\0' };
	int i, j, z;
	scanf("%s", a);
	scanf("%s", b);
	for (i = 0; a[i] != '\0'; i++)
	{
		c[i] = a[i];
	}
	for (j = i,z = 0; b[z] != '\0'; j++, z++)
	{
		c[j] = b[z];
	}
	printf("%s", c);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	char a[10] = { '\0' }, b[10] = { '\0' };
	int i, flag = 0;
	scanf("%s", a);
	scanf("%s", b);
	for (i = 0; a[i] != 0 && b[i] != 0; i++)
	{
		if (a[i] > b[i])
		{
			flag = 1;
			printf("%d", a[i] - b[i]);
			break;
		}
		else if (a[i] < b[i])
		{
			flag = 1;
			printf("%d", -(b[i] - a[i]));
			break;
		}
	}
	if (flag == 0)
	{
		printf("0");
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	char a[20] = { '\0' }, b[10] = { '\0' };
	int i, flag = 0;
	gets(b);
	for (i = 0; b[i] != '\0'; i++)
	{
		a[i] = b[i];
	}
	a[i] = '\0';
	puts(a);
}

4.第七章

在这里插入图片描述

#include<stdio.h>

int main()
{
	int x, y;
	void f1(int, int);
	void f2(int, int);
	scanf("%d %d",&x, &y);
	f1(x, y);
	f2(x, y);
}

//求最大公约数
void f1(int m, int n)
{
	int t = 0;
	if (n > m)
	{
		t = m;
		m = n;
		n = t;
	}
	
	for (int i = 1; i <= n; i++)
	{
		if (m % i == 0 && n % i == 0)
		{
			t = i;
		}
	}
	printf("最小公约数为:%d\n", t);
}

//求最大公倍数
void f2(int m, int n)
{
	int t;
	if (n > m)
	{
		t = m;
		m = n;
		n = t;
	}
	for (int i = m;;i++)
	{
		if (i % m == 0 && i % n == 0)
		{
			printf("最大公倍数为:%d", i);
			break;
		}
	}
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	float a, b, c, t;
	void f1(float, float);
	void f2(float, float, float, float);
	void f3();

	scanf("%f %f %f", &a,&b,&c);
	t = b * b - 4 * a * c;
	if (t == 0)
	{
		f1(a, b);
	}
	else if (t > 0)
	{
		f2(a, b, c, t);
	}
	else
	{
		f3();
	}
}

void f1(float m, float n)
{
	printf("方程的根为:%f", -n / (2 * m));
}

void f2(float m, float n, float p, float q)
{
	float x1, x2;
	x1 = (-n + sqrtf(q)) / (2 * m);
	x2 = (-n - sqrtf(q)) / (2 * m);
	printf("方程的根为:%f %f", x1, x2);
}

void f3()
{
	printf("方程无解");
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	int x;
	scanf("%d", &x);
	void f1(int);
	f1(x);
}

void f1(int m)
{
	int flag = 0;
	for (int i = 2; i < m; i++)
	{
		if (i % m == 0)
		{
			flag = 1;
			printf("该数不是素数!");
			break;
		}
	}
	if (flag == 0)
	{
		printf("该数是素数!");
	}
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	int a[3][3], t = 1;
	void f1(int);
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			a[i][j] = t++;
		}
	}
	f1(a);
}

void f1(int a[3][3])
{
	int t;
	for (int i = 0; i < 3; i++)
	{
		for (int j = i; j < 3; j++)
		{
			t = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = t;
		}
	}

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d", a[i][j]);
		}
		printf("\n");
	}
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	void f1(char);
	char a[10] = {'\0'};
	scanf("%s", a);
	f1(a);
	printf("%s", a);
}

void f1(char b[10])
{
	int t = 0, temp;
	for (int i = 0; b[i] != 0; i++)
	{
		t++;
	}
	for (int j = 0; j < t / 2; j++)
	{
		temp = b[j];
		b[j] = b[t - 1 - j];
		b[t - 1 - j] = temp;
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	void f1(char, char);
	char a[20] = {'\0'}, b[10] = { '\0' };
	scanf("%s %s", a, b);
	f1(a, b);
	printf("%s", a);
}

void f1(char x[20], char y[10])
{
	int t = 0, i, j, z;
	for (i = 0; x[i] != '\0'; i++)
	{
		t++;
	}
	for (j = t, z = 0; y[z] != '\0'; j++, z++)
	{
		x[j] = y[z];
	}
	x[j] = '\0';
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	int f1(char);
	void f2(char, char, int);
	char a[100] = {'\0'}, b[10] = { '\0' };
	int t = 0;
	scanf("%s %s", a, b);
	for (int i = 0; a[i] != '\0'; i++)
	{
		//统计a的长度
		t++;
	}
	for (int i = 0; b[i] != '\0'; i++)
	{
		int flag = f1(b[i]);
		//如果是元音f1会返回1.反之为0
		if (flag == 1)
		{
			//是元音则实行f2
			f2(a, b[i], t);
			t++;
		}
	}
	f1(a, b);
	printf("%s", a);
}

int f1(char x)
{
	//判断是否为元音
	if (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u')
		return 1;
	else
		return 0;
}

void f2(char x[20], char y, int f)
{
	//将元音插入a中t的位置
	x[f] = y;
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	void f1();
	char a[10] = {'\0'};
	scanf("%s", a);
	for (int i = 0; a[i]!='\0'; i++)
	{
		printf("%c", a[i]);
		f1();
	}
}

void f1()
{
	printf(" ");
}

在这里插入图片描述

#include<stdio.h>

int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
int main()
{
	void f1(char);
	char a[100] = {'\0'};
	gets(a);
	f1(a);
	printf("字母个数为:%d\n", sum1);
	printf("数字个数为:%d\n", sum2);
	printf("空格个数为:%d\n", sum3);
	printf("其他字符个数为:%d\n", sum4);
}

void f1(char x[100])
{
	for (int i = 0; x[i] != '\0'; i++)
	{
		if ((x[i] >= 'a' && x[i] <= 'z') || (x[i] >= 'A' && x[i] <= 'Z'))
			sum1++;
		else if (x[i] >= '0' && x[i] <= '9')
			sum2++;
		else if (x[i] == ' ')
			sum3++;
		else
			sum4++;
	}
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>

int main()
{
	void f1(char, char);
	char a[100] = { 0 };
	char b[100] = { 0 };
	gets(a);
	f1(a, b);
	puts(b);
}

void f1(char x[], char y[])
{
	int len = 0, i = 0, j = 0;
	//思路是:假设有“i am fine”我们要做的就是统计空格之前
	//的长度,使用i和j来当单词的开头下标和结束下标。
	while(x[i] != '\0')
	{
		//每次循环开始时j都会等于i的位置
		j = i;
		//然后就可以统计j过了多少个字符到下一个空格
		//值得注意的是如果到了最后一个单词的结尾,如果不加上x[j]!='\0',它会继续向后找空格
		while (x[j] != ' ' && x[j] != '\0')
			j++;
		//这个单词的长度就是j - i
		len = j - i;
		//统计出此时y中的字符长度
		int t = 0;
		while (y[t] != '\0')
			t++;
		//如果此时我们找的单词比之前的y中的要长就替换掉
		if (len > t)
		{
			strncpy(y, x+i, len);
		}
		//此时的j还在空格处,我们继续推进j和i到下一个单词的开头
		j++;
		i = j;
	}
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	void f1(char);
	char a[100] = {'\0'};
	scanf("%s", a);
	f1(a);
	for (int i = 0; a[i]!='\0'; i++)
	{
		printf("%c", a[i]);
	}
}

void f1(char x[])
{
	for (int i = 0; x[i] !='\0'; i++)
	{
		char t;
		for (int j = i; x[j] !='\0'; j++)
		{
			if (x[i] < x[j])
			{
				t = x[j];
				x[j] = x[i];
				x[i] = t;
			}
		}
	}
}

在这里插入图片描述
先百度出牛顿迭代法的公式,然后根据公式来迭代

#include<stdio.h>
#include<math.h>

int main()
{
	double f1(double, double, double, double);
	double a, b, c, d;
	scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
	double result = f1(a, b, c, d);
	printf("%lf", result);
}

double f1(double m, double n, double p, double q)
{
	double x = 1, x1, f, f1;
	x1 = x;
	f = m * pow(x1, 3) + n * pow(x1, 2) + p * x1 + q;
	f1 = 3 * m * pow(x1, 2) + 2 * n * x1 + p;
	x = x1 - f / f1;
	for (int i = 0; fabs(x - x1) >= 1e-5; i++)
	{
		x1 = x;
		f = m * pow(x1, 3) + n * pow(x1, 2) + p * x1 + q;
		f1 = 3 * m * pow(x1, 2) + 2 * n * x1 + p;
		x = x1 - f / f1;
	}
	return x;
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	double f1(double, double);
	double x, n;
	scanf("%lf %lf",&x,&n);
	double result = f1(x, n);
	printf("%lf", result);
}

double f1(double x, double n)
{
	if (n == 0)
		return 1;
	else if (n == 1)
		return x;
	else
		return ((2 * n - 1) * x - f1(x, n - 1) - (n - 1) * f1(x, n - 2)) / n;
}

在这里插入图片描述

#include<stdio.h>
//根据这里来控制表格的行宽和列宽
#define N 2
#define M 2


double a[M][N] = { 0 };
double stu_avg_score[M] = { 0 }; //方便计算方差
int main()
{
	void import();	//用于输入成绩
	void show();	//用于展示成绩
	void avge_stu();	//用于计算学生成绩
	void avge_lesson();	//用于计算课程平均成绩
	void max();	//用于输出最大成绩
	void expect();	//用于计算方差
	int select;
	printf("1.输入成绩\n");
	printf("2.输出成绩\n");
	printf("3.计算每个学生平均分\n");
	printf("4.计算每门课平均分\n");
	printf("5.计算最高分\n");
	printf("6.计算平均方差\n");
	printf("0.结束\n");
	printf("选择想要实现的功能:");
	scanf("%d", &select);
	while (select != 0)
	{
		system("cls");
		switch (select)
		{
			case 1: import(); break;
			case 2:	show(); break;
			case 3:	avge_stu(); break;
			case 4:	avge_lesson(); break;
			case 5:	max(); break;
			case 6:	expect(); break;
			case 0: break;
		}
	}
}


void import()
{
	for (int i = 0; i < M; i++)
	{
		printf("输入第%d位学生的成绩:\n", i + 1);
		for (int j = 0; j < N; j++)
		{
			printf("第%d门课:", j + 1);
			scanf("%lf", &a[i][j]);
		}
	}
	system("pause");
	system("cls");
}

void show()
{
	for (int i = 0; i < M; i++)
	{
		printf("第%d位学生的成绩为:\n", i + 1);
		for (int j = 0; j < N; j++)
		{
			printf("第%d门:%lf\n", j + 1, a[i][j]);
		}
	}
	system("pause");
	system("cls");
}

void avge_stu()
{
	for (int i = 0; i < M; i++)
	{
		double sum = 0;
		for (int j = 0; j < N; j++)
		{
			sum += a[i][j];
			if (j == 1)
			{
				printf("第%d位学生的平均分为:%lf\n", i + 1, sum / 2);
			}
		}
	}
	system("pause");
	system("cls");
}

void avge_lesson()
{
	for (int i = 0; i < M; i++)
	{
		double sum = 0;
		for (int j = 0; j < N; j++)
		{
			sum += a[j][i];
			if (j == 1)
				printf("第%d门的课的平均分为:%lf\n", i + 1, sum / 2);
		}
	}
	system("pause");
	system("cls");
}

void max()
{
	double max = 0;
	int col, row;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (a[i][j] > max)
			{
				max = a[i][j];
				col = j;
				row = i;
			}
		}
	}
	printf("第%d位学生的第%d门成绩最高,为:%lf\n", row + 1, col + 1, max);
	system("pause");
	system("cls");
}

void expect()
{
	double sum_avg_score = 0, sum_avg_score_sqr = 0, exp;
	for (int i = 0; i < M; i++)
	{
		double sum = 0;
		for (int j = 0; j < N; j++)
		{
			sum += a[i][j];
			if (j == 1)
			{
				stu_avg_score[i] = sum / 2;
			}
		}
	}
	for (int i = 0; i < M; i++)
	{
		sum_avg_score += stu_avg_score[i];
		sum_avg_score_sqr += (stu_avg_score[i] * stu_avg_score[i]);
	}
	exp = (sum_avg_score_sqr / 2) - (sum_avg_score / 2) * (sum_avg_score / 2);
	printf("%lf\n", exp);
	system("pause");
	system("cls");
}

在这里插入图片描述
和上一题大同小异

在这里插入图片描述

#include<stdio.h>
#include<math.h>
#include<string.h>

int main()
{
	void transfer(char a[]);
	char a[100] = {'\0'};
	scanf("%s", a);
	strupr(a);
	transfer(a);
}

void transfer(char a[])
{
	int t = 0, sum = 0;
	int b[100];
	for (int i = 0; a[i] != '\0'; i++)
	{
		b[i] = a[i];
		t++;
	}
	for (int i = t - 1, j = 0; i >= 0; i--, j++)
	{
		if (b[i] >= 48 && b[i] < 58)
		{
			b[i] = pow(16, j) * (b[i] - 48);
		}
		else if (b[i] >= 65 && b[i] <= 90)
		{
			b[i] = pow(16, j) * (b[i] - 55);
		}
		sum += b[i];
	}
	printf("%d\n", sum);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	void transfer(int, char a[]);
	char a[100] = { '\0' };
	int x;
	scanf("%d", &x);
	transfer(x, a);
}

void transfer(int x, char a[])
{
	int t = 0, i = 0, temp = x;
	//统计数字的位数
	while (temp != 0)
	{
		temp /= 10;
		i++;
	}
	//将数字转换为对应字符的ascii码值,要逆序放入数组中
	for (i--; i >= 0; i--)
	{
		t = x % 10;
		x /= 10;
		a[i] = t + 48;
	}
	puts(a);
}

在这里插入图片描述

#include<stdio.h>

int main()
{
	void f1(int, int ,int ,int month[]);
	int month[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int y, m, d;
	scanf("%d-%d-%d", &y, &m, &d);
	if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
	{
		month[1] = 29;
		f1(y, m, d, month);
	}
	else
	{
		month[1] = 28;
		f1(y, m, d, month);
	}
}

void f1(int y, int m, int d, int month[])
{
	int sum = 0;
	for (int i = 1; i < m; i++)
	{
		sum += month[i];
	}
	sum += d;
	printf("%d", sum);
}

5.第八章

在这里插入图片描述

#include<stdio.h>
#define N 3

int main()
{
	int a[N];
	int* p = a;
	int* p_a[N];
	for (int i = 0; i < N; i++)
	{
		scanf("%d", p);
		p_a[i] = p;
		p++;
	}
	//冒泡排序
	for (int i = 0; i < N - 1; i++)
	{
		int t;
		for (int j = i; j < N; j++)
		{
			if (*p_a[i] > *p_a[j])
			{
				t = *p_a[j];
				*p_a[j] = *p_a[i];
				*p_a[i] = t;
			}
		}
	}
	p = a; //初始化指针的位置
	for (int i = 0; i < N; i++)
	{
		printf("%d\n", *p);
		p++;
	}
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#define M 3
#define N 10

int main()
{
	char a[M][N] = {0};
	char* p[M];
	for (int i = 0; i < M; i++)
	{
		gets(a+i); //输入字符串
		p[i] = a + i;//记录每一行的地址
	}
	for (int i = 0; i < M; i++)
	{
		int flag;
		char *t;
		for (int j = i; j < M; j++)
		{
			flag = strcmp(a[i], a[j]);
			if (flag > 0)
			{
				//交换指针数组中指针变量的值(地址),是没有改变原数组的内容的
				t = p[j];
				p[j] = p[i];
				p[i] = t;
			}
		}
	}
	for (int i = 0; i < 3; i++)
	{
		printf("%s\n", p[i]);
	}
}

在这里插入图片描述

#include<stdio.h>
#define M 3
#define N 10

int main()
{
	void input(int a[]);
	void exchange(int a[]);
	void output(int a[]);
	int a[N];
	input(a);
	exchange(a);
	output(a);
}

void input(int a[])
{
	int* p = a;
	for (int i = 0; i < N; i++)
	{
		scanf("%d", p++);
	}
}

void exchange(int a[])
{
	int *t_min = a, *t_max = a, *p = a;
	for (int i = 0; i < 10; i++)
	{
		if (*p < *t_min)
		{
			t_min = p;
		}
		if (*p > *t_max)
		{
			t_max = p;
		}
		if (i == 9)
		{
			int temp = a[0], flag = a[9];
			a[0] = *t_min;
			*t_min = temp;
			a[9] = *t_max;
			*t_max = flag;
		}
		p++;
	}
}

void output(int a[])
{
	int* p = a;
	for (int i = 0; i < N; i++)
	{
		printf("%d\n", *(p++));
	}
}

在这里插入图片描述

#include<stdio.h>
#define M 3
#define N 10

int main()
{
	void f1(int x[], int n);
	//int a[N], m;
	int a[N] = { 0, 1,2,3,4,5,6,7,8,9 }, m;
	//for (int i = 0; i < N; i++)
	//{
	//	scanf("%d", a+i);
	//}
	scanf("%d", &m);
	f1(a, m);
	for (int i = 0; i < N; i++)
	{
		printf("%d\n", *(a+i));
	}
}

void f1(int x[],int n)
{
	for (int i = n; i > 0; i--)
	{
		int *t = x+i-1, *f = x+i+n-1, temp;
		temp = *t;
		*t = *f;
		*f = temp;
	}
}

在这里插入图片描述在这里插入图片描述

#include<stdio.h>
#define M 3
#define N 10

int main()
{
	//对每个学生进行编号
	int a[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int* p = a;
	//t为报数
	int sum = N, t = 0;
	for (int i = 0; sum > 1; i++)
	{
		//只要报数为3,就会将数组中的数变为0,变成0后就不能再使t增加
		//使用sum来控制循环结束,当只剩下最后一个人时就会结束
		if (*(p + i) != 0)
		{
			t++;
		}
		if (t == 3)
		{
			*(p + i) = 0;
			sum -= 1;
			t = 0;
		}
		if (i == N-1)
		{
			i = -1;
		}
	}
	for (int i = 0; i < N; i++)
	{
		if(*(p+i))
		printf("%d", *(p + i));
	}
}

在这里插入图片描述

#include<stdio.h>
#define M 3
#define N 10

int main()
{
	int sum(char a[]);
	char a[100];
	int result;
	gets(a);
	result = sum(a);
	printf("%d", result);
}

int sum(char x[])
{
	char* p = x;
	int sum = 0;
	for (int i = 0; *(p + i) != '\0'; i++)
	{
		sum++;
	}
	return sum;
}

在这里插入图片描述

#include<stdio.h>
#define M 3
#define N 10

int main()
{
	void strcopy(char a[], char result[], int n);
	char a[N], result[N];
	int n;
	gets(a);
	scanf("%d", &n);
	strcopy(a, result, n - 1);
	puts(result);
}

void strcopy(char x[], char y[], int m)
{
	char* p = x, * q = y;
	for (int i = m; *(p + i) != '\0'; i++)
	{
		*q = *(p + i);
		//因为没有对result进行初始化,所以其中的字符都是随机的
		//这会导致输出时找不到结束字符,因为才有下一句语句
		*(q + 1) = '\0';
		q++;
	}
}

在这里插入图片描述

#include<stdio.h>
#define M 3
#define N 100

int main()
{
	void str_num(char a[]);
	char a[N];
	gets(a);
	str_num(a);
}

void str_num(char x[])
{
	char* p = x;
	int a = 0, b = 0, c = 0, d = 0, e = 0;	//分别代表大写,小写,空格,数字,其他字符的和
	for (int i = 0; *(p + i) != '\0'; i++)
	{
		if (*(p + i) >= 'A' && *(p + i) <= 'Z')
		{
			a++;
		}
		else if (*(p + i) >= 'a' && *(p + i) <= 'z')
		{
			b++;
		}
		else if (*(p + i) >= '0' && *(p + i) <= '9')
		{
			c++;
		}
		else if (*(p + i) == ' ')
		{
			d++;
		}
		else
		{
			e++;
		}
	}
	printf("%d %d %d %d %d", a, b, c, d, e);
}

在这里插入图片描述

#include<stdio.h>
#define M 3
#define N 3

int main()
{
	void T(char a[M][N]);
	int a[M][N], t = 1;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			*(*(a + i) + j) = t++;
		}
	}
	T(a);
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%d", * (*(a + i) + j));
		}
		putchar('\n');
	}
}

void T(int x[M][N])
{
	for (int i = 0; i < M; i++)
	{
		//遍历列只需从上一次的行号开始,否则会重复置换
		for (int j = i; j < N; j++)
		{
			//对角线不会变
			if (i != j)
			{
				int temp;
				temp = *(*(x + i) + j);
				*(*(x + i) + j) = *(*(x + j) + i);
				*(*(x + j) + i) = temp;
			}
		}
	}
}

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值