C、C++程序员常见面试题深入剖析

2024-10-15

C、C++程序员常见面试题深入剖析(精选7篇)

C、C++程序员常见面试题深入剖析 篇1

C/C++ 程序设计员应聘常见面试试题深入剖析本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。

许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。

分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。

2.找错题

试题1:

以下是引用片段: void test1()

{

char string[10];

char* str1 = “0123456789”;

strcpy(string, str1);

}

试题2:

以下是引用片段:

void test2()

{

char string[10], str1[10];

int i;

for(i=0;i<10;i++)

{

str1= 'a';

}

strcpy(string, str1);

}

试题3:

以下是引用片段: void test3(char* str1)

{

char string[10];

if(strlen(str1)<= 10)

{

strcpy(string, str1);

}

}

解答:

试题1字符串str1需要11个字节才能存放下(包括末尾的’’),而string只有10个字节的空间,strcpy会导致数组越界;

对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;

对试题3,if(strlen(str1)<= 10)应改为if(strlen(str1)<10),因为strlen的结果未统计’’所占用的1个字节。

剖析:

考查对基本功的掌握:

(1)字符串以’’结尾;

(2)对数组越界把握的敏感度;

(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:

2分

以下是引用片段:

void strcpy(char *strDest, char *strSrc)

{

while((*strDest++ = * strSrc++)!= ‘’);

}

4分

以下是引用片段:

void strcpy(char *strDest, const char *strSrc)

//将源字符串加const,表明其为输入参数,加2分

{

while((*strDest++ = * strSrc++)!= ‘’);

}

7分

以下是引用片段:

void strcpy(char *strDest, const char *strSrc)

{

//对源地址和目的地址加非0断言,加3分

assert((strDest!= NULL)&&(strSrc!= NULL));

while((*strDest++ = * strSrc++)!= ‘’);

}

10分

以下是引用片段:

//为了实现链式操作,将目的地址返回,加3分!

char * strcpy(char *strDest, const char *strSrc)

{

assert((strDest!= NULL)&&(strSrc!= NULL));

char *address = strDest;

while((*strDest++ = * strSrc++)!= ‘’);

return address;

} 从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!

(4)对strlen的掌握,它没有包括字符串末尾的''。

读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为: int strlen(const char *str)//输入参数const

以下是引用片段:

{

assert(strt!= NULL);//断言字符串地址非0

int len;

while((*str++)!= '')

{

len++;

}

return len;

}

试题4:

以下是引用片段: void GetMemory(char *p)

{

p =(char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str, “hello world”);

printf(str);

}

试题5:

以下是引用片段: char *GetMemory(void)

{

char p[] = “hello world”;

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}

试题6:

以下是引用片段:

void GetMemory(char **p, int num)

{

*p =(char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, “hello”);

printf(str);

}

试题7:

以下是引用片段:

void Test(void)

{

char *str =(char *)malloc(100);

strcpy(str, “hello”);

free(str);

...//省略的其它语句

}

解答:

试题4传入中GetMemory(char *p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完

char *str = NULL;

GetMemory(str);

后的str仍然为NULL;

试题5中

char p[] = “hello world”;

return p;的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。

试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句 tiffanybracelets

*p =(char *)malloc(num);

后未判断内存是否申请成功,应加上:

if(*p == NULL)

{

...//进行申请内存失败处理

}

试题7存在与试题6同样的问题,在执行

char *str =(char *)malloc(100);

后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:

str = NULL;

试题6的Test函数中也未对malloc的内存进行释放。

剖析:

试题4~7考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中50~60的错误。但是要完全解答正确,却也绝非易事。

对内存操作的考查主要集中在:

(1)指针的理解;

(2)变量的生存期及作用范围;

(3)良好的动态内存申请和释放习惯。

再看看下面的一段程序有什么错误:

以下是引用片段: swap(int* p1,int* p2)

{

int *p;

*p = *p1;

*p1 = *p2;

*p2 = *p;

}

在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:

以下是引用片段:

swap(int* p1,int* p2)

{

int p;

p = *p1;

*p1 = *p2;

*p2 = p;

}

一、#include #include #include #include using namespace std;int main(void){ static char s[] = “abce”;char *p = s;cout << *p << *(p + 2)<< *p + 2 <

输出结论: ac99 abce qrst bcd

为什么*p+2输出的是99,而不是c?

答:p的指针类型是char*, p保存s[0]的地址,因此*p指向s[0]的内容即‘a’,(p+2)指针指向了数组元素s[2]的地址,因此*(p + 2)将得到c,*p是char类型,2是int类型,char与int类型进行运算时,编译器会进行隐式转换,将char类型转换为int类型,因此将运算97+2,得出结果为99。

Q2:**t,这里的t还是不是一般意义上的存放的是一个内存地址,如果是地址它是数组首元素地址吗?这样看来好像不对,那它是怎么对应内存地址的?是对应一块内存地址吗? 答:t本向指向一个字符数组的首地址,所定义的这个字符数组是三维的,即2*3*5的字符数组,第一维的一组值为:“abcd”,“efgh”,“ijkl”, 第二维的一组值:“mnop”,“qrst”,“uvwx” **t指向第一维的第一组值:即“abcd”

static char t[][3][5] = {“abcd”,“efgh”,“ijkl”,“mnop”,“qrst”,“uvwx”};

cout << **t << “t” << *(*(t+1)+1)<< “t”

<<*(*(*(t+1)+1)+1)<< “t” << **t +1 << endl;

二、C语言中数组指针和指针数组彻底分析

1、简单知识

----------指针----------int a = 10;int p = &a;——p中存放的是a 的地址----------指针的指针----------int b = 20;int *p = &b;int *p2p =&p;----------简单数组----------int c[10];//整数数组,含有10个整数元素

file://也就是说每个元素都是整数----------指针数组----------int *p[10];//指针数组,含有10个指针元素

file://也就是说每个元素都是指针----------数组指针--------int(*p)[10];//数组指针,这个指针可以用来指向

file://含有10个元素的整数数组

上面这些简单的形式是我们必须要首先理解,这个是基本的知识。同时我们从上面也要得出一个很重要的知识提示:C语言层面上关于变量声明的部分,后缀结合变量的优先级比前缀要高。

2、提高知识 先看一段程序: #include #include using namespace std;

int main(){ int vInt=10;int arr[2]={10,20};int *p=&vInt;int **p2p=&p;

int *parr[2]={&vInt,&vInt};int(*p2arr)[2]=&arr;

cout<<“Declaration[intvInt=10]type==”<

return 0;}

打印结果:

运行的结果如下:(我在前面加了行号#XX)#01Declaration[intvInt=10]type==int #02Declaration[arr[2]={10,20}]type==int* #03Declaration[int*p=&vInt]type==int* #04Declaration[int**p2p=&p]type==int** #05Declaration[int*parr[2]={&vInt,&vInt}]type==int** #06Declaration[int(*p2arr)[2]=&arr]type==int(*)[2]

结果分析:

----------#02:数组--------在编译器看来数组只是相对应类型的指针类型。当我们把数组传递给函数作为参数的时候,传递的是指针,所以我们可以利用参数来修改数组元素。这个转化是编译器自动完成的。

----------#05:指针数组----------指针数组在编译器内部表示也是对应类型的指针

----------#06: 数组指针----------数组指针在编译器内部内部表示就是有一点特别了。编译器(或者说是语言本身)有数组指针这个内部表示。

由于c语言的类型严格检查的语言(当然还有一些是存在隐式类型转化的)

施工员常见面试题 篇2

按建筑施工图首层地面标高±0.000定,2、按规范规定室内外阳台栏杆高度多少?

楼层地面完成面以上1.2米。

3、砼浇筑过程中要注意哪些方面?

观察模板、钢筋、支顶、预埋件和预留洞口的情况,当发现变形、移位应及时采取措施处理。

4、钢筋的连接方式有哪些?

焊接、绑扎搭接、机械连接。

5、如果上级安排你去跟踪浇捣柱砼,你该跟踪哪些主要问题?

混凝土的水灰比,柱子的高度,是否分层浇筑,柱筋是否移位,柱子是否垂直。

6、混凝土预制桩施工操作流程。

桩机就位—预制桩—插桩—打桩----接桩—送桩—检查验收—移桩机。

7、验收模板有哪几个方面?

检查模板的轴线位置,平整度,垂直度,尺寸是否满足设计要求。

8、浇砼跟班要做哪些工作?

申报砼料---接管铺桥----安排电工接线---跟进模板、钢筋、预埋件异常情况------砼平整度控制、厚度控制----工程质量等。

9、在浇捣混凝土之前应进行钢筋隐蔽工程验收,主要哪些内容?

纵向筋、钢筋、箍筋、预埋件的规格、数量及位置。

10、现场质量实测检查常用的手段有哪些?

吊、靠、量、套。

11、为什么把钢筋与混凝土组合在一起做构件?它们的共同点是什么?

因为混凝土的抗压强度高,钢筋的抗拉强度大,二者组合到一起的性能好。

12、钢筋的搭接长度与哪些因素有关?

抗震等级、混凝土标号、钢筋规格、搭接率。

13、万一发生塌模,作为施工员,第一件事做什么?第二件事做什么?

第一要对作业人员疏散与抢救,停止施工。第二根据事故的大小上报领导,采取整改措施。

14、大型高支模出现塌模的主要因素?

主要是基础和支撑没有做好。

15、施工管理的任务是什么

银行常见面试题和参考答案 篇3

1、“实贷实付”的含义

“实贷实付”,是指银行业务金融机构(贷款人)按照贷款项目(固定贷款和项目贷款)进度或者有效贷款需求(流动资金贷款),根据贷款人的提款申请和支付委托(必须提供相关支付清单,包括合同发票转账支票),将贷款资金在规定的时间内(通常理解为T+1)以受托的方式,支付给符合合同约定的借款人交易对手的支付过程。

2、“实贷实付”的现实意义

(一)有利于将信贷自己引入实体经济。“三个办法一个指导”通过要求银行根据借款人有效信贷需求和项目进度,采取向借款人交易对手支付的受托支付的贷款支付方式,不仅为借款人“量用为借”,节约大量财务成本,更可有效解决长期以来备受诟病的信贷资金挪用问题,监督并确保银行信贷资金真正进入实体经济,在满足有效信贷需求的同时,严防信贷挪用,杜绝信贷资金违规流入股市和楼市的恶性违规问题。

(二)避免银行通过贷款转存款,虚增存款,真实的反应银行业务发展及国家经济发展水平。为国家制定相关政策提供了真实的存款数据支持,有利于国家对商业银行存贷比等相关指标的考核。(个人认为应该增加的)

(三)有利于加强贷款使用的精细化管理。“三个办法一个指导”在贷款流程中明确贷款支付管理的环节,将贷款资金分为“受托支付”和“自主支付”两类。同时,贷款新规通过严格贷款支付管理方式、严格贷款支付管理措施、落实贷款制度管路部门职责等具体措施,督促商业银行有效提升信贷风险管理能力,尤其是有效管控支付环节风险。需要指出的是,针对固定资产贷款、流动资金贷款和个人贷款的不同特定,在受托支付的标准上有差异的。相对而言,对人贷款和固定资产的受托支付标准更为严格,而流动资金贷款的支付标准则赋予银行业金融机构更多的自主权和灵活性。这种差异化管理要求有针对性地加强贷款使用管理,对于实现银行业金融机构信贷风险管理地差异化和精细化大有裨益。

C、C++程序员常见面试题深入剖析 篇4

1、软件测试的流程

2、描述一下测试的过程,给你一个系统你怎么测试。

3、给1个纸杯或电梯当场设计测试用例

4、三角形或饮料售卖机设计测试用例

5、BUG跟踪流程

6、什么时候停止测试?

7、有多少测试用例通过后,系统可以发布

8、如果没有任何文档,你如何开展软件测试工作

9、自由测试(指不按照测试用例进行测试)占的比例有多大,是否有用处

10、对手机短信功能进行测试,设计测试用例。

11、你了解的生命周期模型?什么是w模型,画出V模型。

12、LR怎样修改脚本

13、测试给公司带来什么

14、测试从什么时候介入,一般公司都不从需求介入你怎么办

11、在单元测试到系统测试过程中,是不是分别有一个测试计划文档。

12、假如给你一个登陆界面,有能够记住用户名密码复选框的,你怎么设计测试用例

13、做性能测试怎么去做,关注点有哪些

14、你认为软件测试应该注意什么?

15、测试计划里包括内容

16、什么叫回归测试

17、你做过的项目中对什么功能做自动化了,怎么做的

18、什么叫软件测试

计算机相关技术题

1、什么是配置管理?

2、谈谈你了解的TCP/IP?网络的7层内容?

3、数据库如何建库.备份.数据倒入

4、用命令创建数据库 和 该库下的数据表

综合素质题

1、英语自我介绍,英语问答工作内容等问题

2、如果以前学过开发或做过开发,问做开发和测试哪个更有优势?

3、为什么毕业后不直接找工作而是选择培训?(针对应届毕业生)

4、为什么这么多年其他行业工作经验现在转行测试?(针对转行的学员)

5、你作为测试的优势和劣势是什么?

6、你最大的优点和缺点是什么?

智力题

1、如何知道一架飞机的重量

2、一条不均匀绳子燃烧完1小时,只有1根绳子如何判断半个小时

3、1个屋子3个开关,分别控制其他3个屋子的灯。只开一次门如何判断3个开关具体控制哪间屋子的灯。

4、如何统计北京市的公交数量

5、假如你只有买一套房子或车子的钱,你用来买哪样?为什么?

6、几个月没见面的好朋友今晚说来你家,可刚好今晚有你最喜欢的电视剧,选择关了电视跟朋友聊天?说服朋友跟你一起看电视?电视开着并同时跟朋友聊天?

C、C++程序员常见面试题深入剖析 篇5

1、赋值构成一个表达式,具有值,其值为赋值符左边表达式的值。表达式和语句的一个重要区别是,表达式有值,而语句没有值。

2、隐式类型转换总是朝着表达数据能力更强的方向,并且转换总是逐个运算符进行的。如 float f=3.5;int n=6;long k=21;double ss=f*n+k/2;//在计算ss时,首先将f和n转换成double,算得21,然后计算k/2得10,再将10(long int)转换成double,最后得31。

27、C++基础笔记(一)墨涵天地 有符号数向无符号数转换。

3、当又有声明又有定义时,定义中不允许出现默认参数,如果函数只有定义,才允许默认参数出现在定义中。默认值可以是一个全局变量,全局常量,或是一个函数,但是不能是局部变量,因为默认参数的函数调用是在编译时确定的,而局部变量的位置和值在编译时是无法确定的。如 int a=1;void fun(){ int i;void g(int x=i);//not right int g(int x=a);//right

}

4、define宏定义指令

1)使用其定义常量已被C++中的const定义语句所代替。2)用来定义带参数的宏,已被C++的内联函数所代替。3)其一个有效的使用是在条件编译中。

5、编译时必须知道数组的大小。如

int a[]={1,2,3,4,5};//编译器会自动去数 for(int i=0;i

7、Free和malloc int* a;a=(int*)malloc(sizeof(int));cout<

8、指向常量的指针,指针常量,指向常量的指针常量

指向常量的指针:通过指针不能改变所指向的变量的值,但是指针的值可以变化(即指针可

以指向其它变量的地址)。形式如const int* pi=&a;原来的变量的访问属性也不会发生改变,如原来是普通变量,则其值可以变化,原来是常变量,则其值不能变化。

指针常量:在定义时必须初始化,且一旦赋值,则以后该指针的值将不会再发生变化(即不能再指向其它地址)。形如char* const pc=“abcd”;注意,pc的值是不能再改变了,但是*pc的值可以变化,如*pc=b;指向常量的指针常量:具有上述两具指针的特点,须在定义时初始化,且一旦赋值,则以后该指针的值将不会再发生变化,且通过指针不能改变所指向的变量的值,形如const int* const cpc=“perfect”;注意,这种情况下,*cpc的值也是不能改变的,如*cpc=n是不对的。int main(){ char* const pc=“abcd”;cout<

}

9、sum(int array[],int n)与sum(int* array,int n)是等价的。

10、函数返回值,可以返回堆地址,也可以返回全局或静态变量的地址,但是不能返回局部变量的地址。

11、void指针是空类型指针,它不指任何类型,它仅仅是一个地址,不能进行指针运算,也不能进行间接引用。

NULL与void* 是不同的概念,NULL是一个指针值,任何类型的指针都可赋予该值。而void* 是一种类型(语法上是一个类型,本质上不是,没有任何一个变量或对象,其类型为void),是一种无任何类型的指针。不允许对void进行引用。

12、由引号(“ ”)标识,但不是用来初始化数组的字符串,是字符串常量,如cout<<“hello”<

由于字符串常量的地址属性,两个同样字符组成的字符串常量是不相等的,字符串常量的比较是地址的比较。

字符串常量,字符数组名(常量指针),字符指针均属于同一种数据类型。

13、不能建立引用的数组,因为数组是某个数据类型的集合,数组名表示起始地址,它不是数据类型。如 int a[10];int& a1[10]=a;//not right 引用本身不是一种数据类型(int&不是类型,定义时也不产生内存空间),所以没有引用的引用。也没有引用的指针。引用是变量或对象的引用,而不是类型的引用,所以有空指针,但是没有空引用。Int& ri=NULL //没有意义

可以用引用返回值。在通常情况下,C++会建立一个临时变量以将函数返回值带回。但是如果用引用,则不用建立临时变量。

C++规定,临时变量或对象的生命周期在一个完整的语句表达式结束后便宣告结束。所以如果以返回值初始化一个引用,应当先建立一个变量,将函数返回值赋于这个变量,作如下处理:

int x=fn1(5.0);//在这一句后临时变量生命周期将结束 int& b=x;************************* float temp;

float& fn2(float r){ temp=10*r;return temp;} 用如上的方法,则函数返回值将不再创建临时变量,而直接与全局变量temp共享内存单元 ******************************* 以引用的初始化,可以是变量,也以是常量,也可以是一定类型的堆空间变量,但是引用不是指针,如下表达是不对的: int& a=new int(2);

//not right

下面是用堆空间变量初始化引用的一个例子: #include #include using namespace std;int main(){ double* pd=new double;if(pd==NULL){printf(“failed”);exit(1);} cout<

//...{

cin>>rd;

cout<

cout<<&rd;

} delete& rd;//或delete pd return 1;}

注意:用double& rd来定义引用,而&rd则是取引用所指向的空间的地址。

14、声明一个结构并不分配内存,内存分配发生在定义这个新数据类型的变量中。结构不像数组,结构变量不是指针,&结构变量 取到的是结构中第一个成员变量的地址。结构变量可以相互赋值。结构成员不能作自身的结构变量,但是可以用结构指针作为成员。

15、将类定义和其它成员函数定义分开,是目前开发程序的通常做法。我们把类定义(头文件)看成是类的外部接口,类的成员函数定义看成是类的内部实现。

