C 2012年笔试题
1指出程序段中的错误:分析错误的原因,并进行修改
1.1函数 swap 将两个字符串(字符数组作实参,长度不超过 100)的内容进行交换
void swap(char *pa,char *pb)
{
char *temp;
temp=pa;
pa=pb;
pb=temp;
}错误原因:只是将 swap 中的局部变量 pa 和 和 pb 的值进行了交换,而作为实参的字符数组中 的内容并没有改变
改正一:
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;
}
}全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 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 input(char *p)
{
while(p)
{
printf("%d\t",*p);
p++;
}
}
int main()
{
char a[] = "hello",b[] = "world";
swap(a,b);
printf("交换后:\na=%s\nb=%s",a,b);
return 0;
}改正二:
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);
}全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> void swap (char *pa ,char *pb )
{
if(strlen(pa)!=strlen(pb))exit(-1);
char tmp[100];
strcpy(tmp,pa); //strcpy(s1,s2):将字符串s2复制到s1中
strcpy(pa,pb);
strcpy(pb,tmp);
}
void input(char *p)
{
while(p)
{
printf("%d\t",*p);
p++;
}
}
int main()
{
char a[] = "hello",b[] = "world";
swap(a,b);
printf("交换后:\na=%s\nb=%s",a,b);
return 0;
}1.2程序片段:
错误点一:pb[1]=’A’, 错误原因:pb 指向一个常量字符串,不可修改其串中某个元素。
错误点二:strcpy(pa,”ABCDEFGXYZ”), 错误原因:pa 字符数组长度不够,导致溢出
2简答题(共 30 分)
2.1设 arr 为整型数组,num 和 item 为整型变量,N=数组元素个数-1。需要查找 item 是否在数组中,如果程序片段为 for(num=N;arr[num]!=item;num--); printf(“%d\n”,num); 可能导致的异常结果是什么?为什么?(8 分)【见2014 2.1】
异常结果:num 为负数,当查找的 item , 不在数组中的时候,num 会变为负数,直至找着 item,
这时查找已经越界了
2.2 设有递归函数
int value(int n)
{
int x;
if(n==0)return0;
else
{
scanf(“%d”,&x);
return(value(n-1)+x);
}
}如该函数被调用时,参数 n 值为 4,输入的 x 的值依次为 11,22,33,44,函数调用结束时返回值是多少?并用图描述函数递归执行过程。(10 分)
程序段的功能是将输入的 n 个值求和,因此返回值是:11+22+33+44=110。
函数递归执行过程:2.3数组作为函数参数有三种形式: 1)实参是数组元素; 2)形参是指针,实参是数组; 3)函数的形参和实参都是数组分别是采用什么参数传递方式?(5 分)
参数传递方式分别为:传值、 传地址、传地址。
2.4采用高度抽象概念有利于程序设计,C 语言中循环语句 do s while(B);对应的显示控制结构是什么?请使用伪代码形式(通过条件转移指令)表达。(7 分)
循环控制结构
label: s;
If(B) goto label;3 程序设计(共 45 分,每题的算法 50%,语法 30%,完整 20%)
3.1 利用 2 个函数对输入的两个分数进行加、减、乘、除四则运算和输出用分数表示的结果。(注:输入格式为:%ld/%ld%c%ld/%ld,输出格式为%ld/%ld),例如:输入 1/4+1/3,输出:7/12 (10 分)
#include<stdio.h>
#include<stdlib.h> long fz1,fm1,fz2,fm2,fz3,fm3;
char op;
//求a,b的最大公约数
long gcd(long a,long b)
{
int r;
while(b)
{
r=a%b;
a=b;
b=r; }
return a;
}
void compute()
{
long zxg;
switch(op)
{
case '+':
case '-':
zxg=fm1*fm2/gcd(fm1,fm2); // zxg是fm1和fm2的最小公倍数
fz1=zxg/fm1*fz1;
fz2=zxg/fm2*fz2;
if(op=='+')
fz3=fz1+fz2;
else
fz3=fz1-fz2;
fm3=zxg;
break;
case '*':
fz3=fz1*fz2;
fm3=fm1*fm2;
break;
case '/':
fz3=fz1*fm2;
fm3=fm1*fz2;
break;
default:
exit(-1);
}
zxg=gcd(fz3,fm3);
fz3=fz3/zxg;
fm3=fm3/zxg;
printf("%ld/%ld\n",fz3,fm3);
}
int main()
{
while(scanf("%ld/%ld %c %ld/%ld",&fz1,&fm1,&op,&fz2,&fm2)!=EOF)
{
compute();
system("pause");
}
return 0;
}3.2 编写函数,将单链表进行逆序,即表头变表尾,表尾变表头(15 分) 【见2017.24】
3.2.1方法一:头插法
代码:
// 方法一:头插法 逆序链表
void reverseslist1()
{
struct slist *p,*r; // p是工作指针,r是p的后继,以防断链
p = head ->next; //从第一个元素开始
head ->next = NULL; //将头节点后置null,断开
while(p != NULL)
{
r = p ->next; // r暂存s后继
p ->next = head ->next; // 依次将元素结点摘下
head ->next = p;
p = r;
}
}全部代码:
#include <stdio.h>
#include <stdlib.h> typedef struct slist
{
int data;
struct slist *next;
};
struct slist *head; // 尾插法建立链表
void creatslist()
{
int x;
head = (struct slist *)malloc(sizeof(struct slist)); //头结点
struct slist *p,*node; // q为尾指针
p = head; printf("请输入元素:");
scanf("%d",&x);
while(x != 9999)
{
node = (struct slist *)malloc(sizeof(struct slist));
node ->data = x;
p ->next = node;
p = node;
printf("请输入元素:");
scanf("%d",&x);
}
p ->next = NULL;
}
//链表输出打印
void inputslist()
{
struct slist *q;//q是工作指针
q = head ->next; //头结点无元素
while(q != NULL)
{
printf("%d\t",q ->data);
q = q ->next;
}
}
// 方法一:头插法 逆序链表
void reverseslist1()
{
struct slist *p,*r; // p是工作指针,r是p的后继,以防断链
p = head ->next; //从第一个元素开始
head ->next = NULL; //将头节点后置null,断开
while(p != NULL)
{
r = p ->next; // r暂存s后继
p ->next = head ->next; // 依次将元素结点摘下
head ->next = p;
p = r;
}
}
void main()
{
creatslist();
inputslist();
printf("\n逆序后:\n");
reverseslist1();
inputslist();
}3.2.2方法二:后继指针指向前驱结点
代码:
// 方法二:后继指针指向前驱结点
void reverseslist2()
{
struct slist *pre,*p = head ->next,*r =p ->next;
p ->next = NULL; //处理第一个结点
while(r != NULL) // r若为空,则p为最后一个节点
{
pre = p;
p = r;
r = r ->next;
p ->next = pre;
}
head ->next = p; //处理最后一个结点
}全部代码:
#include <stdio.h>
#include <stdlib.h> typedef struct slist
{
int data;
struct slist *next;
};
struct slist *head; // 尾插法建立链表
void creatslist()
{
int x;
head = (struct slist *)malloc(sizeof(struct slist)); //头结点
struct slist *p,*node; // q为尾指针
p = head; printf("请输入元素:");
scanf("%d",&x);
while(x != 9999)
{
node = (struct slist *)malloc(sizeof(struct slist));
node ->data = x;
p ->next = node;
p = node;
printf("请输入元素:");
scanf("%d",&x);
}
p ->next = NULL;
}
//链表输出打印
void inputslist()
{
struct slist *q;//q是工作指针
q = head ->next; //头结点无元素
while(q != NULL)
{
printf("%d\t",q ->data);
q = q ->next;
}
}
// 方法二:后继指针指向前驱结点
void reverseslist2()
{
struct slist *pre,*p = head ->next,*r =p ->next;
p ->next = NULL; //处理第一个结点
while(r != NULL) // r若为空,则p为最后一个节点
{
pre = p;
p = r;
r = r ->next;
p ->next = pre;
}
head ->next = p; //处理最后一个结点
} void main()
{
creatslist();
inputslist();
printf("\n逆序后:\n");
reverseslist2();
inputslist();
}3.3编写完整程序:接收从键盘输入的仅由数字字符构成的字符串(假设字符串的最大长度为 50),统计并输出每个数字(0~9)的重复次数。(8 分)
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char ch;
int num[10]= {0};
printf("string:\n");
//出现次数存储在数组中
while(scanf("%c",&ch)!=EOF&&ch!='q')
num[ch-'0']++;
int i;
for(i=0; i<10; i++)
printf("%d 出现%d 次\n",i,num[i]);
system("pause");
return 0;
}解析:
while(scanf("%c",&ch)!=EOF)C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束(while的意思就是说当当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。
结束条件:
在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.
3.4 编写完整程序,采用结构数组和指向结构的指针,接收输入的 100 个学生信息(包括学号和 C 语言课程期末总成绩),输出最高、最低成绩和分别对应的学号(可能有多个同学都是最高分,可能有多个同学都是最低分)。(12 分)【见2016年4.3】
代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int num;
int cj;
};
int main()
{
struct node stu[100]; //结构数组
int max=-1,min=200;
int i;
//输入数据,求最大最小分数
for(i=0; i<100; i++)
{
scanf("%d %d",&stu[i].num,&stu[i].cj);
if(stu[i].cj>max)
max=stu[i].cj;
if(stu[i].cj<min)
min=stu[i].cj;
}
//输出分数最大以及学号
printf("max=%d\n",max);
for(i=0; i<100; i++)
if(stu[i].cj==max)
printf("%d\n",stu[i].num);
//输出分数最小以及学号
printf("min=%d\n",min);
for(i=0; i<100; i++)
if(stu[i].cj==min)
printf("%d\n",stu[i].num);
system("pause");
return 0;
}使用结构的指针
#include<stdio.h> typedef struct Student{
int num;
int score;
}Stu; int main()
{
/*选择排序:
假设排序表为L【1....n】,第一趟排序即从L【i...n】中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序
*/
Stu stu[200],temp,*p,*q,*k; //stu为结构体数组,*p,*q,*k为结构体指针
int i,j,max = 0; //max记录分数最大值
p = stu;
//输出数据
for(i = 0;i < 200;i ++,p ++)
scanf("%d%d",&p->num,&p->score);
//选择排序,以成绩从低到高排序
p = stu;
for(i = 0;i < 199;i ++,p ++) //由于题目说明要用结构体指针,所以我这使用指针操作
{
k = p; //记录最小元素位置
q = p + 1;
for(j = i + 1;j < 200;j ++,q ++)
if(k->score > q->score)
k = q; //更新最小元素的位置
//与第i个位置交换
temp = *p;
*p = *k;
*k = temp;
}
//记录最高成绩
p = stu;
for(i = 0;i < 200;i ++,p ++)
if(p->score > max)
max = p->score;
//输出打印最高分数和对应的学号
p = stu;
for(i = 0;i < 200;i ++,p ++)
if(p->score == max)
printf("学号:%5d分数:%5d\n",p->num,p->score); return 0;
}
C 2012年笔试题的更多相关文章
- C 2012年笔试题(保)
1 程序改错 1.1 下面程序段的功能是交换两个字符数组的内容(每个字符串字符数均不超过100) (8分) [ 见2012年笔试题1.1] void StrSwap(char *pa,char ...
- 一道关于java 类初始化 成员初始化的笔试题的解析
代码如下: java笔试题public class Mapplication { private static int n; private static Mapplication m1 = new ...
- 华为C语言笔试题集合
①华为笔试题搜集 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为 ...
- 前端笔试题2 JS部分
笔试题2 var EventME = {}; EventME.addHandle = function(ele, eventName, handleFunction) { if (ele.addEve ...
- Microsoft2013校园招聘笔试题
Microsoft2013校园招聘笔试题 继续求拍砖!!!! 1. You are managing the database of a book publichser, you currently ...
- 某公司的U3D笔试题
某公司的U3D笔试题 今天这套笔试题感觉做得一般. 随后是二对一的技术面试,但涉及的技术细节相对较少,更多的是对以前工作.项目经历的询问. 然后说今天先到这里,让我等通知. 我还特意问了一下,通知 ...
- 汉王JAVA笔试题
汉王JAVA笔试题 1,jsp中动态include与静态include的区别? (1)动态包含总是会检查文件中的变化,适合用于包含动态页面,并且可以带参数. (2)静态包含不会检查所含文件的变化,适用 ...
- 对Thoughtworks的有趣笔试题实践
记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...
- 从阿里巴巴笔试题看Java加载顺序
一.阿里巴巴笔试题: public class T implements Cloneable { public static int k = 0; public static T t1 = new T ...
随机推荐
- Intellij IDEA创建 Web 项目
快速构建 Web 项目 打开IDEA,新建Project,左边菜单栏选择 Maven,直接点 Next 选择GroupId和ArtifactId 选择项目名称,默认会填上工程位置.模块姓名等,直接点F ...
- sphinx + mysql 全文索引配置
参考地址 http://v9.help.phpcms.cn/html/2010/search_0919/35.html http://blog.sina.com.cn/s/blog_705e4fdc0 ...
- JAVA如何判断两个字符串是否相等
==比较引用,equals 比较值 1.java中字符串的比较:== 我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题 example1: String a=&qu ...
- codeblocks升级c++17版本
用了大半年的codeblocks,今天居然发现我还不会配置MINGW版本,现在C++已经更新到c++20了,而我还在用c++11,所以今天记录一下怎么更新c++版本吧. 其实步骤没有我们想象的那么困难 ...
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 一篇文章带您读懂List集合(源码分析)
今天要分享的Java集合是List,主要是针对它的常见实现类ArrayList进行讲解 内容目录 什么是List核心方法源码剖析1.文档注释2.构造方法3.add()3.remove()如何提升Arr ...
- 如何提高码农产量,基于java的web快速开发平台之自定义表单开发随笔
老板 :下班前一定写完? 程序猿:可以,下班前能一定给! 第二天早上上班~~~ 老板:这都第二天了,怎么没写完? 程序猿:我还没有下班呢! 哎!程序猿的痛啊 公司上线的项目有不少销售记录表,又是报价单 ...
- mac中如何复制拷贝文件或文件夹的路径
copy path in Mac 首先打开 automator(自动操作) 然后 最后command+s保存,命名为copy path. 然后随便找个文件右击,选择服务,再选择 copy path , ...
- 《数字信号处理》课程实验2 – FIR数字滤波器设计
一.FIR数字滤波器设计原理 本实验采用窗函数法设计FIR数字低通滤波器.我们希望设计的滤波器系统函数如下: \(H_{d}\left( e^{jw} \right) = \left\{ \begi ...
- HTML与CSS 开发常用语义化命名
一.布局❤️ header 头部/页眉:index 首页/索引:logo 标志:nav/sub_nav 导航/子导航:banner 横幅广告:main/content 主体/内容:container/ ...