当前位置:网站首页>《C语言程序设计》(谭浩强第五版) 第7章 用函数实现模块化程序设计 习题解析与答案
《C语言程序设计》(谭浩强第五版) 第7章 用函数实现模块化程序设计 习题解析与答案
2022-04-23 03:09:00 【RubyHan1314】
你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题。

题目1:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
解:设两个整数为 u 和 v,用辗转相除法求最大公约数的算法如下∶
ifv>u
将变量 u与v的值互换 (使大者u为被除数)
while(u/v的余数 r≠0)
{
u=v (使除数v变为被除数 u)
v=r (使余数r变为除数 v)
}
输出最大公约数 r
最小公倍数1= u* v/最大公约数r
可以分别用以下两种方法∶
方法一:用两个函数 hcf 和 lcd 分别求最大公约数和最小公倍数。在主函数中输入两个整数 u 和 v,并传送给函数 hcf,求出的最大公约数返回主函数赋给整型变量 h,然后再把 h 和两个整数 u ,v 一起作为实参传递给函数 lcd,以求出最小公倍数,返回到主函数赋给整型变量 l。输出最大公约数和最小公倍数。
据此写出程序:
#include <stdio.h>
int main()
{
int hef(int, int); //函数声明
int lcd(int, int, int); //函数声明
int u, v, h, l;
scanf("%d,%d", &u, &v);
h = hef(u, v);
printf("H.C.F=%d\n", h);
l = lcd(u, v, h);
printf("L.C.D=%d\n", l);
return 0;
}
int hef(int u, int v)
{
int t, r;
if (v > u)
{
t = u;
u = v;
v = t;
}
while ((r = u % v) != 0)
{
u = v;
v = r;
}
return (v);
}
int lcd(int u, int v, int h)
{
return (u * v / h);
}
运行结果:

输入 24 和 16 两个数,程序输出最大公约数为8,最小公倍数为 48。
方法二:用全局变量的方法。全局变量 Hcf 和 Lcd分别代表最大公约数和最小公倍数。用两个函数分别求最大公约数和最小公倍数,但其值不由函数带回,而是赋给全局变量 Hcf 和 Lcd。在主函数中输出它们的值。
程序如下:
#include <stdio.h>
int Hcf, Lcd; // Hcf 和 Lcd是全局变量
int main()
{
void hcf(int, int);
void lcd(int, int);
int u, v;
scanf("%d,%d", &u, &v);
hcf(u, v); //调用hcf 函数
lcd(u, v); //调用lcd 函数
printf("H.C.F=%d\n", Hcf);
printf("L.C.D=%d\n", Lcd);
return 0;
}
void hcf(int u, int v)
{
int t, r;
if (v > u)
{
t = u;
u = v;
v = t;
}
while ((r = u % v) != 0)
{
u = v;
v = r;
}
Hcf = v; //把求出的最大公约数赋给全局变量 Hcf
}
void lcd(int u, int v)
{
Lcd = u * v / Hcf; //把求出的最小公倍数赋给全局变量Lcd
}
运行结果与方法一相同。
Hcf 是全局变量,hcf 是函数名,两个名字的大小写不同,不会混淆。在 hcf 函数中求出最大公约数赋给全局变量 Hcf,在 lcd 函数中引用了全局变量 Hcf 的值,求出的最小公倍数赋给全局变量 Lcd。在主函数中输出 Hcf 和 Lcd 的值。
题目2:求方程 $ ax^2+bx+c=0 $ 的根,用 3 个函数分别求当:$ b^2-4ac $ 大于 0、等于 0 和小于 0 时的根并输出结果。从主函数输入 a,b,c 的值。
解:
答案代码:
#include <stdio.h>
#include <math.h>
float x1, x2, disc, p, q;
int main()
{
void greater_than_zero(float, float);
void equal_to_zero(float, float);
void smaller_than_zero(float, float);
float a, b, c;
printf("input a,b,c:");
scanf("%f,%f,%f", &a, &b, &c);
printf("equation:%5.2f*x*x+%5.2f*x+%5.2f=0\n", a, b, c);
disc = b * b - 4 * a * c;
printf("root:\n");
if (disc > 0)
{
greater_than_zero(a, b);
printf("x1=%f\t\tx2=%f\n", x1, x2);
}
else if (disc == 0)
{
equal_to_zero(a, b);
printf("xl=%f\t\tx2=%f\n", x1, x2);
}
else
{
smaller_than_zero(a, b);
printf("x1=%f+%fi\tx2=%f-%fi\n", p, q, p, q);
}
return 0;
}
void greater_than_zero(float a, float b)
{
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);
}
运行结果:
①两个不等的实根。