C程序员笔试题 篇6

a、全局函数 b、构造函数

c、静态全局函数 d、析构函数

2、对静态成员不正确的描述是——

a、静态成员不属于对象,是类的共享成员

b、要在类外定义初始化

c、调用时,要通过类或对象激活,所以静态成员函数拥有this指针

d、非静态成员函数也可以操作静态数据成员

3、在创建派生对象时,构造函数的执行对象是——

a、对象成员构造函数、基类构造函数、派生类本身的构造函数

b、派生类本身的构造函数、基类构造函数、对象成员构造函数

c、基类构造函数、派生类本身的构造函数、对象成员构造函数

d、基类构造函数、对象成员构造函数、派生类本身的构造函数

4、假设V为抽象类,下列声明哪个正确

a、V fun(int) b、 V *p

c、int fun(V) d、V Obj

5、假设已定义变量float data;

以二进制方式把data值写入输出文件流对象outfile中去,正确的是:

a、outfile.write((float *)&data, sizeof(float));

b、outfile.write((float *)&data, data);

c、outfile.write((char *)&data, sizeof(float));

d、outfile.write((char *)&data, data);

6、如下类定义:

class Foo {

public:

Foo(int v):value(v) //a

~Foo //b

private:

Foo //c

int value=0; //d

};

有错误的是____

