C自测题
来源:互联网 发布:赵丽颖为什么能红 知乎 编辑:程序博客网 时间:2024/05/23 00:48
C语言考试题(V2.0)
PS:机器运行环境32位系统。
一、 填空题:
1、 执行一下程序,while循环执行次数( 0)(1分)。
int k = 0; while (!(k = 1)) { k++}
//不进入循环体
2、 有定义:char p[] = {‘a’, ‘b’, ‘c’}, *q = p; 在下面找出一个不能计算出char型数据所占字节数的表达式是(sizeof(p))(1分)。
sizeof(p) sizeof(char) sizeof(*q) sizeof(p[0])
3、 若定义:int a[9], *p = a; 不能表示a[1]地址表达式的是( a++ )(1分)。
p + 1 a + 1 a++(不存在,数组名不能做左值) ++p
4、 (2分)改错:从指定的字符串中删除指定的字符,同一字母的大小写按不同的字符处理。
void func(char p[], char c){ int i , j; for (i=0; p[i]=='\0'; i++)//p[i]!='\0'{if (c != p[i]){p[j++] = p[i];//j没有初始化0}} }
5、 (4分)在一个32位的计算机中,计算下面的值。
void main(void){ struct { char c; int a; char b;}B;char *s1 = “0123456789”;char s2[] = “0123456789”;char s3[100] = “0123456789”;int s4[100];char q1[] = “abc”;char q2[] = “a\n”;char *q3 = “a\n”;int len1 = sizeof(s1);//11int len2 = sizeof(s2);//11int len3 = sizeof(s3);//100int len4 = sizeof(s4);//400int len5 = sizeof(q1);//4int len6 = sizeof(q2);//3int len7 = sizeof(q3);//3int len8= sizeof(B);//2}
6、 (2分)
int func(x){int countx = 0;while(x){countx ++;x = x&(x-1);} return countx;} 假定x = 9999。写出下面程序的运算结果( 8 ).///9999 = 0010 1110 0000 1111,1置0八次,countx=8
7、(4分)
int a[5] = {1, 3, 5, 7, 9};int *p1 = a + 1;int *p2 = (int *)(&a + 2);printf("%d.\n", *(p1+1));//*(p1+1)=a[2]=5printf("%d.\n", *p1++);//*p1 = a[2] =5 ; *p1 = *p1++ = a[3]printf("%d.\n", ++(*p1));//此时*p1 = a[3]; ++(*p1) = a[3] +1 = 7+1 = 8;printf("%d.\n", *(p2-8)); //5
8、(3分)(1)、func(char *a){} 解释:传递的是字符串首元素的地址。
(2)、func(char a[]){} 解释:传递的是数组首元素的地址。
(3)、func(char a[8]){} 解释:传递的是数组第8个元素的地址。
9、(3分)分别写出int,float,指针类型的变量a 与“零”的比较语句。
int a ==0;float a == 0.0;int *a == NULL;
10、(2分)下面代码输出什么,为什么?
void func(void) { unsigned int a = 6; char b = -20; if (a + b > 6)//隐式转换 char类型的b先转换成unsigned int型再计算 { printf(“> 6.\n”);}else{printf(“< 6.\n”);}}
11、(2分)int a = -9; 那么按位取反和按逻辑取反是多少。
按位取反是8,逻辑取反是0
12、(2分)请说出const与#define 相比,有何优点?
http://blog.csdn.net/jinhongdu/article/details/8052687
13、(2分)简述数组与指针的区别?
http://blog.csdn.net/kaifaword/article/details/43647775
14、(2分)What will be printed as the result of the operation below:
main(){ char *ptr = ” Cisco Systems”; *ptr++; printf(“%s\n”,ptr); ptr++; printf(“%s\n”,ptr); } 写出输出结果:isco Systemssco Systems
15、(2分)101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
16、(2分)完成字符串拷贝可以使用strcpy 及 memcpy 函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?
http://blog.csdn.net/ycguhang/article/details/8592580
17、(5分)请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:
#include <stdio.h>#include <stdlib.h>int main(void){ char a[30]; char *b = (char *)malloc(20 * sizeof(char)); printf("%d\n", sizeof(a));//30,对数组返回整个数组的大小 printf("%d\n", sizeof(b));//4,指针大小,32位 printf("%d\n", sizeof(a[3]));//1,a[3]是char类型,1 printf("%d\n", sizeof(b+3));//4,b+3是指针运算,结果还是指针,4 printf("%d\n", sizeof(*(b+4)));//1,*(b+4)对指针解析,是char,1 return 0 ;}
18、(2分)字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?
一样大,指针是地址的地址,同样的系统地址长度相同。
19、(1分)
int a[3];a[0]=0; a[1]=1;a[2]=2;int *p, *q;p=a;q=&a[2];则a[q-p]=?//a[2] = 2
20、(4分)int array[10],不能对数组执行array++语句,原因是(数组名不能做左值)。该数组的数组名array代表的含义是(数组首元素首地址),&array代表的含义是(数组首地址),数组名不能作为左值的原因:(数组名就是数组的首地址。因为数组一旦定义就会被分配一片连续的空间,因此数组的首地址是不变的,因此可以说数组名是一个常量指针,一旦定义就不能再被赋值了。)。
21、(2分)下面程序段的运行结果是 。
char *s=”abcde” ;//a之前有空格字符,也就是’\0’
s+=2 ; printf(“%d”,s);//输出为随机值
22、(1分)一个栈的入栈序列是abcde,则栈的不可能输出序列是:C。
A. edcba B. decba C. dceab D. abcde
23、(20分)根据下面给出的声明和数据,对每个表达式进行求值并写出他的值。在每个表达式进行求值是使用原来给出的值(也就是说,某个表达式的结果不影响后面的表达式)。假定ints数组在内存中的起始位置是0x40000100,整型值和指针的长度都是4字节。
int ints[20]={10, 20, 30, 40, 50, 60, 70, 80, 90, 100,110, 120, 130, 140, 150, 160, 170, 180, 190, 200
};
(Other declarations)
int *ip=ints+3;
表达式 值 表达式 值ints ip ints[4] ip[4] ints+4 ip+4 *ints+4 *ip+4 *(ints+4) *(ip+4) ints[-2] ip[-2] &ints &ip &ints[4] &ip[4] &ints+4 &ip+4 &ints[-2] &ip[-2] //是真的头大,懵
24、(1分)int a[3][2] = {(1,2),(3,4),(5,6)};
int *p = a[0];
printf(“%d\n”,p[0]);
return 0;
输出结果:2
25、(2分)下题中调用GetMemory()能否使str获得期望的内存,为什么?
Void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100);//调用getmemory函数,以形参传入,退出函数后还原 strcpy(str, "hello"); printf(“%s\n”,str);//不能获得期望的内存}
26、(3分)已知有以下定义:
char str1[] = “abcd”;
char str2[] = “abcd”;
const char str3[] = “abcd”;
const char str4[] = “abcd”;
const char *str5 = “abcd”;
const char *str6 = “abcd;
char *str7 = “abcd”;
char *str8 = “abcd”;
判断下列表达式是否相等?
str1 == str2 ? //不等
str3 == str4 ? //不等
str5 == str6 ?//相等
27、(2分)以下两段程序输出分别是什么,为什么?
#include <stdio.h>char *returnStr(){ char p[]="hello world!"; return p;}int main(){ char *str=NULL; str=returnStr();//str接收returnstr的返回值p printf("%s\n", str);//return 0;}//没有输出//[Warning] function returns address of local variable [-Wreturn-local-addr]//函数返回地址都是不安全的,因为函数结束后,函数变量的内存都会变释放,因此这个地址其他运用程序也可以用到,会被修改。
28、(2分)这段程序运行的结果是()
int main(){ const int N = 10; const int M = 2; int *a = new int[N]; for (int i=0; i<N; i++) { a[i] = (0==i%2) ? (i+2):(i+0); } int (*b)[N/M] = (int(*)[N/M])a; for (int i=0; i<M; ++i) for (int j=0; j<N/M; ++j) printf(" %d", b[i][j]); // 2 1 4 3 6 5 8 7 10 9 return 0;}
二、编程(20分)
1、(2分)按要求完成一个程序:
int main(void)
{
char a = 0;
/*自定义你的函数名,要求:
1、调用函数完成后,a的值变为1;
2、a的改变不能通过返回值
*/
printf(“a = %d.\n”, a);
return 0;
}
#include <stdio.h>//用指针来改变对应地址的数值,避过形参释放还原的坑void zhi1(char *a){ *a = 1;}int main(){ char a = 0; zhi1(&a); printf("a=%d\n", a); return 0;}
2、(4分)请完成以下题目。
a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数。
#include<stdio.h>void func(int num){ unsigned int num = 0xff; unsigned int test = 0x1; int ret = 0; for(test;test!=0;test = test<< 1) if((num & test) != 0) { ret++; } printf("%d\n",ret);}
b) 请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。
int search(char *str,int n,char ch){ int i; for(i=0;i < ((n) && (*(str+i)!=ch) );i++); if(i==n) return -1; else return i;}
3、
(1)某游戏公司刚创立时只有一名员工,每名员工有3个月试用期,试用期过后转为正式员工,每名正式员工每个月都会推荐一名新员工进入公司,新员工经过3个月试用期后转为正式员工后每个月又会推荐一名新员工进入公司,假如公司创立时的第一名员工也需要试用期,并且所有员工都不会离职。据此,写出main方法打印出公司成立前a个月总员工数量
#include <stdio.h>int main(){ int month = 4; int person = 1; if (month < 3) { printf("%d", person); return 0; } while (month > 3) { month -= 3; person += a; printf("%d", mperson); return 0; } return 0;}
(2)某种特殊的数列a1,a2,a3的定义如下,a1=1,a2=2,an=2*a(n-1)+a(n-2)。给出任意一个正整数k,求该数列的第k项模32767的结果是多少
#include <stdio.h>#include <malloc.h>int func(int k){ if (k == 1) return 1; if (k == 2) return 2; if (k > 2) return(2 * func(k - 1) + func(k - 2));}int main(void){ int k = 0; scanf("%d", &k); int *p = (int *)malloc(k * sizeof(int)); if (NULL == p) { printf("error"); return -1; } int i; for (i = 0; i < n; i++) scanf("%d", &p[i]); for (i = 0; i < n; i++) { int ret = 0; ret = func(p[i]); printf("%d\n", ret%32767); } if(NULL != p) { free(p); p = NULL; } return 0;}
- C语言程序设计 自测题
- C语言程序设计 自测题
- C语言程序设计 自测题
- C自测题
- C/C++/OC自测题
- C语言程序设计 自测题(三)
- 简单 C自测
- C语言深度剖析自测题8解析
- 文件读写自测题
- 一些 C++ 自测题
- Android自测题01
- Android自测题02
- Android自测题03
- Android自测题04
- Android自测题05
- Android自测题07
- Android自测题08
- Android自测题09
- golang 上传文件
- android tinker 热修复使用及注意事项
- Tomcat源码学习笔记
- 高等数学复习之六(微分方程)
- java 开发小技巧
- C自测题
- window iis 崩溃 调式 dump文件 dotnet网站
- 程序替换
- 一些生冷的sql语句
- jmeter上传视频图片附件
- DrawerLayout和Navigation实现侧滑菜单
- Java性能分析神器-JProfiler 远程调试Tomcat
- React之,gulp,browserify搭建
- 第六章 6.4 图的存储结构