②两个相等的实根。

③两个共轭的复根。

题目3:写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息。
解:
#include <stdio.h>
int main()
{
int prime(int);
int n;
printf("input an integer:");
scanf("%d", &n);
if (prime(n))
printf("%d is a prime.\n", n);
else
printf("%d is not a prime.\n", n);
return 0;
}
int prime(int n)
{
int flag = 1, i;
for (i = 2; i < n / 2 && flag == 1; i++)
if (n % i == 0)
flag = 0;
return (flag);
}
运行结果:
①

②

题目4:写一个函数,使给定的一个 3×3 的二维整型数组转置,即行列互换。
解:
答案代码:
#include <stdio.h>
#define N 3
int array[N][N];
int main()
{
void convert(int array[][3]);
int i, j;
printf("input array:\n");
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &array[i][j]);
printf("\noriginal array:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%5d", array[i][j]);
printf("\n");
}
convert(array);
printf("convert array:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%5d", array[i][j]);
printf("\n");
}
return 0;
}
void convert(int array[][3]) //定义转置数组的函数
{
int i, j, t;
for (i = 0; i < N; i++)
for (j = i + 1; j < N; j++)
{
t = array[i][j];
array[i][j] = array[j][i];
array[j][i] = t;
}
}
运行结果:

题目5:写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
解:
答案代码:
#include <stdio.h>
#include <string.h>
int main()
{
void inverse(char str[]);
char str[100];
printf("input string:");
scanf("%s", str);
inverse(str);
printf("inverse string:%s\n", str);
return 0;
}
void inverse(char str[])
{
char t;
int i, j;
for (i = 0, j = strlen(str); i < (strlen(str) / 2); i++, j--)
{
t = str[i];
str[i] = str[j - 1];
str[j - 1] = t;
}
}
运行结果:

输入字符串∶abcdefg,输出∶gfedcba。
题目6:写一个函数,将两个字符串连接。
解:
答案代码:
#include <stdio.h>
#include <string.h>
int main()
{
void concatenate(char stringl[], char string2[], char string[]);
char s1[100], s2[100], s[100];
printf("input string1:");
scanf("%s", s1);
printf("input string2:");
scanf("%s", s2);
concatenate(s1, s2, s);
printf("\nThe new string is %s\n", s);
return 0;
}
void concatenate(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];
string[i + j] = '\0';
}
运行结果:

输入两个字符串∶country 和 side,程序将两个字符串连接为一个字符串并输出;countryside。
题目7:写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
解:
#include <stdio.h>
int main()
{
void cpy(char[], char[]);
char str[80], c[80];
printf("input string:");
gets(str);
cpy(str, c);
printf("The vowel letters are:%s\n", c);
return 0;
}
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';
}
运行结果:

将 abcdefghijklm中的元音字母输出。
题目8:写一个函数,输入一个 4 位数字,要求输出这 4 个数字字符,但每两个数字间空一个空格。如输入1990,应输出"1 9 9 0"。
解:
答案代码:
#include <stdio.h>
#include <string.h>
int main()
{
void insert(char[]);
char str[80];
printf("input four digits:");
scanf("%s", str);
insert(str);
return 0;
}
void insert(char str[])
{
int i;
for (i = strlen(str); i > 0; i--)
{
str[2 * i] = str[i];
str[2 * i - 1] = ' ';
}
printf("output:\n%s\n", str);
}
运行结果:

题目9:编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
解:
答案代码:
#include <stdio.h>
int letter, digit, space, others;
int main()
{
void count(char[]);
char text[80];
printf("input string:\n");
gets(text);
printf("string:");
puts(text);
letter = 0;
digit = 0;
space = 0;
others = 0;
count(text);
printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n", letter, digit, space, others);
return 0;
}
void count(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] == 32)
space++;
else
others++;
}
运行结果:

题目10:写一个函数,输入一行字符,将此字符串中最长的单词输出。
解:认为单词是全由字母组成的字符串,程序中设longest 函数的作用是找最长单词的位置。此函数的返回值是该行字符中最长单词的起始位置。longest 函数的 N-S图如图7.1 所示。

图7.1中用 flag表示单词是否已开始,flag=0 表示未开始,flag=1表示单词开始; len 代表当前单词已累计的字母个数; length 代表先前单词中最长单词的长度; point 代表当前单词的起始位置(用下标表示); place 代表最长单词的起始位置。函数 alphabetic 的作用是判断当前字符是否字母,若是则返回 1 ,否则返回 0 。
答案代码:
#include <stdio.h>
#include <string.h>
int main()
{
int alphabetic(char);
int longest(char[]);
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("The longest word is :");
for (i = longest(line); alphabetic(line[i]); i++)
printf("%c", line[i]);
printf("\n");
return 0;
}
int alphabetic(char c)
{
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'z'))
return (1);
else
return (0);
}
int longest(char string[])
{
int len = 0, i, length = 0, flag = 1, place = 0, point;
for (i = 0; i <= strlen(string); i++)
if (alphabetic(string[i]))
if (flag)
{
point = i;
flag = 0;
}
else
len++;
else
{
flag = 1;
if (len >= length)
{
length = len;
place = point;
len = 0;
}
}
return (place);
}
运行结果:

题目11:写一个函数,用"起泡法"对输入的 10 个字符按由小到大顺序排列。
解:主函数的 N-S图如图7.2所示。sort函数的作用是排序,其N-S图如图7.3所示。


答案代码:
#include <stdio.h>
#include <string.h>
#define N 10
char str[N];
int main()
{
void sort(char[]);
int i, flag;
for (flag = 1; flag == 1;)
{
printf("input string:\n");
scanf("%s", &str);
if (strlen(str) > N)
printf("string too long,input again!");
else
flag = 0;
}
sort(str);
printf("string sorted:\n");
for (i = 0; i < N; i++)
printf("%c", str[i]);
printf("\n");
return 0;
}
void sort(char str[])
{
int i, j;
char t;
for (j = 1; j < N; j++)
for (i = 0; (i < N - j) && (str[i] != '0'); i++)
if (str[i] > str[i + 1])
{
t = str[i];
str[i] = str[i + 1];
str[i + 1] = t;
}
}
运行结果:

题目12:用牛顿迭代法求根。方程为 $ ax3+bx2+cx+d=0 $ ,系数 a,b,c,d 的值依次为1,2,3,4,由主函数输入。求 x 在 1 附近的一个实根。求出根后由主函数输出。
解:
牛顿迭代公式为 $ x=x_0-\frac{f(x_0)}{f’(x_0)} $
其中,$ x_0 $ 是上一次求出的近似根,在开始时根据题设 $ x_0=1 $(题目希望求 x 在1附近的一个实根,因此第 1 次的近似值可以设定为 1 )。今 $ f(x)=ax3+bx2+cx+d $ ,代入 a,b,c,d 的值,得到 $ f(x) =x3+2x2+3x+4 $ 。 $ f’(x) $ 是 $ f(x) $ 的导数,今 $ f’(x)=3x^2+6x+3 。 第 1 次 迭 代 , 。第 1 次迭代, 。第1次迭代, x=1-\frac{f(1)}{f’(1)}=1-\frac{1+2+3+4}{3+6+3}=1-\frac{10}{12}=0.1666666 $ 。第2次迭代以 0.1666666 作为 $ x_0 $ 代入迭代公式,求出 x 的下一个近似值。依此类推,每次迭代都从 x 的上一个近似值求出下一个更接近真值的x。一直迭代到 $ |x-x_0|\le10^{-3} $ 时结束。
用牛顿迭代法求方程根的函数 solut 的 N-S图,如图7.4所示。
程序如下:
#include <stdio.h>
#include <math.h>
int main()
{
float solut(float a, float b, float c, float d);
float a, b, c, d;
printf("input a,b,c,d:");
scanf("%f,%f,%f,%f", &a, &b, &c, &d);
printf("x=%10.7f\n", solut(a, b, c, d));
return 0;
}
float solut(float a, float b, float c, float 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);
}
运行结果