7、下列关于栈的叙述正确的是

a、在栈中只能插入数据 b、只能删除数据

c、栈是先进先出的线性表 d、是先进后出的线性表

8、一个队列入列顺序是1,2,3,4,则输出顺序是

a、4321 b、1234 c、1432 d、3241

19、若执行语句: Point a(2), b[3], *c[4];

则Point类的构造函数被调用几次

C语言程序设计的试题及答案 篇7

c=swap(a,b); printf(”%d%dn“, a,c); }

40. #include void fun(int n) { if(n==1) printf(”*n“); else { printf(”-“); fun(n-1); } } void main { int i,j=0; for(i=1;i<4;i++) fun(i); printf(”XiaoXin!“); } 解答: 1. p=27 2. 运行结果:12345 3. 3 4. 5 3 32 5. 2 6. 11 21 31 7. 3 7 5

8. 6

7

8

5

5

9. 012345 10. a1=1 a2=3 a3=2 11. 10,20,30 12. a=2,b=3 a=2,b=3 13. 10,20,30 14. a=1.0000 15. 567 16. 4 17. 3.000000 18. 80,-20 19. -1 20. j=12 21. 4,3,5 22. 18 23. Hello, world! Hello, world! Hello, world! 24. x=3; 25. x=22 26. i = 7; j = 6; x = 7 i = 2; j = 7; x = 5

27. 7 28. (1) x = 2 y = 3 z = 0 (2) x = 4 y = 9 z = 5 (3) x = 2 y = 3 z = 0 29. 10, 20, 40, 40 30. 125 31. 3,0,-90,23,6,10 32. sum=6 33. i=20 i=40 34. j=9 35. c=1 36. +4++2+ 37. 8 38. c=33 39. 389 40. * -* --* XiaoXin!

三.补充程序 1. 定义了一个 max 函数,找两个整数的最大值,其位置在 main 之后. #include ”stdio.h“ ________________________ int main() {

int x,y,z; printf(”input two numbers:n“); scanf(”%d%d“,&x,&y); ________________________; printf(”maxmum=%d“,z); return 0; } int max(int a,int b) { ________________________; if(a>b)w=a; else w= b; ________________________; } 2. 用函数 nzp 判别一个整数 a 的值,若大于 0 则输出该值,若小于等于 0 则输出 0 值。 #include ”stdio.h“ ________________________nzp(________________________) { if(v>0) ________________________ else printf(”%d “,0); } int main() { int a; printf(”input number a:n“); scanf(”%d“,&a); ________________________ return 0; } 3. 主函数调 f1 计算 n 阶乘. #include ”stdio.h“ ________________________ int main() { int n; long s; scanf(“%d”,&n); ________________________ printf(”ns=%ldn“,s); return 0; } long f2(int n) { ________________________

int i; for(i=1;i<=n;i++) c=c*i; ________________________ } 4. 主函数调 fun 计算 1+1/2!+1/3!+...+1/30!的和. #include ”stdio.h“ ________________________ int main() { int n; float s; ________________________ printf(”1+1/2!+1/3!...+1/30!=%fn“,s); return 0; } float fun() { int n; float t=1; ________________________ for(n=1;n<=30;n++) { t*=1/n; s+=t; } ________________________ } 5. 数组 a 中存放了一个学生 5 门课程的成绩,求平均成绩。 #include ”stdio.h“ ________________________ int main() { float sco[5],av; int i; printf(”ninput 5 scores:n“); for(i=0;i<5;i++) scanf(”%f“,&sco[i]); ________________________ printf(”average score is %5.2f“,av);

return 0; } float aver(float a[]) { int i; float s=a[0]; ________________________ for(i=1;i<5;i++) s=s+a[i]; av=s/5; ________________________ } 6. 用递归法计算 n! #include ”stdio.h“ ________________________ int main() { int n; long y; printf(”ninput a inteager number:n“); scanf(”%d“,&n); ________________________ printf(”%d!=%ld“,n,y); return 0; } ________________________ff( int n) { long f; if(n<0) printf(”n<0,input error“); else if(n==0||n==1) f=1; else f=ff(n-1)*n; ________________________ }

