1.以下程序的正确运行结果是( )。
int f(int a);
int main(void)
{
int a = 2,i;
for(i = 0; i < 3; i++)
printf("%4d", f(a));
}
int f(int a)
{
int b = 0;
static int c = 3;
b++;
c++;
return (a+b+c);
}
A. 777 B. 7 10 13 C. 7 9 11 D. 7 8 9
答案:D。
解析:循环三次,b每次都被重新赋值为0
2.在一个被调用函数中,关于return语句使用的描述,( )是错误的
A. 被调用函数中可以不用return语句
B. 被调用函数中可以使用多个return语句
C. 被调用函数中,如果有返回值,就一定要有return语句
D. 被调用函数中,一个return语句可以返回多个值给调用函数
答案:D。
3.以下程序的运行结果为( )
#include <stdio.h>
#include <string.h>
int SubCount(char *dest, int count)
{
strcpy(dest, "555");
count++;
return 0;
}
int main()
{
int count = 3;
char caBuf[8];
SubCount(caBuf, count);
printf("%d\n", count);
return 0;
}
A. 8 B. 4 C. 3 D. 5
答案:C。
解析:值传递,形参变化,实参不变,输出的是实参。
4.请问运行Test函数会有什么样的结果?
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
答案:段错误。
5.分析以下程序,写出运行结果并写出过程
#include <stdio.h>
#include <stdlib.h>
void getalloc(char *p)
{
p = (char *)malloc(100);
strcpy(p, "hello world");
}
int main()
{
char *str = NULL;
getalloc(str);
printf("%s\n",str);
free(str);
return 0;
}
答案:并不会输出hello world,因为在 getalloc 函数中p是str的副本。对p的修改(如分配内存)只影响p本身,而不会影响main函数中的 str。
6.下列程序的输出结果是________。
fun(int a, int b, int c)
{
c = a*b;
}
void main()
{
int c = 10;
fun(2,3,++c);
printf("%d\n", c);
}
答案:11。
解析:值传递。
7.找错题,说明那里错了
void test1()
{
char string[10];
char *str1 = "0123456789";
strcpy( string, str1 );
}
答案:strcpy(string,str1)错误,str1的字节大小为11,string装不下,注意'\0'。
8.下面的代码片段会输出
{
char *p = NULL;
strcpy(p, "hello");
printf("%s", p);
}
答案:段错误。
9.sizeof(str); 的值是多少?
void Func(char str[100])
{
sizeof(str);
}
答案:32位操作系统返回4,64位操作系统返回8。将str[]视为*str。
10:递归函数最终会结束,那么这个函数一定( );
A. 使用了局部变量
B. 有一个分支不调用自身
C. 使用了全局变量或者使用了一个或多个参数
答案:B。
11.程序如下,程序执行后的输出结果是:
int f(int x, int y)
{
return (y-x)*x;
}
void main()
{
int a = 3,b=4,c=5,d;
d=f(f(3,4),f(3,5));等价于fun(3,6)
printf("%d\n", d);
}
答案:fun(3,6)=(6-3)*3=9。
12.请判断下面程序输出的值是多少?
int func(int a)
{
static int b = 0;
b+=a;//注意b是静态局部变量只被赋值一次不会被重新赋值。
return b;
}
int main(void)
{
printf("%d %d\n", func(1)+func(3), func(5));func(1)=1,func(3)=1+3,fun(5)=4+5
}
答案:5,9。
13.这段程序的输出是(________)
void f1(int *, int);
void f2(int *, int);
void(*p[2]) (int *, int); //函数指针数组
main()
{
int a;
int b;
p[0] = f1;
p[1] = f2;
a=3;
b=5;
p[0](&a, b);//a变b不变。
printf("%d\t %d\t", a, b);
p[1](&a, b);//a变b不变。
printf("%d\t %d\t", a, b);
}
void f1(int * p, int q)
{
int tmp;
tmp = *p;
*p = q;
q = tmp;
}
void f2(int *p, int q)
{
int tmp;
tmp = *p;
*p = q;
q = tmp;
}
A. 5 5 5 5 B. 3 5 3 5 C. 5 3 5 3 D. 3 3 3 3
答案:A。
14.有以下程序段, x=7执行后的值为 ( )
int fun(int x) {
int p;
if(x==0||x==1)
return(3);
p=x-fun(x-2);//递归函数P=7-5+3-3=2
return p;
}
A. 0 B. 2 C. 5 D. 6
答案:B。
15.有以下函数,该函数的返回值是:( )
char *fun(char *p)
{
return p;
}
A. 无确切的值 B. 形参 p 中存放的地址值
C. 一个临时存储单元的地址 D. 形参 p 自身的地址值
答案:B。
16.编写strcpy函数
已知strcpy 函数的原型是
char *strcpy(char *strDest,const char *strSrc);其中 strDest 是目的字符串,strSrc 是源字符串。
(1)、不调用 C 的字符串库函数,请编写函数 strcpy。
(2)、strcpy 能把 strSr 的内容复制到 strDest,为什么还有 char"类型的返回值?
答案:返回strdest的地址。
(3)、strcpy 和 memcpy 的区别。
答案:strcpy是用于复制字符串,遇到空字符\0终止。memcpy是用于复制指定大小内的内存块,不受空字符影响,需要明确提供复制的大小。
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> char *my_cpy(char *s1,char *s2); int main(int argc, const char *argv[]) { char a[100]="abcdef"; char b[100]="efghjkl"; printf("a=%s\n",a); printf("b=%s\n",b); printf("cpy后的a=%s\n",my_cpy(a,b)); return 0; } char *my_cpy(char *s1,char *s2){ char *p=s1; while(*s2!='\0'){ *s1=*s2; s1++; s2++; } *s1='\0'; return p; }
执行结果展示:
17.请实现一个函数,输入一个整数,输出该数二进制表示中的1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int fun(int a); int a; int count=0; int main(int argc, const char *argv[]) { printf("请输入一个整数:"); scanf("%d",&a); printf("%d转化为二进制中1的个数有%d个\n",a,fun(a)); return 0; } int fun(int a){ if(a%2==1){ count++; } if(a==1||a==0){ return count; }else{ fun(a/2); } }
执行结果展示:
18.请用编写递归算法计算fibinacci数列第1000位的值。斐波拉契数列为1,1,2,3,5,8,13,21,……
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> long long int fbnq(int n); int main(int argc, const char *argv[]) { int n; printf("请输入你想要的斐波那契数列的位数:"); scanf("%d",&n); printf("第%d位的斐波那契数列的值为:%lld\n",n,fbnq(n)); return 0; } long long int fbnq(int n) { if(n==1||n==2){ return 1; }else{ return fbnq(n-2)+fbnq(n-1); } }
19.用 C 语言写一个递归算法求 N!
代码展示:
#include <stdio.h> #include <string.h> #include <stdlib.h> long long int fun(int N); int main(int argc, const char *argv[]) { int N; printf("请输入N:"); scanf("%d",&N); printf("%d!=%lld\n",N,fun(N)); return 0; } long long int fun(int N) { if(N==0||N==1){ return 1; }else{ return N*fun(N-1); } }
执行结果展示: