首页 > 编程语言 >谭浩强C程序设计课后习题(第7章)

谭浩强C程序设计课后习题(第7章)

时间:2025-01-21 12:28:10浏览次数:3  
标签:return int res ++ 谭浩强 课后 printf 习题 include

1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#include <stdio.h>
 
int gongyue(int a, int b) {
	int t;
	if(a < b) {
		t = a;
		a = b;
		b = t;
	}
	while(b) {
		t = a % b;
		a = b;
		b = t;
	}
	return a;
}

int gongbei(int a, int b) {
	int t = gongyue(a, b);
	return (a * b) / t;
}
 
int main() {
	int a, b;
	printf("请输入a和b的值(a,b):");
	scanf("%d,%d", &a, &b);
	printf("\n最大公约数:%d\n", gongyue(a, b));
	printf("\n最小公倍数:%d\n", gongbei(a, b));
}

2.求方程的根,用3个函数分别求当:大于0、等于0和小于0时的根并输出结果。从主函数输人a, b, c的值。
#include <stdio.h>
#include <math.h>

void f1(int a, int b, int c) {
    double res1, res2;
    res1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
    res2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
    printf("\nres1 = %lf, res2 = %lf\n", res1, res2);
}

int f2(int a, int b, int c) {
    double res;
    res = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
    printf("\nres = %lf\n", res);
    return 0; // 添加返回值
}

int main() {
    int a, b, c, t;
    printf("请输入a, b, c的值(a,b,c):");
    scanf("%d,%d,%d", &a, &b, &c); // 修改输入格式
    if (a == 0) {
        printf("a不能为0\n");
        return 1; // 退出程序
    }
    t = b * b - 4 * a * c;
    if (t > 0) {
        printf("\n△ = %d > 0\n", t);
        f1(a, b, c);
    }
    else if (t == 0) {
        printf("\n△ = %d = 0\n", t);
        f2(a, b, c);
    }
    else {
        printf("\n△ = %d < 0\n", t);
        printf("无实数根\n");
    }
    return 0;
}

3.写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息。
#include <stdio.h>
 
int isprime(int a) {
	int i;
	for(i = 2; i <= a / 2; i++) {
		if(a % i == 0)	return 0;
	}
	if(i > a / 2)	return 1;
	return 0;
}
 
int main() {
	int x, flag;
	printf("请输入一个整数:");
	scanf("%d", &x);
	flag = isprime(x);
	if(flag == 1)	printf("%d是素数\n", x);
	else	printf("%d不是素数\n", x);
	return 0;
}

  

4.写一个函数,使给定的一个3×3的二维整型数组转置,即行列互换。
#include <stdio.h>
 
#define M 3
 
void reverse(int a[][M]) {
	int i, j, t;
	for(i = 0; i < M; i++) {
		for(j = 0; j <= i; j++) {
			t = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = t;
		}
	}
}
 