7. 输入正方体的长宽高 l,w,h。求体积及三个面 x*y,x*z,y*z 的面积。 #include ”stdio.h“ int s1; ________________________ int vs( int a,int b,int c) { ________________________ v=a*b*c; s1=a*b; s2=b*c;

s3=a*c; ________________________ } int main() { int v,l,w,h; printf(”ninput length,width and heightn“); scanf(”%d%d%d“,&l,&w,&h); ________________________ printf(”v=%d s1=%d s2=%d s3=%dn“,v,s1,s2,s3); return 0; } 8. 输入两个正整数 num1,num2,求其最大公约数. #include ”stdio.h“ ________________________ int main() { int d; int num1,num2; printf(”please input two numbers:n“); scanf(”%d,%d“,&num1,&num2); ________________________ printf(”gongyueshu:%dn“,d); return 0; } int gongyue(int a,int b) { ________________________ while(b) { temp=a%b; a=b; b=temp; } ________________________ } 9. 利用递归函数调用方式,输出 6 个数字。 #include ”stdio.h“ ________________________ int main() { int w=5; fun(w); printf(”n“); return 0; } ________________________fun(________________________)

{ if(k>0) ________________________; printf(“%d”,k); } 10. 主函数调 printstar 打印一串星形图案. #include ”stdio.h“ ________________________ int main() { ________________________ ; return 0; } ________________________printstar(________________________) { printf(“*************n”); }

解答: 1. int max(int a,int b); z=max(x,y); int w; return w; 2. void int v printf(”%d“,v); nzp(a); 3. long f2(int n); s=f2(n);

long c=1; return c; 4. float fun(void); s=fun(); float s=0; return s;

5. float aver(float a[]); av=aver(sco); float av; return av;

6. long ff(int n); y=ff(n); long return f; 7. int s2,s3; int v; return v; v=vs(l.w,h); 8. int gongyue(int a,int b); d=gongyue(num1,num2);

int temp; return a; 9. void fun(int k); void int k; fun(k-1); 10. void printstar(void); printstar(); void void 四.改错题 解答: 五.编程一 解答: 六.编程二 1. 编程实现:任意输入两个正整数,求它们的最大公约数和最小公倍数。要求最大公约数 通过自定义函数来输出。 2. 编程实现:求出 10~10000 之内的所有素数。要求素数判断通过自定义函数来实现。 3. 编程实现:输出所有的“水仙花数” 。所谓“水仙花数”是指一个 3 位数,其各位数字立 方和等于该数本身。例如:153 是一个“水仙花数” ,因为 。要求水仙花数的判断通过自定 义函数来实现。 4. 编程实现:打印出 2~1000 之间的所有完数。所谓完数,是指这样的数,该数的各因子之 和正好等于该数本身,例如:6=1+2+3;28=1+2+4+7+14;因此,6、28 都是完数。要求完数 的 判断通过自定义函数来实现。 5. 编程实现:打印出 10~9999 之间的所有回文数,要求每 10 个数一行输出。要求回文数的 判 断通过自定义函数来实现。 6. 编程实现:打印出 1~9999 之间的所有同构数,所谓同构数是指一个数如果出现在该数平

方的右端,该数就是同构数。如 5,25 都是同构数。要求同构数的判断通过自定义函数来实 现 。 7. 给定一 5*5 的整型矩阵,求所有正对角线元素之和,并以矩阵的形式输出矩阵的值。要 求 :对角线元素之和及矩阵输出分别通过两个自定义函数来实现。 8. 编程实现:输入一 4*4 的矩阵的值,求出每行的最大值并输出其所在列号。要求:通过 通 过自定义函数实现矩阵的输入输出。 9. 编程实现:任意给定一个十进制的整数,将其转换成二进制,按位将其存放到数组中, 然后输出,要求数制转换通过自定义函数来实现。

10. 编程实现:任意输入一个正整数,编程求出它是几位数并将其逆序输出。要求通过自定 义函数实现求是几位数,该函数原形为:int ni(int x,int a[]);函数返回值是该数是几位 数,x 为给定的数,a 中存放该数的各个位。 11. 编写程序从键盘输入 x 和 n 的值,求 xn (n 为大于等于零的整数) ,要求用 n 递归函数求 x 。

