C语言面试题汇总
1. 阅读下面程序并写出输出结果(10分)。
main()
{ int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
答:2,5
*(a+1就是a[1]*(ptr-1)就是a[4],执行结果是25 &a+1不是首地址+1系统会认为加一个a数组的偏移是偏移了一个数组的大小本例是5个int int *ptr=(int *)(&a+1); 则ptr实际是&(a[5]),也就是a+5 原因如下 &a是数组指针其类型为 int (*)[5]; 而指针加1要根据指针类型加上一定的值 不同类型的指针+1之后增加的大小不同 a是长度为5的int数组指针所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要) 所以prt-1只会减去sizeof(int*) a,&a的地址是一样的但意思不一样a是数组首地址也就是a[0]的地址&a是对象数组首地址a+1是数组下一元素的地址即a[1],&a+1是下一个对象的地址即a[5].
2. 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)(5分)。
答:#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4).表达式中用到UL(表示无符号长整型)
3. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个(5分)。
答:#define MIN(A,B)((A)<= (B) ?(A): (B))
这个测试是为下面的目的而设的:
1). 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2). 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3). 懂得在宏中小心地把参数用括号括起来
4. static 关键字的作用(10分)。
答:(1)static作用于局部变量,使得局部变量变成局部静态变量,改变了变量的生存期;(2)static作用于全局变量,使其变成静态全局变量,改变变量的作用域,使得其不可扩展声明到别的文件中,只能在本文件中调用;(3)static作用于外部函数,使其成为静态函数,使得函数不能扩展声明到别的文件中,只得在本文件中调用。
5. 队列和栈有什么区别(10分)?
答:队列先进先出;栈先进后出。
6. 下面四个用const修饰指针有什么区别(10分)?
constint* p;
int const* p;
int* const p;
const int* const p;
答:前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
7. 简述内存分区情况,说明各分区存放的什么样的数据(10分)。
答:代码区:存放函数二进制代码;
数据区:存放全局变量、静态变量、常量等;
堆区:程序员手动申请的;
栈区:局部变量、函数形参。
8. #include<filename>和#include”filename”有什么区别(10分)?
答:#include<filename>直接在库文件目录中搜索所包含的文件;#include”filename”先在当前目录下搜索所包含的文件。如果没有的话,再到库文件目录搜索。
9. 数组和链表的区别 (10分)。
答:数组:数据顺序存储,固定大小
连表:数据可以随机存储,大小可动态改变
10. 冒泡排序(10分)。
答:void BubbleSort(int arr[], int n)
{
int i = 0, j=0;
for(i = 0; i < n; i++)
for(j = 0; j < n - 1 - i; j++)
{
if(arr[j]> arr[j + 1])
{
arr[j] = arr[j] ^ arr[j+1];
arr[j+1] = arr[j] ^ arr[j+1];
arr[j] = arr[j] ^ arr[j+1];
}
}
}
11. 写一个函数,交换两个整数,至少使用两种方法(10分)。
答:void Swap(int* _x,int* _y)
{
int nTmp = *_x;
*_x = *_y;
*_y = nTmp;
}
void Swap(int* _x,int* _y)
{
*_x = *_x ^ *_y;
*_y = *_x ^ *_y;
*_x = *_x ^ *_y;
}
T96每周一测(10.15)
C语言1—6章
12. 1、编写程序,实现以下功能。
用户输入12个数,存储到一个3行4列的数组中,然后找到其中的最大值和最小值,并且将其所在的行号和列号输出来
参考代码:
#include<stdio.h>
intmain()
{
int array[3][4];
int i,j;
int max,min,maxI,maxJ,minI,minJ;
printf("input 12 numbers!\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
scanf("%d",&array[i][j]);
}
max=array[0][0];
maxI=0;
maxJ=0;
min=array[0][0];
minI=0;
minJ=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(array[i][j]>max)
{
max=array[i][j];
maxI=i;
maxJ=j;
}
if(array[i][j]<min)
{
min=array[i][j];
minI=i;
minJ=j;
}
}
}
printf("最大值:%d,i:%d,j:%d\n",max,maxI,maxJ);
printf("最小值:%d,i:%d,j:%d\n",min,minI,minJ);
return 0;
}
13. 编写程序,实现以下功能。
定义一个结构体,存储学生的信息,其中包括:学号,姓名,性别。开始时只有3个学生的信息,学号分别是1,2,3,姓名和性别自定。后来用户在第2个位置插入一个新生:学号4,姓名柳柳,性别女。然后显示插入后的全部学生信息。再后来,学号是2的学生转到其他班级了,所以要删掉,最后再显示删除后的全部学生信息。
参考代码:
#include<stdio.h>
struct Student
{
int no;
charname[20];
charsex;
}stu[10];
int length=3;
int main()
{
int i,j;
for(i=0;i<length;i++)
{
stu[i].no=i+1;
printf("inputthe no.%d student's name!\n",i+1);
scanf("%s",stu[i].name);
printf("inputthe no.%d student's sex!\n",i+1);
getchar();
scanf("%c",&stu[i].sex);
}
for(i=0;i<length;i++)
{
printf("theinfo of no.%d student!\n",i+1);
printf("学号:%d\n",stu[i].no);
printf("姓名:%s\n",stu[i].name);
printf("性别:%c\n",stu[i].sex);
}
//插入
for(i=2;i<length;i++)
{
stu[i+1]=stu[i];
}
stu[2].no=4;
stu[2].sex='n';
strcpy(stu[2].name,"liuliu");
length++;
for(i=0;i<length;i++)
{
printf("theinfo of no.%d student!\n",i+1);
printf("学号:%d\n",stu[i].no);
printf("姓名:%s\n",stu[i].name);
printf("性别:%c\n",stu[i].sex);
}
//删除
for(i=0;i<length;i++)
{
if(stu[i].no==2)
break;
}
if(i==length)
{
printf("没有学号是2的学生!\n");
exit(1);
}
else
{
for(j=i+1;j<length;j++)
{
stu[j-1]=stu[j];
}
length--;
}
for(i=0;i<length;i++)
{
printf("theinfo of no.%d student!\n",i+1);
printf("学号:%d\n",stu[i].no);
printf("姓名:%s\n",stu[i].name);
printf("性别:%c\n",stu[i].sex);
}
return 0;
}
14. 编写程序实现以下功能。
用户输入一个字符串,长度不超过100,写一个函数将其加密。加密方法为:当内容是英文字母时,用它在26字母中的后三个字母代替该字母,如:用d代替a,用a代替x,也就是循环代替。若为其它字符时不变。加密用1个函数,解密用一个函数(提醒,输入字符串、输出字符串都使用数组)
参考代码:
#include<stdio.h>
#include<string.h>
voidencryption(char str[],int length)
{
int i;
for(i=0;i<length;i++)
{
if((str[i]>='a'&&str[i]<='w')||(str[i]>='A'&&str[i]<='W'))
str[i]+=3;
elseif((str[i]>='x'&&str[i]<='z')||(str[i]>='X'&&str[i]<='Z'))
str[i]-=23;
}
printf("result:%s\n",str);
}
voiddecryption(char str[],int length)
{
int i;
for(i=0;i<length;i++)
{
if((str[i]>='d'&&str[i]<='z')||(str[i]>='D'&&str[i]<='Z'))
str[i]-=3;
elseif((str[i]>='a'&&str[i]<='c')||(str[i]>='A'&&str[i]<='C'))
str[i]+=23;
}
printf("result:%s\n",str);
}
intmain()
{
char str[101];
int i,length;
printf("input a string!\n");
scanf("%s",str);
length=strlen(str);
encryption(str,length);
decryption(str,length);
return 0;
}
15. 编写一个程序,从键盘上接收一个整数,并且从1-100之间找到能被它整除的整数,输出这些数以及这些数的个数。
参考代码:
#include<stdio.h>
intmain()
{
int num,i,count=0;
printf("input a number!");
scanf("%d",&num);
for(i=1;i<=100;i++)
{
if(i%num==0)
{
printf("%d\n",i);
count++;
}
}
printf("个数:%d\n",count);
return 0;
}
16.从键盘上接收一个字符,判断它到底是哪种字符:数字,小写字母,大写字母,其他字符
#include "stdafx.h"
#include<stdio.h>
#include "stdafx.h"
#define PI 3.14
int main(void)
{
char ch_t;
printf("请输入一个字符\n");
ch_t = getchar();
if(ch_t <='9' &&ch_t >='0')
printf("数字\n");
else if(ch_t<='Z'&& ch_t>='A')
printf("大写字母\n");
elseif(ch_t>='a'&& ch_t<='z')
printf("小写字母\n");
else
printf("其他字符\n");
getchar();
getchar();
return 0;
}
16. 给出一百分制成绩,要求从键盘输入成绩后,输出成绩等级‘A’、‘B’、‘C’、‘D’、'E'。90分以上为‘A’,80—89分为‘B’,70—79分为‘C’,60—69分为‘D’,60分一下为'E'。
#include "stdafx.h"
#include<conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
#include "stdafx.h"
int main(void)
{
int dSc;
printf("请输入需分级的分数。\n");
scanf("%d",&dSc);
if(dSc<=100)
{
if (dSc>=90)
printf("成绩%d分级为A",dSc);
else if(dSc>=80)
printf("成绩%d分级为B",dSc);
else if(dSc>=70)
printf("成绩%d分级为C",dSc);
else if(dSc>=60)
printf("成绩%d分级为D",dSc);
else if(dSc<60)
printf("成绩%d分级为E",dSc);
}
else
printf("输入的数据非法。\n");
getchar();
getchar();
return 0;
}
方法二
#include "stdafx.h"
int main(void)
{
int dSc;
int nStep;
printf("请输入需分级的分数。\n");
scanf("%d",&dSc);
nStep=dSc/10;
switch(nStep)
{
case 10: printf("成绩%d分级为A",dSc);
break;
case 9: printf("成绩%d分级为A",dSc);
break;
case 8: printf("成绩%d分级为B",dSc);
break;
case 7: printf("成绩%d分级为C",dSc);
break;
case 6: printf("成绩%d分级为D",dSc);
break;
default: printf("成绩%d分级为E。\n",dSc);
}
getchar();
getchar();
return 0;
}
17. 写出1一直加到100的程序,分别应用for,while和do while语句
#include "stdafx.h"
int main(void)
{
int na=1;
int sun=0;
while(na>=100){
sum+=sum+na;
na++;
}
printf(“%d”,sum);
return 0;
}
#include "stdafx.h"
int main(void)
{
int na=1;
int sun=0;
do{
sum+=sum+na;
na++;
}while(na>=100);
printf(“%d”,sum);
return 0;
}
#include "stdafx.h"
int main(void)
{
int na=1;
int sun=0;
for(na=1;na<=100;na++){
sum+=sum+na;
}
printf(“%d”,sum);
return 0;
}
18. (1)写出for,while和do while构成的死循环语句。
(2)写出while和do while的区别。
(1)
for(;;){}
while(1){}
do{}while(1);
(2)
do while是先执行再判断,至少执行一次。
While先判断,再执行。
19. (1)使用for循环输出1到50之间能被3整除的数
(2)使用for循环计算1到50之间的和,判断如果和大于344时推出程序,并打印出此时的和。
#include "stdafx.h"
int main(void)
{
int na=1;
int sun=0;
for(na=1;na<50;na++){
if(na%3==0){
printf(“%d”,na);
}
}
return 0;
}
(2)
#include "stdafx.h"
int main(void)
{
int na=1;
int sun=0;
for(na=1;na<50;na++){
sum+=sum+na;
if(sum>344){
printf(“%d”,na);
break;
}
}
return 0;
}
20. 设有定义:int n1=0 ,n2 , *p=&n2, *q=&n1;,以下赋值语句中与n2=n1;语句等价的是
A)*p=*q; B)p=q;
C)*p=&n1; D)p=*q;
21. 若有定义:int x=0, *p=&x;,则语句printf("%d\n",*p);的输出结果是
A)随机值 B)0
C)x的地址 D)p的地址
22. 以下定义语句中正确的是
A) chara='A'b='B'; B) float a=b=10.0;
C) int a=10,*b=&a; D) float *a,b=&a;
23. 有以下程序
main()
{ inta=7,b=8,*p,*q,*r;
p=&a;q=&b;
r=p; p=q;q=r;
printf("%d,%d,%d,%d\n",*p,*q,a,b);
}
程序运行后的输出结果是
A) 8,7,8,7 B) 7,8,7,8
C) 8,7,7,8 D)7,8,8,7
24. 设有定义:int a,*pa=&a;以下scanf语句中能正确为变量a读入数据的是
A) scanf(“%d”,pa) ; B) scanf(“%d”,a) ;
C) scanf(“%d”,&pa) ; D) scanf(“%d”,*pa) ;
25. 设有定义:int n=0,*p=&n,**q=&p;则以下选项中,正确的赋值语句是
A) p=1; B) *q=2; C) q=p; D) *p=5;
26. 有以下程序片段:
void fun(char *a, char *b)
{ a=b; (*a)++; }
main ()
{ char c1="A", c2="a",*p1, *p2;
p1=&c1; p2=&c2; fun(p1,p2);
printf(“&c&c\n”,c1,c2);
}
程序运行后的输出结果是
A) AbB) aaC) Aa D) Bb
27. 若程序中已包含头文件stdio.h, 以下选项中,正确运用指针变量的程序段是
A)int *i=NULL; B)float *f=NULL;
scanf("%d",i); *f=10.5;
C) char t=’m’, *c=&t; D) long *L;
*c=&t; L=‘\0’;
28. 有以下程序片段:
#inc1ude
main()
{ printf("%d\n", NULL); }
程序运行后的输出结果是
A) 0 B) 1 C) -1 D) NULL没定义,出错
C语言面试题汇总的更多相关文章
- C语言面试题汇总之一
C语言面试题汇总之一 1.static有什么用途?(请至少说明两种) l 限制变量的作用域: 设置变量的存储域. 2.引用和指针有什么区别? 引用必须被初始化,指针不必: 引用初始化以后不能被改变,指 ...
- 转 C语言面试题大汇总
转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题: C语言面试题大汇总,个人觉得还是比较全地!!! 作 者: free131 (白日?做梦!) 信 誉 值: 100 ...
- AJAX笔试面试题汇总
AJAX笔试面试题汇总 Javascript 1. 什么是ajax,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是“Asynchronous JavaScript a ...
- Linux面试题汇总答案
转自:小女生的Linux技术~~~Linux面试题汇总答案~~ 一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的 ...
- 收藏所用C#技术类面试、笔试题汇总
技术类面试.笔试题汇总 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化,不要梦想着把题覆盖了,下面的题是供大家查漏补 ...
- Python面试题汇总
原文:http://blog.csdn.net/jerry_1126/article/details/44023949 拿网络上关于Python的面试题汇总了,给出了自认为合理的答案,有些题目不错,可 ...
- iOS常见面试题汇总
iOS常见面试题汇总 1. 什么是 ARC? (ARC 是为了解决什么问题而诞生的?) ARC 是 Automatic Reference Counting 的缩写, 即自动引用计数. 这是苹果在 i ...
- 100个iOS开发面试题汇总-王刚韧的技术博客
100个iOS开发面试题汇总 关于iOS开发面试,不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技能和积累的考察,也是一个开发者自我检验的 ...
- 100个iOS开发/设计程序员面试题汇总,你将如何作答?
100个iOS开发/设计程序员面试题汇总,你将如何作答? 雪姬 2015-01-25 19:10:49 工作职场 评论(0) 无论是对于公司还是开发者或设计师个人而言,面试都是一项耗时耗钱的项目, ...
随机推荐
- 模板专业化和模板偏特样片(template specialization and partial template specialization)
测试环境: win7 64 g++ 4.8.1 /*************************************************************************** ...
- ios 8 地图定位
在xcode6在 苹果公司定位方法改变地图,谁也无法使用 错误说明:Trying to start MapKit location updates without prompting for loca ...
- Erlang常用代码段
十六进制字符串转为二进制 hex_to_bin(Bin) -> hex2bin(Bin). hex2bin(Bin) when is_binary(Bin) -> hex2bin(bina ...
- Unity3d在线游戏Socket通讯
网络游戏是一个人的互动娱乐软件应用.因为它是交互式,当然,需要了解对方的通信.这需要通信Socket:我们今天要实现的主角即套接字.Socket的英文原义是"孔"或"插座 ...
- printf详解
用了这么多年c了,今天想编个小程序练练手,忽然发现对于printf这个函数并不甚了解.上网查了查,下面是对printf()的详解: 函数原型: #include <stdio.h> int ...
- JS字符串数字互转
JS是一种弱类型的脚本语言,为变量赋值是会自动转换为相应的类型,例如: var a = 1; alert(a + 1);//结果为2 自动识别为数字类型进行数学运算 var b = '1'; aler ...
- Libgdx Box2D现实---这缓释微丸(两:Box2D介绍)
Box2D官方网站 : http://box2d.org/ Box2D v2.1.0用户手冊翻译 : http://blog.csdn.net/complex_ok/article/catego ...
- mysql通过字段注释查找字段名称
原文:mysql通过字段注释查找字段名称 有时候表的字段太多,只是大致记得表的注释,想通过字段注释查找字段名称,可以用如下语句: SELECT COLUMN_NAME,column_comment F ...
- 使用EasyUI的树控件构建Web界面
最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重 ...
- java加载配置文件的三种方式
比如我们要加载db.properties文件 如图: 比如我们要加载source目录下的db.properties文件.就有以下几种方式 第一种是文件io流: public static void l ...