第一题
题⽬:以下正确的说法是( )。
A. 定义函数时,形参的类型说明可以放在函数体内。
B. return后边的值不能为表达式。
C. 如果函数值的类型与返回值类型不⼀致,以函数值类型为准。
D. 如果形参与实参类型不⼀致,以实参类型为准。
答案:C
原因:
A选项错误在于,形参的类型说明不能放在函数体内。在C中,形参的类型说明在函数声明部分进行定义,而不是在函数体中。
B选项错误在于,return语句后面的值不能为表达式。在C中,return语句用于返回函数值,其后面的值应该是一个常量或者一个常量的表达式。
C. 如果函数值的类型与返回值类型不⼀致,以函数值类型为准。
D选项错误在于,形参与实参类型不匹配时,以实参类型为准。在C中,如果形参与实参类型不匹配,编译器会报错提示类型不匹配。因此,D选项中“以实参类型为准”是不正确的。正确的说法是,如果形参与实参类型不匹配,以形参类型为准。
第二题
题⽬:若调⽤⼀个函数,且此函数中没有return语句,则正确的说法是:该函数()。
A. 没有返回值
B. 返回若⼲个系统默认值
C. 能返回⼀个⽤户所希望的值
D. 返回⼀个不确定的值
答案:A
原因:
因为C语言规定,如果一个函数没有return语句,那么它的返回值是undefined。因此,在这种情况下,函数不会返回任何值。
第三题
题⽬:有以下程序,程序运⾏后的输出结果是()。需附上简要解释。
float fun(int x, int y)
{
return (x + y);
}
void main()
{
int a = 2,b = 5,c = 8;
printf("%3.0f\n", fun((int) fun(a + c, b), a - c));
}
解释:
1.定义一个名为 fun 的函数,该函数接受两个整数参数 x 和 y,并返回它们的和。
2.在 main 函数中,定义了三个整数变量 a、b 和 c,它们的值分别为 2、5 和 8。
3.调用 fun 函数,将 a + c 和 b 的值作为参数传递,并将结果存储在变量 x 中。
4.调用 fun 函数,将 x 和 a - c 的值作为参数传递,并将结果存储在变量 y 中。
5.输出 y 的值,格式化输出为 3 位小数。
输出结果:
根据上述代码,我们可以得到输出结果为 9。
第四题
题⽬:有以下程序,程序运⾏后的输出结果是()。
#include <stdio.h>
int f(int n)
{
if (n == 1)
return 1;
else
return f(n - 1) + 1;
}
void main()
{
int i, j = 0;
for (i = 1; i < 3; i++)
j += f(i);
printf("%d\n", j);
}
解释:
1.定义一个名为 f 的函数,该函数接受一个整数参数 n,并返回 n 的斐波那契数。
2.在 main 函数中,定义了一个整数变量 j 并将其初始化为 0。
3.定义了一个循环变量 i,并将其初始化为 1。循环内执行以下操作:
4.将 i 的值递增 1。
5.将 j 的值递增 f(i)。
5.循环结束后,输出 j 的值。
输出结果:
根据上述代码,我们可以得到输出结果为 3。因为在循环中,j 的值在第一次迭代时加上了 f(1) = 1,第二次迭代时加上了 f(2) = 2,所以最终 j 的值为 3。
第五题
编写⼀个函数palindrome , 该函数⽤于判断⼀个数是是回⽂数。然后在主函数中使⽤该函数,判断位数为5的正整数的回⽂数数量。
#include <stdio.h>
#include <stdlib.h>
int palindrome(char *s);
int main()
{
char s[20];
scanf("%s", s);
if (palindrome(s))
printf("YES\n");
else
printf("NO\n");
system("pause");
return 0;
}
int palindrome(char *s)
{
int i,strat, end;
for (i = 0; s[i] != '\0'; i++);
for (strat = 0, end = i - 1; strat < end; strat++, end--){
if (s[strat] != s[end])
return 0;
}
return 1;
}
解释:
在main函数中,程序首先创建了一个长度为20的字符数组s,然后调用scanf函数从用户输入中读取字符串,并将其存储在s数组中。接着调用palindrome函数检查字符串是否是回文,并根据结果输出"YES"或"NO"。最后调用system函数暂停程序的执行,并返回0。
palindrome函数用于检查一个字符串是否是回文。函数首先定义了一个整数变量i,用于遍历字符串中的每个字符。然后使用一个for循环遍历字符串,直到字符串的最后一个字符被遍历。
在for循环内部,程序定义了两个变量strat和end,分别表示回文检查的起始和结束位置。然后使用另一个for循环遍历字符串的子串,从起始位置strat到结束位置end。在每次迭代中,程序检查子串中的第一个字符和最后一个字符是否相等。如果不相等,函数返回0,表示字符串不是回文。如果所有字符都相等,函数返回1,表示字符串是回文。
在main函数中,程序调用palindrome函数并检查返回值。如果返回值为1,表示字符串是回文,输出"YES",否则输出"NO"。
第六题
编写⼀个函数symPalindrome , 该函数⽤于判断⼀个数是否1对称回⽂数。然后在主函数中使⽤该函数,判断位数为5的正整数的对称回⽂数
#include <stdio.h>
#include <stdlib.h>
int syPalindrome(long long num, int n); // n 嵌套层数
int main()
{
int sum = 0, judge = 0;
for (long long i = 10000; i <= 99999; i++){
sum += syPalindrome(i, 2);
}
printf("第五位共有%d个对称回文数,分别是:", sum);
for (long long i = 10000; i <= 99999; i++){
if (syPalindrome(i, 2)){
if (judge)
printf("、");
printf("%d", i);
judge = 1;
}
}
printf("。\n");
system("pause");
return 0;
}
// 通用回文判断(几位都可以)
int syPalindrome(long long num, int n)
{
if (n){
long long start = 1, end = 1; // 定义回文数的起始位置和结束位置
for (end = 1; num / (end * 10) != 0; end *= 10); // 计算num的位数
// 判断num是否是回文数
while (end > start){
// 如果num不是回文数,则返回0
if ((num % (end * 10)) / end != (num % (start * 10)) / start)
return 0;
start *= 10;
end /= 10;
}
if (syPalindrome(num * num, --n))// 递归调用函数,判断num的平方是否是回文数
return 1;
else
return 0;
}
return 1; // 如果num是回文数,则返回1
}
运行效果
解释:
在main函数中,程序首先初始化两个整数变量sum和judge,用于记录回文数的总数和当前是否已经输出过回文数。然后使用一个for循环遍历数字10000到99999,并调用syPalindrome函数判断每个数字是否是回文数。如果一个数字是回文数,则将其加到sum变量中。
syPalindrome函数用于判断一个数字是否是回文数。函数首先检查n(嵌套层数) 是否大于0,如果是,则表示需要判断数字的位数。如果n大于0,则使用一个for循环计算数字的位数,并判断数字是否是回文数。如果数字是回文数,则递归调用函数判断数字的平方是否是回文数。如果数字和数字的平方都是回文数,则返回1,否则返回0。如果n等于0,则表示需要判断数字是否是回文数,如果是,则返回1,否则返回0。
在main函数中,程序调用syPalindrome函数并检查返回值。如果返回值为1,表示数字是回文数,将其加到sum变量中。如果返回值为0,表示数字不是回文数,跳过此次循环。
对称回⽂数指某数与其平⽅都是回⽂数。例如:11的平方是121,111的平方是12321,它们都是对称回文数。 ↩︎