12. 编写实现:输入两个正整数 m,n(m>n) ,计算从 m 个元素中任意取 n 个元素的组合,计 算机

公式为: 要求通过递归函数求阶乘。

13. 编程实现:从键盘任意输入 10 个不相同的整数,然后,输入要查找的数 x,如果在这 10 个 数中找到 x,则打印“Found!” ;如果找不到,则打印“Not found!” 。要求通过自定义函数

实现查找功能。 14. 从键盘输入某班 20 个学生的成绩和学号,然后从键盘任意输入一个学生的学号,查找 出 他的成绩并输出,若未找到,给出相应提示。要求通过自定义函数实现查找功能。 15. 编程实现:从键盘任意输入某班 20 个学生的姓名和成绩,输出最高分及不及格学生的 人 数。要求分别用两个自定义函数求最高分和不及格人数。 16. 编程实现:输入 2 个降序排列的整数数列,将这两个数列合并存放到另一个数组中,要 求 每个数都一次到位,不得在新数组中重新排序。要求数列合并通过自定义函数来实现。 17. 编程实现:输入 N 名职工的姓名及计算机水平考试的成绩,输出及格人数和及格的职工 信 息。要求:职工信息的输入和输出分别通过自定义函数来实现。

18. 编程实现:从键盘输入 10 名学生的信息,包括学号、姓名、成绩,用一个排序函数 sort 完成学生成绩降序排列,并输出学生排序后的结果。 19. 编程实现:任意输入一组不多于 20 个的升序排列的若干个整数,任意输入不多于 10 个 的 整数(-1 作为输入结束标志) ,将其插入到该序列中,使其依然有序。要求:通过自定义函 数实现将一个整数插入到一个有序序列中,使其依然有序。 20. 一个班级有 30 个学生,每个学生有学号、姓名及数学、语文、计算机成绩、平均成绩。 要求编程实现以下功能: 1) 从键盘上输入 30 个学生的信息,平均成绩通过公式:平均成绩=(数学+语文+计算 机 )/3 计算得出。 2) 输出所有平均成绩大于等于 85 的学生姓名(要求用自定义函数实现该功能)。 解答: 1. #include ”stdio.h“ int GreatComDiv(int m,int n); int LeaseComMul(int m,int n); void main() { int m,n,t; printf(”请输入 m 和 n 的值:“); scanf(”%d%d“,&m,&n); if((m<=0)||(n<=0))

{ printf(”输入错误!请重新输入!n“); scanf(”%d%d“,&m,&n); } if(m

int LeaseComMul(int m,int n) {int greatcomdiv; greatcomdiv=GreatComDiv( m, n); return m*n/greatcomdiv; }

2. #include ”stdio.h“ int sushu(int n); void main() { int n; printf(”input n:n“); scanf(”%d“,&n); if (sushu(n)) printf(”%d 是素数n“,n); else printf(”%d 不是素数n“,n); } int sushu(int n) { int i; for(i=2;i

return 1; }

3. 编程实现:输出所有的“水仙花数” 。所谓“水仙花数”是指一个 3 位数,其各位数字立 方和等于该数本身。例如:153 是一个“水仙花数” ,因为 。要求水仙花数的判断通过自定 义函数来实现。 #include ”stdio.h“ int fun(int n); void main() {int i; for(i=100;i<=999;i++) if (fun(i))printf(”%dn“,i); } int fun(int n) {int a,b,c; a=n/100;b=n/10%10;c=n%10; }

if (a*a*a+b*b*b+c*c*c==n)return 1;

return

0;

4. #include ”stdio.h“ int wanshu(int n); void main() { int n; printf(”input n:n“); scanf(”%d“,&n); if (wanshu(n)) printf(”%d 是完数n“,n); else printf(”%d 不是完数n“,n); } int wanshu(int n) { int i,s=0; for(i=1;i<=n/2;i++) if(n%i==0) s+=i; if(s==n) return 1; else return 0;

}

5. 方法一: #include ”stdio.h“ int huiwen(int n); void main()

上一篇:环境优美乡镇实施方案下一篇:给妈妈的生日祝福话