int main() {
	int a[M][M] = {1, 2, 3, 4, 5, 6, 7 , 8, 9}, i, j;
	
	printf("\nbefore:\n");
	for(i = 0; i < M; i++) {
		for(j = 0; j < M; j++) {
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	
	reverse(a);
	
	printf("\nafter:\n");
	for(i = 0; i < M; i++) {
		for(j = 0; j < M; j++) {
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
#include <stdio.h>
#include <string.h>
 
#define M 80
 
void reverse(char a[M], int n) {
	int i, t;
	for(i = 0; i < n / 2; i++) {
		t = a[i];
		a[i] = a[n - i - 1];
		a[n - i - 1] = t;
	}
}
 
int main() {
	char a[M];
	int n;
	printf("请输入一个字符串:");
	scanf("%s", a);
	n = strlen(a);
	
	printf("\n反序前:%s\n", a);
	
	reverse(a, n);
	
	printf("\n反序后:%s\n", a);
	
	return 0;
}

6.写一个函数,将两个字符串连接。
#include <stdio.h>
#include <string.h>
 
#define M 80
 
void contact(char a[M], char b[M], char res[M * 2]) {
	int i, j;
	for(i = 0; a[i] != '\0'; i++) {
		res[i] = a[i];
	}
	
	for(j = 0; b[j] != '\0'; j++) {
		res[i++] = b[j];
	}
	res[i] = '\0';
}
 
int main() {
	char a[M], b[M], res[M * 2];
	int n;
	printf("请输入第一个字符串:");
	scanf("%s", a);
	
	printf("请输入第二个字符串:");
	scanf("%s", b);
	
	contact(a, b, res);
	
	printf("\n连接后:%s\n", res);
	
	return 0;
}

7.写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
#include <stdio.h>
#include <string.h>
 
#define M 80
 
void fun(char a[M], char res[M]) {
	int i, j = 0;
	for(i = 0; a[i] != '\0'; i++) {
		if(a[i] == 'a' || a[i] == 'A' || a[i] == 'e' || a[i] == 'E' || a[i] == 'i' || 
		a[i] == 'I' || a[i] == 'o' || a[i] == 'O' || a[i] == 'u' || a[i] == 'U') {
			res[j++] = a[i];
		}
	}
	res[j] = '\0';
}
 
int main() {
	char a[M], res[M];
	int n;
	printf("请输入一个字符串:");
	scanf("%s", a);
	
	fun(a, res);
	
	printf("\n所有元音字母:%s", res);
	
	return 0;
}

8.写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输入1990,应输出“1990”。
#include <stdio.h>
 
#define M 8
 
void fun(char a[M], int num) {
	int i = 0, n = num, t;
	while(n > 0) {
		a[i] = n % 10 + '0';
		n = n / 10;
		a[i + 1] = ' ';
		i += 2;
	}
	a[i - 1] = '\0';
}
 
int main() {
	char a[M];
	int num, i;
	printf("\n请输入一个4位数字:");
	scanf("%d", &num);
	while(num < 1000 || num > 9999) {
		printf("\n输入有误,请重新输入:");
		scanf("%d", &num);
	}
	
	fun(a, num);
	
	for(i = M - 1; i >= 0; i--) {
		printf("%c", a[i]);
	}
	
	return 0;
}

9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
#include <stdio.h>
 
#define M 80
 
int letter = 0, number = 0, space = 0, other = 0;
 
void fun(char a[M]) {
	int i;
	for(i = 0; a[i] != '\0'; i++) {
		if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))	letter++;
		else if(a[i] >= '0' && a[i] <= '9')	number++;
		else if(a[i] == ' ')	space++;
		else	other++;
	}
}
 
int main() {
	char a[M];
	printf("\n请输入一个字符串:");
	gets(a);
	
	fun(a);
	
	printf("\n%s\n字母:%d,数字:%d,空格:%d,其他字符:%d\n", a, letter, number, space, other);
	
	return 0;
}

 10.写一个函数,输入一行字符,将此字符串中最长的单词输出。
#include <stdio.h>
 
#define M 80
 
void fun(char a[M], char b[M]) {
	int i, j, count = 0, max = 0;
	for(i = 0; a[i] != '\0'; i++) {
		if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')){
			count++;
		}
		if((a[i] == ' ' && a[i + 1] != ' ') || (a[i] != ' ' && a[i + 1] == '\0')) {
			if(max < count) {
				max = count;
				j = i - max;
			}
			count = 0;
		}
	}
	for(i = 0; i < max; i++)	b[i] = a[j++];
	b[i]= '\0';
}
 
int main() {
	char a[M], b[M];
	printf("\n请输入一个字符串:");
	gets(a);
	
	fun(a, b);
	
	printf("\n%s\n", b);
	
	return 0;
}

11.写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排列。
#include <stdio.h>
#include <string.h>
 
#define M 80
 
void fun(char a[M]) {
	int i, j;
	char t;
	for(i = 0; a[i] != '\0'; i++) {
		for(j = 0; j < strlen(a) - i; j++) {
			if(a[j] > a[j + 1]) {
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
		}
	}
}
 
int main() {
	char a[M];
	printf("\n请输入一个字符串:");
	gets(a);
	
	fun(a);
	
	printf("\nafter: %s\n", a);
	
	return 0;
}

 

12.用牛顿迭代法求根。方程为,系数a, b, c, d的值依次为1, 2, 3, 4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
#include <stdio.h>
#include <math.h>
 
double fun(int a, int b, int c, int d) {
	double x0 = 1.0, x1 = 0.0, f1, f2;
	
	while(fabs(x1 - x0) >= 1e-6) {
		x0 = x1;
		f1 = a * pow(x0, 3) + b * pow(x0, 2) + c * x0 + d;
		f2 = 3 * a * pow(x0, 2) + 2 * b * x0 + c;
		x1 = x0 - f1 / f2;
	}
	
	return x1;
}
 
int main() {
	int a, b, c, d;
	double x;
	printf("\n请输入a, b, c, d的值:");
	scanf("%d%d%d%d", &a, &b, &c, &d);
	
	x = fun(a, b, c, d);
	
	printf("%.7lf", x);
	
	return 0;
}

13.用递归方法求n阶勒让德多项式的值,递归公式为

#include <stdio.h>
#include <math.h>
 
float p(int n, float x) {
	float res;
	
	if(n == 0) return 1;
	if(n == 1) return x;
	
	if(n > 1) {
		res = ((2 * n - 1) * x * p(n - 1, x) - (n - 1) * p(n - 2, x)) / n;
	}
	return res;
}
 
int main() {
	int n;
	float x;
	printf("input x,n: ");
	scanf("%f%d", &x, &n); 
	printf("%f\n", p(n, x));
	return 0;
}

   

14.输入10个学生5门课的成绩,分别用函数实现下列功能:

①计算每个学生的平均分;

②计算每门课的平均分;

③找出所有50个分数中最高的分数所对应的学生和课程;

④计算平均分方差:

 

其中,​​​​​​​为某一学生的平均分。

#include <stdio.h>
#include <math.h>
 
#define M 10
#define N 5
 
void f1(int a[M][N]) {
	int i, j;
	float average[M], sum;
	
	for(i = 0; i < M; i++) {
		sum = 0.0;
		for(j = 0; j < N; j++) {
			sum += a[i][j];
		}
		average[i] = sum / N;
	}
	
	printf("\n\n每个学生的平均分\n");
	for(i = 0; i < M; i++) {
		printf("--学生%d:%.2f\n", i + 1, average[i]);
	}
}
 
void f2(int a[M][N]) {
	int i, j;
	float average[M], sum;
	
	for(j = 0; j < N; j++) {
		sum = 0.0;
		for(i = 0; i < M; i++) {
			sum += a[i][j];
		}
		average[j] = sum / M;
	}
	
	printf("\n\n每门课程的平均分\n");
	for(i = 0; i < N; i++) {
		printf("--课程%d:%.2f\n", i + 1, average[i]);
	}
}
 
void f3(int a[M][N]) {
	int i, j, max = a[0][0], m, n;
	
	for(i = 0; i < M; i++) {
		for(j = 0; j < N; j++) {
			if(max < a[i][j]) {
				max = a[i][j];
				m = i + 1;
				n = j + 1;
			}
		}
	}
	
	printf("\n\n--最高分:%d\t学生%d\t课程%d\n", max, m, n);
}
 
void f4(int a[M][N]) {
	int i, j, average[M];
	float s, sum = 0.0, sumx = 0.0, res;
	
	for(i = 0; i < M; i++) {
		s = 0.0;
		for(j = 0; j < N; j++) {
			s += a[i][j];
		}
		average[i] = s / N;
		sum += average[i];
		sumx += average[i] * average[i];
	}
	
	res = sumx / M - pow(sum / M, 2);
	
	printf("\n\n--平均分方差:%.2f\n", res);
}
 
int main() {
//	int a[M][N] = {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}, i, j;
	int a[M][N], i, j;
	
	printf("请分别输入10名学生的5门课成绩\n\n");
	for(i = 0; i < M; i++) {
		printf("--学生%d\n", i + 1);
		for(j = 0; j < N; j++) {
			printf("课程%d:", j + 1);
			scanf("%d", &a[i][j]);
		}
		printf("\n");
	}
	
	f1(a);
	f2(a);
	f3(a);
	f4(a);
	
	return 0;
}

 ​​​​​​​

15.写几个函数:

①输入10个职工的姓名和职工号;

②按职工号由小到大顺序排序,姓名顺序也随之调整;

③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

16.写一个函数,输入一个十六进制数,输出相应的十进制数。
#include <stdio.h>
#include <stdio.h>
#include <string.h>

#define M 80

int fun(char a[M]) {
    int i = 0, res = 0;

    while (a[i] != '\0') {
        if (a[i] >= '0' && a[i] <= '9') {
            res = res * 16 + a[i] - '0';
        }
        else if (a[i] >= 'a' && a[i] <= 'f') {
            res = res * 16 + a[i] - 'a' + 10;
        }
        else if (a[i] >= 'A' && a[i] <= 'F') {
            res = res * 16 + a[i] - 'A' + 10;
        }
        i++;
    }

    return res;
}

int main() {
    char a[M];
    int res;

    printf("\n请输入一个十六进制数:");
    gets_s(a);

    while (1) {
        int valid = 1;
        for (int i = 0; i < strlen(a); i++) {
            if (!((a[i] >= '0' && a[i] <= '9') || (a[i] >= 'a' && a[i] <= 'f') || (a[i] >= 'A' && a[i] <= 'F'))) {
                valid = 0;
                break;
            }
        }

        if (valid) {
            break;
        }
        else {
            printf("\n输入有误,请重新输入:");
            gets_s(a);
        }
    }

    res = fun(a);
    printf("\n( %s )16 ----→ ( %d )10\n", a, res);

    return 0;
}

 

17.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串"483"。n的位数不确定,可以是任意位数的整数。

18.给出年、月、日,计算该日是该年的第几天。
#include <stdio.h>
 
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
int fun(int y, int m, int d) {
	int i, flag = 0, res = 0;
	
	if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))	flag = 1;
	
	for(i = 1; i < m; i++) {
		res += month[i];
	}
	
	res += d;
	
	if(flag == 1 && m > 2)	res++;
	
	return res;
}
 
int main() {
	int y, m, d, flag = 0, res;
	
	printf("\n请输入年月日:");
	scanf("%d%d%d", &y, &m, &d);
	while(1) {
		if(m < 1 || m > 12 || d < 1)	flag = 1;
		if(m == 2 && d > 29)	flag = 1;
		if((m == 4 || m == 6 || m == 9 || m == 11) && d > 30)	flag = 1;
		else if(d > 31)	flag = 1;
		if(flag == 1) {
			printf("\n输入有误,请重新输入年月日:");
			scanf("%d%d%d", &y, &m, &d);
			flag = 0;
			continue;
		}
		break;
	}
	
	res = fun(y, m, d);
	
	printf("\n%d/%d/%d ----→ 第%d天\n", y, m, d, res);
	
	return 0;
}

标签:return,int,res,++,谭浩强,课后,printf,习题,include
From: https://blog.csdn.net/qq_75021272/article/details/145279782

相关文章

  • 谭浩强C程序设计课后习题(第6章)
    1.用筛选法求100之内的素数。#include<stdio.h>intmain(){ inta[100]={0},i,j; for(i=0;i<100;i++) a[i]=i+1; for(i=2;i<100;i++){ for(j=2;j<a[i];j++){ if(a[i]%j==0) break; } if(j>=a[i]){ printf(&quo......
  • Python毕业设计 django培训机构教辅课后作业系统
    文章目录具体实现截图项目技术介绍设计思路核心代码部分展示运行指导论文写作思路django项目示例源码/演示视频获取方式具体实现截图起点树艺术培训机构系统是为满足当代艺术教育需求而设计的综合性管理平台,该系统主要功能包括学员管理、教师管理、培训课程管理、学......
  • bfs练习题-PTA喊山
    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为......
  • 信号与系统(郑君里)第一章-绪论 1-2 课后习题解答
    题目详情(1-2分别判断下列各函数式属于何种信号,即是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?其中各式中n为正整数)答案解析:(1)连续信号模拟信号(2)离散信号抽样信号(3)离散信号数字信号 该函数只取±1,所以为数字信号(4)离散信号抽样信号 该函数随着n的......
  • 信号与系统(郑君里)第一章-绪论 1-3 课后习题解答
    题目详情(分别求下列各周期信号的周期T。)答案解析:tips:本道题考察的是信号的周期性第(1)小题注意连续的找周期找出最小公倍数就可以了,不一定是要整数;第(2)小题注意指数是带有“j”的,如果没有“j”那就不是周期信号了;第(3)小题遇到平方形式第一时间想到用二倍角公式,可以使得形式......
  • JavaWeb课后笔记及体会分享(每日一更)
           从今天开始学习JavaWeb,在接下来的时间里我将学习JavaSE,MySQL,Web前端,JavaEE,SSM三大框架,SpainBoot,SpringCloud,以及一些常见面试题的练习。1.IDEA常用快捷键  Shift两次:包含各种文件、方法的搜索Ctrl+Shift+F:根据输入内容查找整个项目或指定目录内文件......
  • JS事件高级(练习题)
    1.div跟随鼠标移动(键盘事件和鼠标事件)<!--<script>//键盘事件window.onload=function(){varbox1=document.querySelector(".box1");//为document绑定一个按键按下的事件document.onkeydown=function(event){......
  • 【C语言分支和循环练习题】
    分支和循环练习1.打印1-100之间的所有素数2.随机数的生成:生成100-200之间的随机数1.打印1-100之间的所有素数#include<stdio.h>#include<math.h>intmain(){ inti=0; for(i=101;i<=200;i+=2) { intflag=1;//假设i是素数 intj=0; for(......
  • 信号与系统(郑君里)第一章-绪论 1-1 课后习题解答
    题目详情(1-1分别判断题图1-1所示各波形是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?)答案解析:(a)连续信号模拟信号(b)连续信号量化信号(c)离散信号数字信号(d)离散信号抽样信号(非数字信号)(e)离散信号数字信号(f)离散信号数字信号tips:本道题目考察了连续/......
  • 双指针习题:Binary Deque
    14.BinaryDeque题面翻译BinaryDeque-洛谷|计算机科学教育新生态(luogu.com.cn)有多组数据。每组数据给出\(n\)个数,每个数为\(0\)或\(1\)。你可以选择从两边删数,求至少删几个数才可以使剩下的数总和为\(s\)。如果不能达到\(s\),则输出\(-1\)。题目描述Sla......