你也能够上程序咖 (https://meta.chengxuka.com),关上大学幕题板块,岂但有答案,解说,还能够在线答题。
一、选择题
1. 在 C 语言程序中,若对函数类型未加显式阐明,则函数的隐含类型为()。
A. void
B. double
C. char
D. int
答:D
解析:在不返回后果的函数定义中,void 不能省略;否则,函数类型被默认定义为 int。
2. 以下正确的说法是()。
A. 实参加其对应的形参独特占用一个存储单元
B. 实参加其对应的形参各占用独立的存储单元
C. 只有当实参加其对应的形参同名时才占用一个独特的存储单元
D. 形参是虚构的,不占用内存单元
答:B
解析:依照 C 语言的规定,在参数传递过程中,将实参的值复制给形参。所以他们各自占用独立的存储单元。
3. 以下不正确的说法是()。
A. 实参能够是常量、变量或表达式
B. 实参能够是任何类型
C. 形参能够是常量、变量或表达式
D. 形参应与对应的实参类型统一
答:B
解析:实参和形参一一对应,数量应雷同,程序应统一。实参能够是常量、变量或表达式。
4. 在函数调用 Fume(exp1, exp2+exp3, exp4*exp5)
中,实参的数量是()。
A.3
B.4
C.5
D. 语法错误
答:A
解析:参数应用逗号宰割,所以题目中是 3 个参数。
5. 下列程序的输入后果是()。
fun(int a, int b, int c)
{c = a * b;}
int main(void)
{
int c;
fun(2, 3, c);
printf("%d\n", c);
return 0;
}
A.0
B.1
C.6
D. 无奈确定
答:D
解析:在 main() 中,变量 c 并没有初始值,因为它是局部变量,在没有初始化的时候,零碎会调配随机值。在调用函数时,这里将数值 2,3,c 作为实参传递给形参 a,b,c。在函数中 c 的值为 a *b
是 6,然而不影响 main() 中变量 c 的值。main() 中的打印变量 c 的值,还是最后零碎调配的那个随机值。
6. 以下程序的运行后果是()。
int x = 5, y = 6;
void incxy()
{
x++;
y++;
}
int main(void)
{
int x = 3;
incxy();
printf("%d,%d\n", x, y);
return 0;
}
A.3,6
B.4,7
C.3,7
D.6,7
答:C
解析:
首先剖析变量,第一行定义了两个变量 x 和 y,值别离是 5 和 6。这是两个全局变量。就是在所有的函数中都能够应用。而后是自定义函数 incxy(),外面就 2 行代码,x++ 和 y++。而后是 main(),而实际上程序是从 mian() 函数开始执行,这里先定义了一个变量,也叫 x,初始值为 3,而后调用自定义函数 incxy(),执行函数后,x 和 y 别离子增 1,这里的 x 和 y 也就是下面的全局变量,所以自定义函数执行完结后,全局变量 x 和 y 的值别离是 6 和 7。自定义函数完结后,main() 持续向下执行,打印 x 和 y 的值,那么这个 x,是哪个呢?依据 C 语言的规定,当一个函数中,局部变量和全局变量名雷同的时候,那么函数中操作的是局部变量,所以打印的是 main() 外面定义的局部变量 x 的值为 3,而 y,在 main() 没有定义,那么天然就是全局变量 y 值为 7。
二、填空题
1. 下列程序的输入后果为()。
int funp(int m);
int main(void)
{
int n;
for(n=1; n<10; n++)
if(funp(n)==1) printf("%d#", n);
return 0;
}
int funp(int m)
{
int i;
if(m==2||m==3) return 1;
if(m<2|| m%2==0) return 0;
for(i=3; i<m; i=i+2)
if(m%i==0) return 0;
return 1;
}
答:2#3#5#7#
解析:
main() 中次要就是一个 for 循环,变量 n 的值从 1 累加到 10 后,完结循环。
第一次循环 n 为 1,循环条件成立,执行循环体,循环里是一个 if 语句,if 条件是一个函数调用 funp(),判断函数的返回值是否为 1。将 n 的值为 1,作为参数,传递给自定义函数,形参 m 的值就是 1。该函数中,当 m 的值为 1 时第一个 if 语句条件不成立,第二个 if 语句条件成立,因为 m < 2,函数返回 0。回到 main() 的循环中,if 语句的条件就不成立了。而后 n++,n 的值为 2。
第二次循环 n 为 2,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 2。那么在自定义函数中 m 的值就是 2。第一个 if 语句条件成立,自定义函数返回值为 1。回到 main() 的循环中,if 语句的条件成立,打印 2#。而后 n++,n 的值为 3。
第三次循环 n 为 3,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 3。那么在自定义函数中 m 的值就是 3。第一个 if 语句条件成立,自定义函数返回值为 1。回到 main() 的循环中,if 语句的条件成立,打印 3#。而后 n++,n 的值为 4。
第四次循环 n 为 4,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 4。那么在自定义函数中 m 的值就是 4。第一个 if 语句条件不成立,第二个 if 语句条件成立,自定义函数返回值为 0。回到 main() 的循环中,if 语句的条件就不成立了。而后 n++,n 的值为 5。
第五次循环 n 为 5,循环条件成立,执行循环体,判断 if 语句的条件,调用函数,传入的实参的值为 5。那么在自定义函数中 m 的值就是 5。第一个 if 语句条件不成立,第二个 if 语句条件也不成立,进入 for 循环,整个循环完结也没有返回值,那么执行最初的 return 1。回到 main() 的循环中,if 语句的条件成立,打印 5#。而后 n++,n 的值为 6。
往下顺次类推。。。
2. 判断正整数的各位数字是否按从小到大排列。输出一批正整数(以零或正数为完结标记),判断每个数从高位到低位的各位数字是否按值从小到大排列。要求定义和调用函数 fun(m) 判断 m 中各位数字是否按值从小是小到大排列,满足条件返回 1,否则返回 0。请填空。
_________________;
int main(void)
{
int n;
scanf("%d", &n);
while (n > 0)
{if (_________________)
{printf("%d 中各位数字按从小到大排列 \n", n);
}
else
{printf("%d 中各位数字没有按从小到大排列 \n", n);
}
scanf("%d", &n);
}
return 0;
}
int fun(_________________)
{
int cur_digit, old_digit = m % 10;
while (m > 10)
{
_________________;
cur_digit = m % 10;
if (cur_digit >= old_digit)
{return 0;}
_________________;
}
return 1;
}
答:
int fun(int m)
fun(n)
int m
m = m / 10
old_digit = cur_digit
解析:
因为函数的定义在上面,那首先须要函数申明,所以第一行先申明函数。在 main() 的 if 语句中调用函数。这个自定义函数是须要传入参数的,所以第三个空是定义参数 m。自定义函数里的思路就是循环获取数值的每个位上的数字,判断是否从小到大排序。
3. 输入 Yes 或 No。输出字符 ‘y’,或 ‘Y’,则在屏幕上输入字符串 “Yes. ” ; 输出其余字符,则在屏幕上输入字符串 “No! ”。要求定义和调用函数 YesNo(ch),当 ch 为 ‘y’ 或 ‘Y’ 时输入 “Yes. ”,当 ch 为其余字符时输入 “No! ”。请填空。
void YesNo(_________________)
{switch (ch)
{
case 'y':
case 'Y':
_________________
default:
_________________
}
}
int main(void)
{
char ch;
printf("Please input a character: \n");
ch = getchar();
_________________
return 0;
}
答:
char ch
printf(“Yes.”); break;
printf(“No!”);
YesNo(ch);
解析:
自定义函数,次要是用来判断输出的字符是否是 y 或者 Y 的。所以须要通过参数传入,那么在定义函数的时候须要形参,所以第一个空是定义参数。而后进行判断字符是否是 y 或 Y。如果是打印 “Yes. “,其余的字符都打印 “No! “,那么写在 default 里就能够了。最初在 main() 中调用该函数。
三、程序设计题
题目 1:应用函数计算分段函数的值:输出 x,计算并输入下列分段函数 f(x) 的值。要求定义和调用函数 sign(x) 实现该分段函数。试编写相应程序。
$$
f(x)=
\begin{cases}
1 & (x \gt 0) \\
0 & (1 = 0) \\
-1 & (x \lt 0)
\end{cases}
$$
答案代码:
#include <stdio.h>
int sign(int x)
{
int f;
if (x < 0)
{f = -1;}
else if (x > 0)
{f = 1;}
else
f = 0;
return f;
}
int main(void)
{// 习题 (5.3.1)
/*
应用函数计算分段函数的值:输出 x,计算并输入下列分段函数 f(x) 的值。要求定义和调用函数 sign(x) 实现该分段函数。*/
int x, y;
printf("input x:");
scanf("%d", &x);
y = sign(x);
printf("f(x) = %d\n", y);
return 0;
}
运行后果:
题目 2:应用函数求奇数和:输出一批正整数(以零或正数为完结标记),求其中的奇数和。要求定义和调用函数 even(n) 判断数的奇偶性,当 n 为偶数时返回 1,否则返回 0。试编写相应程序。
答案代码:
#include <stdio.h>
int even(int n)
{if (n % 2 == 0)
{return 1;}
else
return 0;
}
int main(void)
{// 习题 (5.3.2)
/*
应用函数求奇数和:输出一批正整数(以零或正数为完结标记),求其中的奇数和。要求定义和调用函数 even(n) 判断数的奇偶性,当 n 为偶数时返回 1,否则返回 0。*/
int n, sum = 0;
printf("input n:\n");
while (n > 0)
{scanf("%d", &n);
if (even(n) == 0) // 调用函数返回值为 0 时,奇数和。当 even(n)== 1 时,偶数和。{sum += n;}
}
printf("sum= %d\n", sum);
return 0;
}
运行后果:
题目 3:应用函数计算两点间的间隔:给定立体任意两点坐标 (x1, y1) 和 (x2, y2),求这两点之间的间隔 (保留 2 位小数)。要求定义和调用函数 dist(x1, y1, x2, y2) 计算两点间的间隔。试编写相应程序。
答案代码:
#include <stdio.h>
#include <math.h>
double dist(double x1, double y1, double x2, double y2)
{
double s = 0;
s = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
return s;
}
int main(void)
{// 习题 (5.3.3)
/*
应用函数计算两点间的间隔:给定立体任意两点坐标 (x1, y1) 和 (x2, y2),求这两点之间的间隔 (保留 2 位小数)。要求定义和调用函数 dist(x1, y1, x2, y2) 计算两点间的间隔。*/
double x1, y1, x2, y2, dis;
printf("input x1,y1,x2,y2:");
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
dis = dist(x1, y1, x2, y2);
printf("两点之间的间隔是: %.2lf\n", dis);
return 0;
}
运行后果:
题目 4:利用函数计算素数个数并求和:输出两个正整数 m 和 n (1≤m, n≤500),统计并输入 m 和 n 之间的素数的个数以及这些素数的和。要求定义并调用函数 prime(m) 判断 m 是否为素数。试编写相应程序。
答案代码:
#include <stdio.h>
#include <math.h>
// 判断 m 是否为素数
int prime(int m)
{
int j;
// 质数定义为在大于 1 的自然数中,除了 1 和它自身以外不再有其余因数。if (m == 1)
{return 0;}
// 判断除 1 外的自然数
for (j = 2; j <= sqrt(m); j++)
{if (m % j == 0)
{return 0;}
}
return 1;
}
int main(void)
{// 习题 (5.5.4)
/*
利用函数计算素数个数并求和:输出两个正整数 m 和 n (1≤m, n≤500),统计并输入 m 和 n 之间的素数的个数以及这些素数的和。要求定义并调用函数 prime(m) 判断 m 是否为素数。*/
int m = 1, n = 100, i, sum = 0, count = 0;
printf("input m,n(m>=1,n<=500):");
scanf("%d%d", &m, &n);
for (i = m; i <= n; i++) // 将 i 的值传到自定义函数里
{if (prime(i) == 1)
{
sum += i;
count++;
}
}
printf("%d~%d 之间的素数个数为 %d, 和为 %d\n", m, n, count, sum);
return 0;
}
运行后果:
题目 5:应用函数统计指定数字的个数:读入一个整数,统计并输入该数中“2”的个数。要求定义并调用函数 countdigit(number, digit),它的性能是统计整数 number 中数字 digit 的个数。例如,countdigit(12 292, 2) 的返回值是 3。试编写相应程序。
答案代码:
#include <stdio.h>
int countdigit(int number, int digit)
{
int count = 0;
while (number > 0)
{if (number % 10 == 2)
{count++;}
number = number / 10;
}
return count;
}
int main(void)
{// 习题 (5.3.5)
/*
应用函数统计指定数字的个数:读入一个整数,统计并输入该数中“2”的个数。要求定义并调用函数 countdigit(number, digit),它的性能是统计整数 number 中数字 digit 的个数。例如,countdigit(12 292, 2) 的返回值是 3。*/
int number, digit = 2, count;
printf("input number:");
scanf("%d", &number);
count = countdigit(number, digit);
printf("%d 中的 %d 的个数为 %d\n", number, digit, count);
return 0;
}
运行后果:
题目 6:应用函数输入水仙花数:输出两个正格数 m 和 n (1≤m, n≤1000) 输入 m~n 之间的所有满足各位数字的立方和等于它自身的数。要求定义并调用函数 is(number) 判断 number 的各位数字之立方和是否等于它自身。试编写相应程序。
答案代码:
#include <stdio.h>
#include <math.h>
int is(int number)
{
int x, sum, y;
y = number;
sum = 0;
do
{
x = y % 10;
sum += pow(x, 3);
y = y / 10;
} while (y > 0);
if (sum == number)
{return sum;}
else
return 0;
}
int main(void)
{// 习题 (5.5.6)
/*
应用函数输入水仙花数:输出两个正格数 m 和 n (1≤m, n≤1000) 输入 m~n 之间的所有满足各位数字的立方和等于它自身的数。要求定义并调用函数 is(number) 判断 number 的各位数字之立方和是否等于它自身。*/
int m, n, i, result = 0;
printf("input m,n(m>=1,n<=1000):");
scanf("%d%d", &m, &n);
for (i = m; i <= n; i++)
{result = is(i);
if (result >= m && result <= n)
{printf("%d\n", result);
}
}
return 0;
}
运行后果:
题目 7:应用函数求余弦函数的近似值:输出精度口,用下列公式求 cosx 的近似值,准确到最初项的绝对值小于 e。要求定义和调用函数 funcos(e,x) 求余弦函数的近似值。试编写相应程序。
$$
cosx = \frac{x^0}{0!}-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+…
$$
答案代码:
#include <stdio.h>
#include <math.h>
double fact(int n)
{
int i;
double f = 1;
for (i = 1; i <= n; i++)
{f *= i;}
return f;
}
double fumcos(double e, double x)
{
int flag = 1, i = 0;
double cosx = 0, item = 1; // item 必须为 1,能力进 while 循环。cosx 为 0,则间接从第一项开始累加
while (fabs(item) >= e)
{item = flag * pow(x, i) / fact(i);
cosx += item;
i += 2;
flag = -flag;
}
cosx += item;
return cosx;
}
int main(void)
{// 习题 (5.5.7)
/*
应用函数求余弦函数的近似值:输出精度口,用下列公式求 cosx 的近似值,准确到最初项的绝对值小于 e。要求定义和调用函数 funcos(e,x) 求余弦函数的近似值。*/
double e, x, sum;
printf("input e,x:");
scanf("%lf%lf", &e, &x);
sum = fumcos(e, x);
printf("cosx = %lf\n", sum);
return 0;
}
运行后果:
题目 8:输出一个正整数 n,输入 n 行空心的数字金字塔。要求定义和调用晒数 hollow_pyramid(n) 输入 n 行空心的数字金字塔。当 n=5 时,5 行空心的数字金字塔如下所示。
1
2 2
3 3
4 4
555555555
答案代码:
#include <stdio.h>
void hollow_pyramid(int n)
{
int i, j;
for (i = 1; i < n; i++) // 共 n - 1 行
{for (j = 1; j <= n - i; j++) // 上三角空格
{printf(" ");
}
printf("%d", i); // 左斜下数字, 只打印一个数字,不必在内循环里
if (i == 1)
{printf("\n");
continue;
}
for (j = 1; j <= 2 * (i - 1) - 1; j++) // 两头三角空格 .i= 2 时,j=1;i= 3 时,j=3
{printf(" ");
}
printf("%d", i); // 右斜下数字
printf("\n");
}
for (j = 1; j <= 2 * n - 1; j++) // 底层数字
{printf("%d", n);
}
printf("\n");
}
int main(void)
{// 习题 (5.3.8)
/*
输出一个正整数 n,输入 n 行空心的数字金字塔。要求定义和调用晒数 hollow_pyramid(n) 输入 n 行空心的数字金字塔。*/
int n;
printf("input n:");
scanf("%d", &n);
hollow_pyramid(n);
return 0;
}
运行后果: