C 2012年笔试题(保)
1 程序改错
1.1 下面程序段的功能是交换两个字符数组的内容(每个字符串字符数均不超过100) (8分) 【 见2012年笔试题1.1】
void StrSwap(char *pa,char *pb)
{ char *temp;
temp = pa;
pa = pb;
pb = temp;
}分析:该程序中pa,pb两个字符指针变量只是形式参数,刚开始pa指向数组pa[100]的的首元素,指向pb[100]首元素;交换后pa指向数组pb[100]的的首元素,指向pa[100]首元素;而且该程序段运行结束后pa,pb两个变量由内存回收,因此最后两个字符数组的内容没有改变。
改正:
方法一:
void copy(char *pa,char *pb)
{
while(*pb!=0)
{
*pa=*pb;
pa++;
pb++;
}
*pa=0;
}
void StrSwap(char *pa,char *pb)
{
char temp[100];
copy(temp,pa);
copy(pa,pb);
copy(pb,temp);
}方法二:
void swap (char *pa ,char *pb )
{
if(strlen(pa)!=strlen(pb))exit(-1); //若长度不一致,则返回
char tmp;
int i=-1;
while(pa[++i])
{
tmp=pa[i];
pa[i]=pb[i];
pb[i]=tmp;
}
}方法三:
void swap (char *pa ,char *pb )
{
if(strlen(pa)!=strlen(pb))exit(-1);
char tmp[100];
strcpy(tmp,pa);
strcpy(pa,pb);
strcpy(pb,tmp);
}1.2 程序段如下 【 见2012年笔试题1.2】
char a[] = “House”;
char *b = “House”;
b[2] = ‘r’;
a[2] = ‘r’;
b = a;
b[2] = ‘r’;分析:
b[2] = ‘r’; //不能对字符常量赋值
a = b; a是一个地址常量,不能把地址赋给一个常量
2 简答题
2.1下面程序中,arr[]、numb、item分别是整型数组、数组元素个数、某一整数,程序功能是遍历数组arr,查找与item相等的元素,并输出该元素的下标。但是此程序不严谨,请问它可能导致什么样的异常结果?为什么?(5分) 【 见2012年笔试题2.1】
for(numb = 0;arr[numb] != item;numb --);
printf(“%d”,numb);问题:只能遍历首元素,之后数组下标会越界,而且最多只能找到一个。
修改:
for( ; numb>0 ; numb--)
if( arr[numb-1] == item)
printf("%d ",numb-1);2.2 下面程序段中各个常量、变量分别存储在内存中的什么位置、各按什么样的顺序存储、各占多少个字节?(提示:整型变量占2个字节,字符占1个字节,指针占4个字节)(10分)
【见2015年笔试题】
int k; //全局未初始化区
void main() //栈区(stack),存放函数的参数值,局部变量的值等
{
char *p = “hello”; //hello\0 在常量区, p在栈区
char q[]= ”hello”; //hello 在常量区, q在栈区 char ch; // 栈
int k; // 栈
func(k);
}
void func(int m) // 栈
{
int n; // 栈
……
}2.3在调用函数时,如果形参和实参分别是下列情况,则相应的调用方式是什么?(5分) 【见2012年笔试题2.3】
(1) 实参和形参都是数组元素 //传值调用(值传递)
(2) 形参是指针 //传地址调用(地址传递)
(3) 实参和实参都是数组 //传地址调用(地址传递)
3 编程题(共60分)
3.1 编写一个函数,使之能完成以下功能:把一个字符串逆序排列。(10分)
方法一:
#include "stdio.h"
#include "string.h"
void reverse(char str[])
{
char ch;
int i,l=strlen(str);
for(i=0; i<l/2; i++)
{
ch=str[i];
str[i]=str[l-i-1];
str[l-i-1]=ch;
}
}
int main()
{
char ss[]="abcdefg";
reverse(ss);
printf("%s",ss);
return 0;
}方法二:
# include <stdio.h>
# include <string.h> int change(char *str)
{
int i,len=0;
char c;
for( ; str[len]!='\0'; len++); //求字符串长度
for(i=0; i<len/2; i++)
{
c=str[i];
str[i]=str[len-i-1];
str[len-i-1]=c;
}
return len;
} void main()
{
int i,len;
char str[20];
printf("请输入一个字符串:");
gets(str);
len=change(str);
printf("将字符串中的字符互换输出为:"); for(i=0; i<len; i++)
{
printf("%c",str[i]);
}
printf("\n");
}3.2 编写一个函数,使之能完成以下功能:利用递归方法找出一个数组中的最大值和最小值,要求递归调用函数的格式如下:MinMaxValue(arr,n,&max,&min),其中arr是给定的数组,n是数组的个数,max、min分别是最大值和最小值。(15分) 【见2015年笔试题【保】】
方法一:
#include "stdio.h"
#define N 10 void MinMaxValue(int arr[],int n,int *max,int *min)
{
if(n>=0)
{
if(*max<arr[n])
*max=arr[n]; if(*min>arr[n])
*min=arr[n]; MinMaxValue(arr,n-1,max,min);
}
} int main()
{
int max=-32768,min=32767; //int最小数就是 -32768最大数就是 32767
int a[]= {1,54,23,65,87,12,54,87,98,233};
MinMaxValue(a,N-1,&max,&min); //传入地址
printf("Max=%d,Min=%d\n",max,min);
return 0;
}方法二:
#include "stdio.h"
#define N 10 void MinMaxValue(int arr[],int n,int *max,int *min)
{
if(n>0)
{
if(*max<arr[n])
*max=arr[n]; if(*min>arr[n])
*min=arr[n]; MinMaxValue(arr,n-1,max,min);
}
} int main()
{
int a[]= {1,-8,23,65,87,12,54,887,98,233};
int max=a[0],min=a[0];
MinMaxValue(a,N-1,&max,&min);
printf("Max=%d,Min=%d\n",max,min);
return 0;
}方法三:
#include<stdio.h>
void MinMaxValue(int arr[],int n,int *max,int *min)
{
if(n==0) return;
if(arr[n-1]>*max)
*max=arr[n-1];
if(arr[n-1]<*min)
*min=arr[n-1];
MinMaxValue(arr,n-1,max,min);
}
void main()
{
int arr[]= {1,3,4,2,56,5};
int max=arr[0],min=arr[0];
MinMaxValue(arr,sizeof(arr)/sizeof(int),&max,&min); //sizeof(arr)/sizeof(int)指数组长度
printf("%d-%d\n",max,min);
}3.3 【文件】编写一个函数,使之能完成以下功能:把file1.doc的内容全部复制到file2.doc中,file1.doc中全部是字符(含空格),要求复制时,在file2.doc中的每一行都要加上行号,例如:行号*(其中“*”表示具体的数字)。最后该函数返回file1.doc中的字符个数(不包括空格)。(10分)
方法一:
#include <stdio.h>
#include <stdlib.h> int exam()
{
char ch;
int count=0,row=0;
FILE *fp1,*fp2;
fp1=fopen("D:\file1.doc","r+");
while(!feof(fp1))
/*
feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
*/
{
ch=getc(fp1); //getc取一个字符
fp2=fopen("D:\file2.doc ","a+");
if(ch!=' ')
count++;
if(ch=='\n')
{
row++;
fprintf(fp2,"行号:%d",row);
fprintf(fp2,"\n"); }
else
{
putc(ch,fp2);
}
fclose(fp2);
}
fclose(fp1);
return count;
} int main()
{
int sum=exam();
printf("Sum=%d\n",sum);
return 0;
}方法二:
# include <stdio.h>
# include <stdlib.h> void main()
{
FILE *fp1,*fp2;
int count=0, row=0;
char c; fp1=fopen("D:/file1.txt","r");
fp2=fopen("D:/file2.txt","w"); if(fp1== NULL)
{
printf("文件不能打开!\n"); // 当前目录不存在 file1.txt 文件 或者 该文件损坏
exit(0);
}
if(fp2== NULL)
{
printf("文件不能打开!\n");
exit(0);
} while( (c=fgetc(fp1)) != EOF )
{
if(c!=' ')
count++;
if(c=='\n')
{
row++;
fprintf(fp2,"行号:%d",row);
}
fputc(c,fp2);
} fclose(fp1);
fclose(fp2);
printf("count=%d,row=%d\n",count,row);
}方法三:
#include<stdio.h>
void main()
{
FILE *fin,*fout;
int count=0,line=0;
if(!(fin=fopen("D:/file1.txt","r")))
printf("error");
if(!(fout=fopen("D:/file2.txt","w")))
printf("error");
fprintf(fout,"行号%d ",line++);
while(!feof(fin))
{
char ch=fgetc(fin);
putchar(ch); //输出字符到显示输出框
if((ch!=' ')&& (ch!='\n'))
count++;
fputc(ch,fout); //复制到文件中
if(ch=='\n')
fprintf(fout,"行号%d ",line++); //一行结束时,重新在复制文件中打印行号
}
fprintf(fout,"总个数%d ",count--); //最后在复制文件中打印总个数
printf("总个数%d ",count--); //输出总个数到显示输出框
fclose(fin);
fclose(fout);
}3.4 编写一个完整的程序,使之能完成以下功能:从键盘中输入若干个整数,用链表储存这些输入的数,并要求存储的顺序与输入的顺序相反。(10分) 【见2016年笔试题4.4】
方法一:
# include <stdio.h>
# include <malloc.h> struct node
{
int val;
struct node *next;
}; //创建链表
struct node* createList()
{
struct node *head,*p;
int i,len,val; //建立头结点
head = (struct node*)malloc( sizeof(struct node) ); if(head==NULL)
{
printf("空间申请失败!\n");
return NULL;
} head->val=NULL;
head->next=NULL; printf("请输入结点数目:\n"); scanf("%d",&len); printf("\n\n"); for(i=0; i<len; i++)
{
p = (struct node*)malloc( sizeof(struct node) ); if(p==NULL)
{
printf("空间申请失败!\n");
return NULL;
} printf("请输入第%d个结点的值:\n", i+1); scanf("%d",&val);
// 头插法建表
p->val=val; p->next = head->next; head->next=p; } return head;
}
//链表输出
void traverse(struct node *head)
{
struct node *p=head->next;
if(p == NULL)
{
printf("链表为空!\n");
return ;
} while(p!=NULL)
{
printf("%d ",p->val);
p=p->next;
} printf("\n");
} void main()
{
struct node *head; head = createList(); printf("\n链表创建完成并遍历输出:\n\n"); traverse(head); }方法二:
#include "stdio.h"
#include "stdlib.h"
struct sList
{
int data;
struct sList *next;
};
struct sList *head=NULL;
struct sList *creat() //创建链表
{
int n;
struct sList *p,*q;//q new
head=(struct sList *)malloc(sizeof(struct sList));
head->next=NULL;
p=head;
while(1)
{
printf("(0结束)n=");
scanf("%d",&n);
if(n<=0) break;
else
{
//尾插法,顺序接收
q=(struct sList *)malloc(sizeof(struct sList));
q->data=n;
p->next=q;
q->next=NULL;
p=q;
}
}
return head;
}
void ShowList(struct sList *head) //显示链表
{
struct sList *p=head->next;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
}
int main()
{
struct sList *p,*newhead,*p1;
ShowList(creat());
printf("\n");
p=head->next;
newhead=head;
//链表倒置
newhead->next=NULL;
while(p!=NULL)
{
p1=p;
p=p->next;
p1->next=newhead->next;
newhead->next=p1;
}
head=newhead;
printf("\n");
ShowList(head);
return 0;
}方法三:
#include<stdio.h>
#include<malloc.h>
struct Node
{
struct Node*next;
int data;
};
void main()
{
int i=0,n;
struct Node *head,*p;
printf("格式:第一行数据的个数,第二行,输入数据空格隔开\n");
scanf("%d",&n);
head=malloc(sizeof(struct Node));
head->next=NULL;
for(; i<n; i++)
{
int temp;
scanf("%d",&temp);
p=malloc(sizeof(struct Node));
p->data=temp;
//头插法
p->next=head->next;
head->next=p;
}
//打印输出
p=head->next;
while(p)
{
printf("%d\n",p->data);
p=p->next;
}
}3.5 【文件+堆栈】编写一个完整的程序,使之能完成以下功能:一段名为file.c的程序,该程序中含有括号,现要检查程序中的括号是否配对,提示:利用堆栈实现。(15分) 【见2015年笔试题【保】6】
代码:
#include <stdio.h>
#define Stack char
#define Max 999
int judge(char p[])
{
int len=strlen(p);
int top=-1,i;
Stack s[Max];
for(i=0; i<len; i++)
{
switch(p[i])
{
case '(':
case '[':
case '{':
s[++top]=p[i];
break;
case ')':
if(s[top]=='(')
top--;
else return 0;
break;
case ']':
if(s[top]=='[')
top--;
else return 0;
break;
case '}':
if(s[top]=='{')
top--;
else return 0;
break;
}
}
if(top==-1)
return 1; //输出1表示匹配成功
else
return 0; //输出0表示匹配失败
}
void main()
{
char p[Max];
FILE * fin;
if(!(fin=fopen("D:/file1.txt","r")))
printf("failed");
while(!feof(fin))
{
fscanf(fin,"%s",p);
}
printf("%d\n",judge(p));
fclose(fin);
}3.6 将输入的一个数质因分解,如Input 90,Print:90=2*3*3*5.
方法一:
#include <stdio.h>
#include <math.h>
int a[100];
//判断是否是质数
int isPrime(int n)
{
int i;
for(i=2; i<=sqrt(n); i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
int i,j,in;
while(scanf("%d",&in)&&in>-1)
{
if(in==0||in==1)
printf("没有质因数");
else
{
j=0;
printf("%d=",in);
while(in>3)
{
//质数从2开始,判断i是否是质数
for(i=2; i<=in; i++)
{
if(isPrime(i)&&in%i==0)
break;
}
in=in/i;
//把满足的质数存于数组中
a[j++]=i;
}
if(in>1)
a[j++]=in;
//输出
for(i=0; i<j; i++)
{
printf("%d",a[i]);
if(i<j-1)
printf("*");
}
printf("\n");
}
}
return 0;
}方法二:
# include <stdio.h> void main()
{
int i,j,k,val;
printf("请输入一个正整数:");
scanf("%d",&val); printf("将该正整数分解质因数输出为: ");
printf("%d=",val);
//以下为算法
for(i=2 ; i<=val; i++)
{
while(val!=i)
{
if(val%i == 0)
{
printf("%d*",i);
val=val/i;
}
else
break ;
}
}
printf("%d",val);
printf("\n");
}3.7
方法一:
# include <stdio.h> void main()
{
float sum=1, sum1=1, sum2=1, sum3, x; int i, n, flag=-1; printf("请输入x的值:\n");
scanf("%f", &x); printf("请输入n的值:\n");
scanf("%d", &n); for(i=1; i<=n; i++)
{
sum1 = sum1*x; //sum1为x^n
sum2 = sum2*i; //sum2为n!
sum3 = sum1/sum2 * flag; //sum3为 x^n/n!
flag = -flag; //变号
sum = sum + sum3;
}
printf("Sum=%f\n", sum ); }方法二:
#include "stdio.h"
#include "math.h"
int nJie(int a);
int main()
{
int i,n,sign;
float ex=1,temp,x,fenmu,fenzi;
printf("n=");
scanf("%d",&n);
printf("x=");
scanf("%f",&x);
for(i=1; i<=n; i++)
{
fenzi=pow(x,i);//计算以x为底的i次方值
fenmu=nJie(i);
temp=fenzi/fenmu;
//变号
if(i%2==0)
sign=1;
else
sign=-1;
ex+=sign*temp;
}
printf("ex=%6.2f",ex);
return 0;
}
//求a!
int nJie(int a)
{
int i,ex=1;
for(i=1; i<=a; i++)
ex*=i;
return ex;
}
C 2012年笔试题(保)的更多相关文章
- C 2012年笔试题
1指出程序段中的错误:分析错误的原因,并进行修改 1.1函数 swap 将两个字符串(字符数组作实参,长度不超过 100)的内容进行交换 void swap(char *pa,char *pb) { ...
- 收藏所用C#技术类面试、笔试题汇总
技术类面试.笔试题汇总 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化,不要梦想着把题覆盖了,下面的题是供大家查漏补 ...
- Android开发面试经——2.常见Android基础笔试题
标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报 分类: Android开发(29) 版 ...
- 嵌入式Linux C笔试题积累(转)
http://blog.csdn.net/h_armony/article/details/6764811 1. 嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...
- 一道关于java 类初始化 成员初始化的笔试题的解析
代码如下: java笔试题public class Mapplication { private static int n; private static Mapplication m1 = new ...
- 华为C语言笔试题集合
①华为笔试题搜集 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为 ...
- 【转载】经典10道c/c++语言经典笔试题(含全部所有参考答案)
经典10道c/c++语言经典笔试题(含全部所有参考答案) 1. 下面这段代码的输出是多少(在32位机上). char *p; char *q[20]; char *m[20][20]; int (*n ...
- 嵌入式C开发人员的最好的0x10道笔试题
嵌入式C开发人员的最好的0x10道笔试题 2006-11-22 15:53 约定: 1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了 2)数据类型 char 一个字节 1 byte int ...
- 前端笔试题2 JS部分
笔试题2 var EventME = {}; EventME.addHandle = function(ele, eventName, handleFunction) { if (ele.addEve ...
随机推荐
- SQL中 decode()函数简介
SQL中 decode()函数简介 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: ...
- Flask设置Access-Control_Allow_Origin实现跨域访问
前端访问Flask的接口,浏览器报错:has been blocked by CORS policy: No 'Access-Control-Allow-Origin' heade 需要将Flask的 ...
- Zookeeper的使用场景和集群配置
Zookeeper的介绍 ZK在分布式系统的应用 Zookeeper搭建 集群角色介绍 ZK的常用命令 一.Zookeeper的介绍 官方:ZooKeeper是一个分布式的,开放源码的分布式应用程序协 ...
- vim 编辑器技巧 打开多窗口编辑 vsp
我有两个配置文件 [root@gameserver1 conf]# ls auth_1.json auth_2.json 先打开auth_2.json 在vim编辑器中打开auth_1.json,在打 ...
- 手把手教你如何用MSF进行后渗透测试!
在对目标进行渗透测试的时候,通常情况下,我们首先获得的是一台web服务器的webshell或者反弹shell,如果权限比较低,则需要进行权限提升:后续需要对系统进行全面的分析,搞清楚系统的用途:如果目 ...
- Nginx之常用基本配置(三)
前面我们聊了下了Nginx作为WEB服务器对客户端请求相关配置,文件操作优化.Nginx访问控制.basic验证,.状态模块状态页.gzip压缩配置:回顾请参考https://www.cnblogs. ...
- Java常见的类——Number和Math类
但我们使用数据时,我们一般使用内置数据类型,列如:byte,int,long,double等,但是在实际开发过程中,我们一般遇到的是需要使用对象,这时,我们就可以使用 Java 专门为每一个数据类型提 ...
- checkbox,radio自定义美化表单
原理 利用label标签,包裹input的时候,点击label等同于点击input,再用背景图片显示选中和取消选中状态 效果 图片 复选 <!DOCTYPE html> <html& ...
- 关于使用fastjson出现的问题:com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 1, fastjson-version 1.2.44
先说下需求:是从redis中根据keys批量获取数据集合,再通过fastjson转为对象集合 代码如下: 在postman测试后,出现错误如下: 刚开始以为是使用fstjson方法不对,后面先通过打断 ...
- 微信小程序转化为uni-app项目
前言: 之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的功能,但是由于自己前端抠脚的原因没有写出来,然后自己在网上搜索的时候发现了有个微信小程序里面的页面及其的符合我的需求.那么问题 ...