C语言程序设计第五版谭浩强著 第七章答案

第七章 用函数实现模块化程序设计

1、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输人。

题目解析:

  • 该题直接使用“辗转相除法”来求解最大公约数和最小公倍数

  • 最大公约数找出两数中的最小值,然后直接相模,当能够同时被两数整除时,则为最大公约数。

  • 最小公倍数找出两数中的最大值,然后直接进入死循环,直到找到一个数能够同时被两数整除时,则为最小公倍数

【注】此题还有一些比较高级的解法,比如求最大公约数的相减法、欧几里德辗转相除法等,有兴趣的同学可以查询相关资料

代码示例:

#include<stdio.h>//最大公约数
size_t GCD(size_t a, size_t b)
{      size_t gcd;      gcd = a > b ? b : a;while(gcd > 1)  {if((a % gcd == 0) && (b % gcd == 0))   return gcd; gcd--; }return gcd;
}//最小公倍数
size_t LCM(size_t a, size_t b)
{size_t lcm;lcm = a > b ? a : b;while(1){if((lcm % a==0) && (lcm % b==0))break;lcm++;}return lcm;
}int main()
{size_t a, b, result;printf("请输入两个整数:>");scanf("%d %d", &a, &b);result = GCD(a, b);printf("%d和%d的最大公约数为:%d\n", a, b, result);result = LCM(a, b);printf("%d和%d的最小公倍数为:%d\n", a, b, result);return 0;
}

运行结果:

2、求方程 ax2+bx+c=0{ax}^2+bx+c=0ax2+bx+c=0的根,用3个函数分别求当: b2−4acb^2-4acb2−4ac大于0、等于0和小于0时的根并输出结果。从主函数输入a,b,c的值。

题目解析

  • 根据disc = b2−4acb^2-4acb2−4ac 的值来决定如何求根,题目本身编程不难,不过需要同学们复习一下高中的数学知识哦。

代码示例

#include<stdio.h>
#include<math.h>//x1为第一个根,x2为第二个根
float x1, x2, disc, p, q;void greater_than_zero(float a, float b)
{float m = sqrt(disc);x1 = (-b + sqrt(disc)) / (2 * a);x2 = (-b - sqrt(disc)) / (2 * a);
}void equal_to_zero(float a, float b)
{x1 = x2 = (-b) / (2 * a);
}void smaller_than_zero(float a, float b)
{p = -b / (2 * a);q = sqrt(-disc) / (2 * a);
}int main()
{int a, b, c;printf("请输入 a b c:");scanf("%d %d %d", &a, &b, &c);printf("表达式为: %d*x^2+%d*x+%d = 0\n", a, b, c);disc = b*b - 4 * a*c;if (disc > 0){greater_than_zero(a, b);printf("disc>0的根为: x1=%f    x2=%f\n", x1, x2);}else if (disc == 0){equal_to_zero(a, b);printf("disc==0的根为:x1=%f    x2=%f\n", x1, x2);}else{smaller_than_zero(a, b);printf("disc<0的根为:x1=%f+%f x2=%f-%f\n", p, q, p, q);}return 0;
}

运行结果:

3、写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息。

题目解析:

  • 素数是一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数

  • 该题可以使用概念直接判断法求解,不过不需要判断所有的数据,只需要判断数据的一半即可,因为偶数不可能为素数(除了2),所以只需判断该数的一半即可的到答案

代码示例:

#include<stdio.h>
#include<stdbool.h>bool IsPrime(int value)
{for(int i=2; i<value/2; ++i){if(value % i == 0) //说明除了1和本身之外,还能被其他数整除return false;}return true;
}int main()
{int value;bool flag;printf("请输入 value :>");scanf("%d", &value);flag = IsPrime(value);if(flag)printf("%d 是素数.\n", value);elseprintf("%d 不是素数.\n", value);return 0;
}

运行结果:

4、写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换。

题目解析:

进行数组的行列互换,其关键在于数组互换的表达式 ar[i] [j] = ar[j] [i];其次在循环的时候,内层循环不能到达最大列,需要根据此时是第几行的交换来决定循环的次数,否则有可能数组行列交换之后最后又交换回原来的形状了。

代码示例

#include<stdio.h>void PrintArray(int ar[3][3])
{for(int i=0; i<3; ++i){for(int j=0; j<3; ++j){printf("%d ", ar[i][j]);}printf("\n");}
}void ReverseArray(int ar[3][3])
{int tmp;for(int i=0; i<3; ++i){for(int j=0; j<i; ++j){if(i != j) //中间数不发生变化{//交换两个数tmp = ar[i][j];ar[i][j] = ar[j][i];ar[j][i] = tmp;}}}
}int main()
{int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};printf("转置前:\n");PrintArray(array);//进行数组转置ReverseArray(array);printf("转置后:\n");PrintArray(array);return 0;
}

运行结果:

5、写一个函数,使输人的一个字符串按反序存放,在主函数中输入和输出字符串。

题目解析及答案:

  • 要把一个字符串反序存放,其实就是对字符串做一个逆序操作,操作过程为收尾字符交换,直到把所有字符全部交换完毕。

示例代码

#include<stdio.h>void ReverseString(char str[])
{int start, end;char tmp;start = 0;end = strlen(str)-1; //字符数组小标从0开始,所以-1while(start < end){tmp = str[start];str[start] = str[end];str[end] = tmp;start++;end--;}
}int main()
{char str[100] = {0};printf("请输入一个字符串:>");scanf("%s", str);printf("原始字符串为:> %s\n", str);ReverseString(str);printf("反序字符串为:> %s\n", str);return 0;
}

运行结果:

6、写一个函数,将两个字符串连接。

题目解析及答案:

  • 利用一个临时数组,空间要保证能够容纳两个字符串,先把第一个字符串进行拷贝到临时数组,第二个字符串在临时数组的尾部接着链接,最后记得加上字符串的结束标记\0即可

代码示例:

#include<stdio.h>void ConcatStr(char string1[], char string2[], char string[])
{int i, j;for (i = 0; string1[i] != '\0'; i++)string[i] = string1[i];//找到字符串末尾,继续往后面链接字符串for (j = 0; string2[j] != '\0'; j++)string[i + j] = string2[j];//字符串末尾加上结束符 \0string[i + j] = '\0';
}int main()
{char s1[200] = {0}, s2[100]= {0}, s[100] = {0};printf("input string1:");scanf("%s", s1);printf("input string2:");scanf("%s", s2);ConcatStr(s1, s2, s);printf("\nThe new string is %s\n", s);return 0;
}

运行结果:

7、写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。

题目解析:

  • 该题的重点在于元音字母的判断,通过或条件,凡是元音字母都进行拷贝

代码示例:

#include<stdio.h>void cpy(char s[], char c[])
{int i, j;for (i = 0, j = 0; s[i] != '\0'; i++){//判断元音字母if (s[i] == 'a' || s[i] == 'A' || s[i] == 'e' || s[i] == 'E' || s[i] == 'i' ||s[i] == 'I' || s[i] == 'o' || s[i] == 'O' ||s[i] == 'u' || s[i] == 'U'){c[j] = s[i];j++;}}c[j] = '\0';
}int main()
{char str[80], c[80];printf("input string:");gets(str);cpy(str, c); //将str中的元音字母拷贝到c中printf("The vowel letters are:%s\n", c);return 0;
}

运行结果:

8、写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”。

题目解析:

对字符串进行遍历输出,没输出一个字符,后面就跟着输出一个空格,关键点在于如果输出的是最后一个字符,则不能在输出字符,所以要对是否是最后一个字符的输出进行判断。

代码示例:

#include<stdio.h>void OutString(char str[])
{int i = 0;while(str[i] != '\0'){printf("%c", str[i]);if(str[i+1] == '\0') //清除最后一个空格不输出break;printf("%c", ' ');i++;}printf("\n");
}
int main()
{char str[5] = {0};printf("input four digits:");scanf("%s", str);OutString(str);return 0;
}

运行结果:

9、编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输人字符串以及输出上述的结果。

题目解析:

  • 该题的关键在于要能够写出各种字符统计的条件

代码示例:

#include<stdio.h>int letter, digit, space, others;void CountChar(char str[])
{int i;for (i = 0; str[i] != '\0'; i++){//统计字母if ((str[i] >= 'a'&& str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) letter++;else if (str[i] >= '0' && str[i] <= '9') //统计数字digit++;else if (str[i] == ' ')//统计空格space++;elseothers++;  //统计其他字符}
}int main()
{char text[80];printf("input string:\n");gets(text);printf("string: %s\n", text);CountChar(text);printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n", letter, digit, space, others);return 0;
}

运行结果:

10、写一个函数,输人一行字符,将此字符串中最长的单词输出。

题目解析及答案:

  • 单词以空格进行分隔,因此寻找空格出现的位置即为关键,每次从单词的起始到空格出现的位置即为一个单词,此时计算单词的长度,如果比当前最大的还长,就进行跟新最长单词信息,当整个字符串遍历完成,word即保存最长字符串。

代码示例:

#include<stdio.h>
#include<string.h>void LongestWord(char str[], char word[])
{int max_len = 0;int len = 0;int i = 0;while(str[i] != '\0'){if(str[i] == ' '){str[i] = '\0';len = strlen(str);if(len > max_len){max_len  = len;strcpy(word, str);str = str + len + 1;}}i++;}
}int main()
{char line[100] = {0};char word[100] = {0};printf("input one line:\n");gets(line);LongestWord(line, word);printf("The longest word is : %s\n", word);return 0;
}

运行结果:

11、写一个函数,用“起泡法”对输人的10个字符按由小到大顺序排列。

题目解析及答案:

  • 该题主要是对冒泡排序的理解,外层循环控制排序的趟数,内层循环主要是进行每一趟排序的比较,如果前面的字符大于后面的字符,就进行交换,每做一趟排序,就把一个最大字符排在最后,以及每做一趟排序就需要少比较一个字符。

代码示例:

#include<stdio.h>
#include<string.h>void BubbleSort(char str[])
{int i, j;char tmp;int len = strlen(str);for(i=0; i<len-1; ++i){for(j=0; j<len-i-1; ++j){if(str[j] > str[j+1]){tmp = str[j];str[j] = str[j+1];str[j+1] = tmp;}}}
}int main()
{int i;char str[11] = {0};printf("请输入10个字符:>");for(i=0; i<10; ++i)scanf("%c", &str[i]);BubbleSort(str);printf("string sorted: %s\n", str);return 0;
}

运行结果:

12、用牛顿迭代法求根。方程为ax3+bx2+cx+d=0ax^3+bx^2 +cx+d=0ax3+bx2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输人。求x在1附近的一个实根。求出根后由主函数输出。

题目解析及答案:

  • 此题的难点并不是编程,主要是要理解数学公式的求解方法,理解之后代码的实现并不困难。

代码示例:

#include<stdio.h>
#include<math.h>float solut(int a, int b, int c, int d)
{float x = 1, x0, f, f1;do{x0 = x;f = ((a*x0 + b)*x0 + c)*x0 + d;f1 = (3 * a*x0 + 2 * b)*x0 + c;x = x0 - f / f1;} while (fabs(x - x0) >= 1e-3);return(x);
}int main()
{int a, b, c, d;printf("input a,b,c,d:");scanf("%d %d %d %d", &a, &b, &c, &d);printf("x=%10.7f\n", solut(a, b, c, d));return 0;
}

运行结果:

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

题目解析及答案:

  • 递归函数的设计,有一个点非常重要,那就是必须要有返回条件,,此题中的返回条件即为n0和n1时,因为当n为这两值时,程序直接返回相应的值,只有n>=1时,才进行递归运算。

代码示例:

#include<stdio.h>double polya(int n,int x)
{double result; if(n == 0)  result = 1;  if(n == 1)result = x; if(n>1)result = ((2*n-1)*x*polya(n-1,x)-(n-1)*polya(n-2,x))/n;    return result;
}int main()
{ int x,n; scanf("%d %d", &n, &x); printf("%.2f\n", polya(n,x)); return 0;
}

运行结果:

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

①计算每个学生的平均分;
②计算每门课的平均分;
③找出所有50个分数中最高的分数所对应的学生和课程;
④计算平均分方差:

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

题目解析及答案:

  • 此题的关键是如何存储某个学生对应某门课程的分数,这里利用了一个二维数组score,其中score[i] [j]就代表了第i个学生的第j门课程的分数,只要能够理解这个存储方式,其余的计算就是比较容易理解和实现的。

代码示例:

#include<stdio.h>#define N 10
#define M 5
float score[N][M];
float a_stu[N], a_cour[M];
int r, c;//输入学生成绩信息函数
void input_stu(void)
{int i, j;for (i = 0; i < N; i++){printf("\ninput score of student%2d:\n", i + 1);for (j = 0; j < M; j++)scanf("%f", &score[i][j]);}
}//每个学生平均分
void aver_stu(void)
{int i, j;float s;for (i = 0; i < N; i++){for (j = 0, s = 0; j < M; j++)s += score[i][j];a_stu[i] = s / 5.0;}
}//每门课程平均分
void aver_cour(void)
{int i, j;float s;for (j = 0; j < M; j++){s = 0;for (i = 0; i < N; i++)s += score[i][j];a_cour[j] = s / (float)N;}
}//最高分函数
float highest()
{float high;int i, j;high = score[0][0];for (i = 0; i < N; i++)for (j = 0; j<M; j++)if (score[i][j]>high){high = score[i][j];r = i + 1;c = j + 1;}return(high);
}//方差函数
float s_var(void)
{int i;float sumx, sumxn;sumx = 0.0;sumxn = 0.0;for (i = 0; i < N; i++){sumx += a_stu[i] * a_stu[i];sumxn += a_stu[i];}return(sumx / N - (sumxn / N)*(sumxn / N));
}int main()
{int i, j;float h;input_stu();aver_stu();aver_cour();printf("\n  NO.     cour1   cour2   cour3   cour4   cour5   aver\n");for (i = 0; i < N; i++){printf("\n NO %2d ", i + 1);for (j = 0; j < M; j++)printf("%8.2f", score[i][j]);printf("%8.2f\n", a_stu[i]);}printf("\naverage:");for (j = 0; j < M; j++)printf("%8.2f", a_cour[j]);printf("\n");h = highest();printf("highest:%7.2f   NO. %2d   course %2d\n", h, r, c);printf("variance %8.2f\n", s_var());return 0;
}

运行结果:


15、写几个函数:

  • ①输人10个职工的姓名和职工号;
    ②按职工号由小到大顺序排序,姓名顺序也随之调整;
    ③要求输人一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名。

题目解析及答案:

利用二分查找的关键在于数据一定要先有序,所以在查找前我们需要对数据进行排序。

代码示例:

#include<stdio.h>#define N 10void input(int num[], char name[N][8])
{int i;for (i = 0; i < N; i++){printf("input NO.: ");scanf("%d", &num[i]);printf("input name: ");getchar();gets(name[i]);}
}void sort(int num[], char name[N][8])
{int i, j, min, templ;char temp2[8];for (i = 0; i < N - 1; i++){min = i;for (j = i; j<N; j++)if (num[min]>num[j])  min = j;templ = num[i];strcpy(temp2, name[i]);num[i] = num[min];strcpy(name[i], name[min]);num[min] = templ;strcpy(name[min], temp2);}printf("\n result:\n");for (i = 0; i < N; i++)printf("\n %5d%10s", num[i], name[i]);
}void search(int n, int num[], char name[N][8])
{int top, bott, mid, loca, sign;top = 0;bott = N - 1;loca = 0;sign = 1;if ((n<num[0]) || (n>num[N - 1]))loca = -1;while ((sign == 1) && (top <= bott)){mid = (bott + top) / 2;if (n == num[mid]){loca = mid;printf("NO. %d , his name is %s.\n", n, name[loca]);sign = -1;}else if (n < num[mid])bott = mid - 1;elsetop = mid + 1;}if (sign == 1 || loca == -1)printf("%d not been found.\n", n);
}int main()
{int num[N], number, flag = 1, c;char name[N][8];input(num, name);sort(num, name);while (flag == 1){printf("\ninput number to look for:");scanf("%d", &number);search(number, num, name);printf("continue ot not(Y/N)?");getchar();c = getchar();if (c == 'N' || c == 'n')flag = 0;}return 0;
}

运行结果:


16、写一个函数,输人一个十六进制数,输出相应的十进制数。

题目解析及答案:

  • 转换的过程需要乘的基数为16,其次注意十六进制中的a~f的字母转换,并且无论大小写都要能够转换。

代码示例:

#include<stdio.h>size_t HextoDec(char s[])
{size_t i, n;n = 0;for (i = 0; s[i] != '\0'; i++){if (s[i] >= '0'&& s[i] <= '9')n = n * 16 + s[i] - '0';if (s[i] >= 'a' && s[i] <= 'f')n = n * 16 + s[i] - 'a' + 10;if (s[i] >= 'A' && s[i] <= 'F')n = n * 16 + s[i] - 'A' + 10;}return n;
}int main()
{size_t result = 0;char hex[9] = {0}; printf("input a HEX number:");scanf("%s", hex);result = HextoDec(hex);printf("0x%s = %u\n", hex, result);return 0;
}

运行结果:

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

题目解析及答案:

  • 递归法求解主要要有结束条件,此题为n/10 == 0时就直接输出,其次本题还要考虑如果整数位负数的情形,此时需要输出一个字符串的负号。
#include<stdio.h>void Convert(int n)
{int i;if ((i = n / 10) != 0)Convert(i);putchar(n % 10 + '0');
}int main()
{int number;printf("input an integer: ");scanf("%d", &number);printf("output: ");if (number < 0){putchar('-');   //先输出一个负号'-'number = -number;}Convert(number);printf("\n");return 0;
}

运行结果:

18、给出年、月、日,计算该日是该年的第几天。

题目解析:

  • 此题采用枚举法进行每月天数的累加,其中关键点注意需要判断年份是否为闰年,如果是还需要多累加1天。

代码示例:

#include <stdio.h>
#include<stdio.h>/* 函数sum_day:计算日期 */
int sum_day(int month, int day)
{int day_tab[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int i;for (i = 1; i < month; i++)day += day_tab[i];      /* 累加所在月之前天数 */return day;
}                         /* 函数leap:判断是否为闰年 */
int leap(int year)
{int leap;leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;return leap;
}int main()
{int year, month, day, days;printf("input date(year,month,day):");scanf("%d %d %d", &year, &month, &day);printf("%d/%d/%d ", year, month, day);days = sum_day(month, day);                  /* 调用函数sum_day */if (leap(year) && month >= 3)                  /* 调用函数leap */days = days + 1;printf("is the %dth day in this year.\n", days);return 0;
}

运行结果:

C语言程序设计第五版谭浩强 第七章答案

更多C语言程序设计谭浩强第五版课后答案

谭浩强C语言程序设计第五版 第六章答案

C语言程序设计第五版谭浩强 第七章答案相关推荐

  1. C语言程序设计第五版 谭浩强 第四章 课后习题 答案

    谭浩强C语言程序设计第五版 第4章 课后习题 答案 点我看视频讲解+可运行源码 记得一键三连哦 第四章 选择结构程序设计 1. 什么是算术运算?什么是关系运算?什么是逻辑运算? [答案解析] 算熟运算 ...

  2. C语言程序设计第五版谭浩强课后答案 第九章习题答案

    C语言程序设计第五版谭浩强第九章答案 1.定义一个结构体变量(包括年.月.日).计算该日在本年中是第几天,注意闰年问题. 2.写一个函数days,实现第1 题的计算.由主函数将年.月.日传递给days ...

  3. C语言程序设计第五版谭浩强课后答案 第六章《利用数组处理批量数据》习题答案 (大一大二、考研、计算机二级必看)

    第六章<利用数组处理批量数据>习题答案 1. 用筛选法求100之内的素数 2. 用选择法对10个整数排序 3. 求一个3 X 3的整形矩阵对角线元素之和 4. 有一个已经排好序的数组,要求 ...

  4. C语言程序设计第五版 谭浩强目录大纲

    第1章程序设计和C语言1 1.1什么是计算机程序1 1.2什么是计算机语言1 1.3C语言的发展及其特点3 1.4最简单的C语言程序5 1.4.1最简单的C语言程序举例5 1.4.2C语言程序的结构9 ...

  5. C语言程序设计第五版谭浩强著 第7章习题以及答案 函数系列

    1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果.两个整数由键盘输入. #include<stdio.h> void main(void) {in ...

  6. C语言程序设计第五版谭浩强著 第五章部分课后习题答案

    #include<stdio.h> main() {int x,y,m,n,u,p;scanf("%d%d",&x,&y);m=x;n=y;while( ...

  7. C语言程序设计第五版谭浩强著 第8章291-292指针系列

    1.输入3个整数,按由小到大的顺序输出. #include<stdio.h> main() {int a,b,c,*p1,*p2,*p3;p1=&a;p2=&b;p3=&a ...

  8. C语言程序设计第五版谭浩强著 第七章部分课后习题答案

    #include<stdio.h> int gcd(int x,int y) {int z;for(;;){z=x%y;x=y;y=z;if(y==0)break;}return x; } ...

  9. C++语言程序设计第五版 - 郑莉(第七章课后习题)

    第7章  继承与派生 7-5 定义一个基类 Shape,在此基础上派生出 Rectangle 和 Circle,二者都有 getArea()函数计算对象的面积.使用 Rectangle类创建一个派生类 ...

最新文章

  1. java 俄罗斯方块窗口_[代码全屏查看]-java 俄罗斯方块
  2. 关于如何在ASP.NET 2.0中定制Expression Builders
  3. 解决qt工程文件.pro配置、LIBS添加、ld.so.conf文件添加、库文件权限设置等一系列问题
  4. Win10系列:JavaScript 项目模板中的文件和项模板文件
  5. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_1-2核心技术列表...
  6. SQL之EXISTS用法示例
  7. 数据结构试卷及答案(二)
  8. SpringBoot接口接收json参数
  9. Win10如何ping端口是否开放
  10. 软件构造笔记---Java的多态性
  11. 一文了解数据分析师与商业分析师的区别(二)
  12. java fmail发送邮件_【已实测通过】JavaMail常用的几种邮件发送方式
  13. 中易浏览器(enjoyie) v3.0.1.15 完整绿色版 免费
  14. 中国巡游帆船行业市场供需与战略研究报告
  15. 乱弹琴20140421
  16. unity背景设置透明,显示ios原生ui背景
  17. 实时人流量监测——海康威视sdk初体验
  18. 大数据广告系统精准广告获客怎么操作
  19. 微星x58pro支持服务器内存吗,价廉却不简单!微星X58 Pro主板超频评测
  20. matlab篮球队需要五名队员,2016年数学建模暑期训练题目

热门文章

  1. HDU 5128 The E-pang Palace
  2. 基于单片机定时闹钟设计
  3. 玩转阿里云之ack 部署高可靠ingress Controller
  4. “后红海”时代,大数据体系到底是什么?
  5. 检测android app是否在白名单内
  6. 绘制巴厘岛Barong蒙版– Photoshop教程
  7. 2 C/C++快速入门
  8. C语言基础语法【1】
  9. Windows cmd关机重启命令
  10. 广州地区常用的DNS解析服务器