输入系数1,2,3,4,求出近似根为-1.6506292。
题目13:用递归方法求 n阶勒让德多项式的值,递归公式为
p n ( x ) = { 1 ( n = 0 ) x ( n = 1 ) ( ( 2 n − 1 ) × x − p n − 1 ( x ) − ( n − 1 ) × p n − 2 ( x ) ) / n ( n ≥ 1 ) p_n(x)= \begin{cases} 1 &(n=0)\\ x &(n=1)\\ ((2n-1)\times x-p_{n-1}(x)-(n-1)\times p_{n-2}(x))/n &(n\ge1) \end{cases} pn(x)=⎩⎪⎨⎪⎧1x((2n−1)×x−pn−1(x)−(n−1)×pn−2(x))/n(n=0)(n=1)(n≥1)
解:求递归函数p的 N-S图,如图7.5所示。

答案代码:
#include <stdio.h>
int main()
{
int x, n;
float p(int, int);
printf("\ninput n & x:");
scanf("%d,%d", &n, &x);
printf("n=%d,x=%d\n", n, x);
printf("P%d(%d)=%6.2f\n", n, x, p(n, x));
return 0;
}
float p(int n, int x)
{
if (n == 0)
return (1);
else if (n == 1)
return (x);
else
return (2 * n - 1) * x * p((n - 1), x) - (n - 1) * p((n - 2), x) / n;
}
运行结果:
①:

②:

③:

题目14:输入 10 个学生 5 门课的成绩,分别用函数实现下列功能:
①计算每个学生的平均分;
②计算每门课的平均分;
③找出所有 50 个分数中最高的分数所对应的学生和课程;
④计算平均分方差∶
σ = 1 n ∑ x i 2 − ( ∑ x i n ) 2 \sigma = \frac{1}{n} \sum x^2_i - (\frac{\sum x_i}{n})^2 σ=n1∑xi2−(n∑xi)2
其中,x;为某一学生的平均分。
解:主函数的N-S图如图7.6所示。

函数 input_stu 的执行结果是给全程变量学生成绩数组 score 各元素输入初值。
函数 aver_stu 的作用是计算每个学生的平均分,并将结果赋给全程变量数组 a_stu 中各元素。函数 aver cour 的作用是计算每门课的平均成绩,计算结果存入全程变量数组a_Cur。
函数 highest的返回值是最高分,r,c 是两个全局变量,分别代表最高分所在的行、列号。该函数的N-S图见图7.7。

函数 s_var 的返回值是平均分的方差。
答案代码:
#include <stdio.h>
#define N 10
#define M 5
float score[N][M]; //全局数组
float a_stu[N], a_cour[M]; //全局数组
int r, c; //全局变量
int main()
{
int i, j;
float h; //函数声明
float s_var(void); //函数声明
float highest(); //函数声明
void input_stu(void); //函数声明
void aver_stu(void); //函数声明
void aver_cour(void);
input_stu(); //函数调用,输入 10个学生成绩
aver_stu(); //函数调用,计算 10个学生平均成绩
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:"); //输出5 门课平均成绩
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;
}
void input_stu(void) //输入 10个学生成绩的函数
{
int i, j;
for (i = 0; i < N; i++)
{
printf("\ninput score of student%2d:\n", i + 1); //学生号从1开始
for (j = 0; j < M; j++)
scanf("%f", &score[i][j]);
}
}
void aver_stu(void) //计算 10 个学生平均成绩的函数
{
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) //计算 5 门课平均成绩的函数
{
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; //数组行号i从0开始,学生号r从1开始,故r=i+1
c = j + 1; //数组列号j从0开始,课程号c从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));
}
运行结果

以上是输入 10个学生的5 门课的成绩,下面是输出结果:

题目15:写几个函数∶
①输入10 个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找法找出该职工的姓名;从主函数输入要查找的职工号,输出该职工姓名。
解:
input 函数是完成10 个职工的数据的录入。sort 函数的作用是选择法排序,其流程类似于本书习题解答第6章第 2 题。
search 函数的作用是用折半查找的方法找出指定职工号的职工姓名,其查找的算法参见本书习题解答第6章第9题。
答案代码:
#include <stdio.h>
#include <string.h>
#define N 10
int main()
{
void input(int[], char name[][8]);
void sort(int[], char name[][8]);
void search(int, int[], char name[][8]);
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;
}
void 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, temp1;
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;
temp1 = num[i];
strcpy(temp2, name[i]);
num[i] = num[min];
strcpy(name[i], name[min]);
num[min] = temp1;
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;
else
top = mid + 1;
}
if (sign == 1 || loca == -1)
printf("%d not been found.\n", n);
}
运行结果:



先输入 10个职工的号码和姓名,然后按职工号由小到大顺序排序。查询职工号为3和4的姓名。
题目16:写一个函数,输入一个十六进制数,输出相应的十进制数。
解:
主函数 main 的 N-S图如图 7.8所示。

求十进制数的函数htoi的 N-S图,如图7.9 所示。

答案代码:
#include <stdio.h>
#define MAX 1000
int main()
{
int htoi(char s[]);
int c, i, flag, flag1;
char t[MAX];
i = 0;
flag = 0;
flag1 = 1;
printf("input a HEX number:");
while ((c = getchar()) != '\0' && i < MAX && flag1)
{
if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')
{
flag = 1;
t[i++] = c;
}
else if (flag)
{
t[i] = '\0';
printf("decimal number %d\n", htoi(t));
printf("continue or not?");
c = getchar();
if (c == 'N' || c == 'n')
flag1 = 0;
else
{
flag = 0;
i = -0;
printf("\ninput a HEX number:");
}
}
}
return 0;
}
int htoi(char s[])
{
int 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);
}
运行结果:

题目17:用递归法将一个整数n转换成字符串。例如,输入 483,应输出字符串"483"。n的位数不确定,可以是任意位数的整数。
解:主函数的N-S图如图7.10 所示。

答案代码:
#include <stdio.h>
int main()
{
void convert(int n);
int number;
printf("input an integer;");
scanf("%d", &number);
printf("output:");
if (number < 0)
{
putchar('-'); //先输出一个"一"号和空格
putchar(' ');
number = -number;
}
convert(number);
printf("\n");
return 0;
}
void convert(int n) //递归函数
{
int i;
if ((i = n / 10) != 0)
convert(i);
putchar(n % 10 + '0');
putchar(32);
}
运行结果:
①:

②:

说明:如果是负数,要把它转换为正数,同时人为地输出一个"-"号。convert 函数只处理正数。假如 number 的值是345,调用 convert 函数时把 345传递给 n。执行函数体, n/10 的值(也是 i 的值)为 34,不等于 0。再调用 convert 函数,此时形参 n 的值为 34。再执行函数体,n/10 的值(也是 i 的值)为 3,不等于 0。再调用convert 函数,此时形参 n 的值为3。再执行函数体,n/10 的值(也是 i 的值)等于 0。不再调用 convert 函数,而执行 putchar (n%10+‘0’),此时 n 的值是 3,故 n%10 的值是 3(%是求余运算符),字符 ‘0’ 的ASCII代码是 48,3 加 4 等于 51,51 是字符’3’的 ASCII代码,因此 putchar(n%10+’0’)输出字符 ‘3’。接着 putchar(32)输出一个空格,以使两个字符之间用空格分隔。
然后,流程返回到上一次调用 convert 函数处,应该接着执行 putchar(n%10+’0’),注意此时的 n 是上一次调用 convert 函数时的 n,其值为 34,因此 n%10 的值为 4,再加 ‘0’ 等于 52,52 是字符 ‘4’ 的 ASCII 代码,因此 putchar(n%10+’0’)输出字符 ‘4’ ,接着 putchar(32)输出一个空格。
流程又返回到上一次调用 convert 函数处,应该接着执行 putchar(n%10+’0’),注意此时的 n是第1 次调用 convert 函数时的 n ,其值为 345 ,因此 n%10 的值为5,再加 ‘0’ 等于53,53 是字符 ‘5’ 的 ASCII 代码,因此 putchar(n%10+’0’)输出字符 ‘5’ ,接着 putchar(32)输出一个空格。
至此,对 convert 函数的递归调用结束,返回主函数,输出一个换行,程序结束。
putchar(n%10+’0’)也可以改写为 putchar(n%10+48),因为 48 是字符 ‘0’ 的 ASCII 代码。
题目18:给出年、月、日,计算该日是该年的第几天。
解:主函数接收从键盘输入的日期,并调用 sum_day 和 leap 函数计算天数。其 N-S图见图7.11。sum_day 计算输人日期的天数。leap 函数返回是否为闰年的信息。

答案代码:
#include <stdio.h>
int main()
{
int sum_day(int month, int day);
int leap(int year);
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); //调用函数 sum_day
days = sum_day(month, day); //调用函数 leap
if (leap(year) && month >= 3)
days = days + 1;
printf("is the %dth day in this year.\n", days);
return 0;
}
int sum_day(int month, int day) //函数 sum_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);
}
int leap(int year) //函数leap∶判断是否为闰年
{
int leap;
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
return (leap);
}
运行结果:

版权声明
本文为[RubyHan1314]所创,转载请带上原文链接,感谢
https://blog.csdn.net/hanru723/article/details/124289351
边栏推荐
猜你喜欢

Impact of AOT and single file release on program performance

Xamarin效果第二十一篇之GIS中可扩展浮动操作按钮

Ide-idea-problem

be based on. NETCORE development blog project starblog - (1) why do you need to write your own blog?

Mise en service PID du moteur de codage (anneau de vitesse | anneau de position | suivant)

How does Microsoft solve the problem of multiple programs on PC side -- internal implementation

MYSQL05_ Ordr by sorting, limit grouping, group by grouping

Fight leetcode again (290. Word law)

Xamarin效果第二十二篇之录音效果

一套组合拳,打造一款 IDEA 护眼方案
随机推荐
Find the number of leaf nodes of binary tree
使用DFS来解决“字典序排数”问题
First in the binary tree
Yes Redis using distributed cache in NE6 webapi
Xamarin效果第二十二篇之录音效果
先中二叉建树
TP5 where query one field is not equal to multiple values
MYSQL03_ SQL overview, rules and specifications, basic select statements, display table structure
Mise en service PID du moteur de codage (anneau de vitesse | anneau de position | suivant)
Blazor University (11) component - replace attributes of subcomponents
編碼電機PID調試(速度環|比特置環|跟隨)
Aspnetcore configuration multi environment log4net configuration file
If the deep replication of objects is realized through C #?
c#语法糖模式匹配【switch 表达式】
利用栈的回溯来解决“文件的最长绝对路径”问题
Response processing of openfeign
C WPF UI framework mahapps switching theme
The whole network is the most complete. How to do interface automation test? Proficient in interface automation test details
求二叉树的叶子结点个数
OLED多级菜单记录