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 ...
随机推荐
- LeetCode【面试题 16.17. 连续数列】
------------恢复内容开始------------ 题目描述 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5 ...
- 简单说 JavaScript中的tostring( ) 与 valueOf( )方法
说明 所有的对象都继承有toString() 和 valueOf() 方法,对象到字符串,对象到数字的转换,会通过调用待转换对象的这两个方法中的一个来完成. 解释 toString( )方法的作用是: ...
- grid实战之微信钱包 腾讯服务界面
网格布局简介 CSS3网格布局是让开发人员设计一个网格并将内容放在这些网格内.而不是使用浮动制作一个网格,实际上是你将一个元素声明为一个网格容器,并把元素内容置于网格中. 有一些浏览器是不支持网格布局 ...
- 初窥Mybatis初始化
引言 这篇文章呢,主要是讲Mybtais的两种方式的源码剖析:传统方式以及Mapper代理方式,初次探索Mybatis源码,希望大佬勿喷并且指正错误,谢谢! 个人博客:www.fqcoder.cn 一 ...
- SpringBoot图文教程14—SpringBoot集成EasyExcel「上」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- 《JavaScript 模式》读书笔记(2)— 基本技巧1
这篇文章的主要内容,介绍了一些js编程中的基本技巧,其实这些技巧,大家在开发的过程中,或多或少都在使用,或者已经可以熟练的应用于自己的代码或项目中了.那么,这篇文章,就一起来回顾下这些“基本技巧”. ...
- Google Flutter Clock 大赛优秀项目推荐
Flutter 在 Google 加持下,如今可以作为跨平台首选了.早在 Flutter 刚刚出现强势苗头,我作为第一批体验了一把,<Flutter 初尝:从 Java 无缝过渡>,不过也 ...
- 【摩天大楼平地起】基础篇 09 简述N种查找算法
引言 在开始之前首先可以先思考一下假如没有查找算法会是什么情况?所有数据结构都需要全部遍历一遍,每次都一遍又一遍的查,从本质而言查找算法就是为了提高效率. 经过前人一代又一代的努力,目前的查找算法大致 ...
- LeetCode(239.滑动窗口的最大值
题目: 给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到最右侧,你只可以看到滑动窗口内的k个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示例: 输入: nums = ...
- 【python】提取sql语句中的表名
前言 最近刚学python,写一个小工具时需要提取sql语句中表名,查询一番后找到一篇文章挺不错的,mark一下 PS.那篇文章是转载的,且没有标注转载自哪里 正文 import ply.lex as ...











