C 2014年笔试题
1、指出程序中的错误,说明原因并修正
1.1
int *p,*q;
p=malloc(sizeof(int)*20);
q=malloc(sizeof(int)*10);
…
q=p;
…
free(p);
free(q);分析:
错误1,q原本储存一片int类型的内存区域的地址,在没有释放这片地址时就修改了q的内容,使这片区域无法收回,导致内存泄漏。
错误2,p与q指向同一片内存区域,在使用free(p)后该内存区域已经释放,不能再free一遍。改正:将free(q)放在q=p前面(改正有多种说法,这里选择其中一种)
1.2
//交换字符串
void swap(char *p, char *q)
{
char *temp; //p、q所指的值的交换
*temp=*p;
*p=*q;
*q=*temp;
}分析:该代码首先创建了形参p和q接受两个char类型的地址,在代码内部交换的这两个形参的内容,没有对外界产生任何影响。
该代码的修改如下:
void swap(char *p, char *q)
{
char temp[100];
strcpy(temp,p); //strcpy函数:复制字符串
strcpy(p,q);
strcpy(q,temp);
}
2、简答题
2.1 arr为整型数组,N为数组长度,enumb为整型变量,下列函数负责找出arr数组中等于enumb的元素所在位置。指出程序的三种异常,并说明原因。
for(i=N-1;arr[i]!=enumb;--i)
printf(“%d”,i);分析:
首先for循环后面应该有分号,否则每次循环都有输出。
其次如果arr数组中没有enumb,i就会变为负号,数组溢出。
最后,若i一直减小,i会减小直到溢出。
2.2 if(B) s1 else s2;是什么结构?使用显示结构语言该如何表示?并标出条件跳转和强制跳转
分析:条件分支结构
if(b) goto L1;//条件跳转
goto L2;//强制跳转
L1: s1
L2: s2
2.3 C语言中,常量存储在哪里?静态局部变量和静态全局变量存储在哪里?
分析:常量存储在常量区,静态局部变量和静态全局变量存储在全局数据区。
3填空题
3.1 下面程序是对链表进行选择排序,填上空缺的部分
list selectsort(list head){
list p = (struct node*)malloc(sizeof(node));
p->next = head;
head = p;//新建一个头结点
p = head->next;
list k = head, q = head; while (p->next)
{
q = p->next;
k = q; //k记录最小值位置
//找到最小元素位置
while (q) {
if (q->data < k->data) {
k = q;
}
q = q->next;
}
//交换元素位置
if (p->next != k) {
int r = p->next->data;
p->next->data = k->data;
k->data = r;
}
p = p->next; //填空一
}
p = head;
head = head->next; //填空二
free(p); //释放头结点
return head; //填空三
}
3.2 快速排序法求某个数组前n个元素第k大的数
int find_k(int *a, int n,int k) {
int i, j, t;
int low = 0,high = n - 1;
do {
i = low; j = high; t = a[low];
do {
while (a[j]>t) j--;
while (a[i]<t) i++;
if ()
swap(&a[j], &a[i]);
else
;
} while (i<j);
if (i == k)
return t;
if (i>k)
;
if (i<k)
;
} while (low<high);
;
}分析:该题目使用快排划分的第一种写法,原理是利用每次快排划分之后总能确定一个元素的最终位置。该程序可能仍然存在问题,最大的数字是第0个。
int find_k(int *a, int n,int k) { //从大到小排序
int i, j, t;
int low = 0,high = n - 1;
do {
i = low; j = high; t = a[low];
do {
while (a[j]<t) j--;
while (a[i]>t) i++;
if (i<j)
swap(&a[j], &a[i]);
else
break; //填空1
} while (i<j);
if (i == k)
return t;
if (i>k)
high = i - 1; //填空2
if (i<k)
low = i + 1; //填空3
} while (low<high);
return a[low]; //填空4
}
3.3约瑟夫环问题 【见2015年】
int a[N + 1];
int *p = a, i,j,k;
for(i = 0; i<N + 1; i++)
*(p+i) = i;
;
;
for( i = 0; k != 1; p++)
{
if()
p = a + 1;
if()
i++;
if()
{
k--;
i = 0;
*p = 0;
}
}
for(i = 0; i<N + 1; i++)
{
if()
printf("%d\n",a[i]);
}分析:与15年约瑟夫环区别
int a[N + 1];
int *p = a, i,j,k;
//赋值0~N
for(i = 0; i<N + 1; i++)
*(p+i) = i;
p = a + 1; //填空1
k = N; //填空2
for( i = 0; k > 1; p++) //k为剩下的人数
{
if(p>a + N)
p = a + 1;
if(*p != 0) //碰到元素为0说明已经杀死,不参与计数
i++; //i报数
if(i == 3)
{
k--;
i = 0;
*p = 0;
}
}
//打印输出
for(i = 0; i<N + 1; i++)
{
if(a[i] != 0)
printf("%d\n",a[i]);
}
3.4 完美乘法,若a*b=c,且abc中0~9的数字各出现一次,填写程序空缺处。
int f[10],s[3];
int n=0;
for (int a = 12; a<999; a++)
{
int t = 0;
//清空数字计数
for (int x = 0; x<10; x++)
f[x] = 0;
for (int b = 345; b<9999; b++)
{
int c ;
; //填空一
s[0] = a;
s[1] = b;
s[2] = c;
//计算abc中出现数字的次数
for (int x = 0; x < 3; x++)
{
int y = s[x];
while ()
{
int t = y % 10;
f[t]++;
; //填空二
}
}
//检查是否每个数都个出现一次
for (int x = 0; x<10; x++)
{
if () ; //填空三
}
if ()
printf("%d*%d=%d\n",a,b,c);
;//填空四
}
}分析:
int f[10],s[3];
int n=0;
for (int a = 12; a<999; a++)
{
int t = 0;
//清空数字计数
for (int x = 0; x<10; x++)
f[x] = 0;
for (int b = 345; b<9999; b++)
{
int c = a*b;
s[0] = a;
s[1] = b;
s[2] = c;
//计算abc中出现数字的次数
for (int x = 0; x < 3; x++)
{
int y = s[x];
while (y > 0)
{
int t = y % 10;
f[t]++;
y = y / 10;
}
}
//检查是否每个数都个出现一次
for (int x = 0; x<10; x++)
{
if (f[x] != 1) t++;
}
if (t == 0)
printf("%d*%d=%d\n",a,b,c);
n++; //统计循环次数
}
}
4编程题
4.1 将字符串逆转,函数原型void reverse(char *str);,要求空间复杂度为O(1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h> void reverse(char *str)
{
int i = 0, len = strlen(str);
for (; i < len / 2; i++)
{
char a = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = a;
}
}
int main()
{
char ch[] = "helloworld";
reverse(ch);
printf("逆转后:%s",ch);
return 0;
}
4.2 比较两个身份证字符串的生日大小。函数原型int isbothsame(char str1[19], char str2[19]);
#include <stdio.h>
#include <stdlib.h> int isbothsame(char str1[19], char str2[19])
{
int low = 6, hight = 13;
while (low<hight &&str1[low] == str2[low])low++; //low记录不相同的位置
return str1[low] - str2[low]; //负数表示str1的年长
}
int main()
{
char a[] = "412824199605281234",b[] = "41282519960825789x";
if(isbothsame(a,b) < 0)
printf("a年长!");
else
printf("b年长!");
return 0;
}
4.3 计算1-x+x^2/2!-x^3/3!+…+x^n/n! 【见2015年】
void main()
{
int n, x, j, i = 1;
float sum = 1, k = -1;
printf("Input n and x:\n");
scanf("%d %d", &n, &x);
while (i <= n) {
k = -1;
for (j = 1; j <= i; j++) {
k = -1*k*x;
}
for (j = 1; j <= i; j++) {
k = k/ j;
}
sum += k;
i++;
}
printf("%f\n", sum);
}动态规划改进:
void main()
{
int n,x,i=1;
float sum = 1,k = -1;
printf("Input n and x:\n");
scanf("%d %d", &n, &x);
while (i <= n) {
k = -1 * k*x / i;
sum += k;
i++;
}
printf("%f", sum);
}
4.4一个链表,找出其中数据项最大的结点,然后将其移动到链表尾部(结点node由整型data和节点指针next构成),不允许申请新的结点
#include <stdio.h>
#include <stdlib.h> typedef struct slist
{
int data;
struct slist *next;
};
void movemax(struct slist *L)
{
struct slist *p = L->next, *pre = L, *max = p;
//找到最大值的位置
while (p)
{
if (p->data>max->data)max = p;
pre = p;
p = p->next;
}
//此时p指向NULL,pre指向最后一个结点
//最大值和最后一个节点交换
int temp = pre->data;
pre->data = max->data;
max->data = temp;
}
int main()
{
//建立单链表【尾插法】
int a[] = {1,4,7,8,5,2,9,6,3};
struct slist *p,*head = (struct slist*)malloc(sizeof(struct slist));
head ->next = NULL;
int i;
p = head;
for(i = 0;i < 9;i++)
{
struct slist *node = (struct slist*)malloc(sizeof(struct slist));
node ->data = a[i];
node ->next = p ->next;
p ->next = node;
p = node;
}
printf("找到最大值后移:\n");
movemax(head);
//输出
p = head ->next;
while(p != NULL)
{
printf("%d\t",p ->data);
p = p->next;
}
return 0;
}
C 2014年笔试题的更多相关文章
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
引言:题目具体描述记不大清了,大概是:Linux平台,利用线程调度的随机性和sleep的不准确性,生成一个各位均不相同的字符数组的伪随机序列.不得使用任何库函数.(这句记得清楚,当时在想线程库算不算, ...
- 考研计算机复试(广东工业大学C语言复试2014~2017笔试题)(精华题选)
1.C语言中,全局变量的存储类别是() A.extern B.void C.int D.static 2.静态变量: (1)static 外部变量===>在函数外定义,只能在本文件中使用 ( ...
- 微软2014校招笔试题-String reorder
Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB Description For this question, your pro ...
- 2014 WAP校园招聘笔试题
2014 WAP校园招聘笔试题 Problem's Link: http://www.doc88.com/p-6751117015483.html WAP公司笔试题 We are planning ...
- 2014阿里巴巴WEB前端实习生在线笔试题
2014年3月31日晚,我怀着稍微忐忑的心情(第一次在线笔试^_^!!)进行了笔试.阿里巴巴的笔试题共同拥有10道,差点儿包括了Web前端开发的各个方面,有程序题.有叙述题.时间很紧张,仅仅完毕了大概 ...
- 【Python】:用python做下百度2014笔试题
国庆节最后一天,明天就要上班了,闲来无事做做百度2014笔试题,好久没用过C++了,索性就用python简单的写一下,体验下题目难度.题目是从[大卫David]那里copy过来的. 1.给定任意一个正 ...
- 诺基亚(Microsoft Devices Group)2014暑期实习生笔试题知识点
总结一下Microsoft Devices Group的软件类笔试题,全部笔试题分两份试卷,逻辑题一份和软件測试题一份,仅仅总结技术题喽~题目全英文,仅仅包括选择题和填空题.选择题居多.分单选和多选. ...
- 对Thoughtworks的有趣笔试题实践
记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...
- 我设计的ASP.NET笔试题,你会多少呢
本笔试题考查范围包括面向对象基础.HTML.CSS.JS.EF.jQuery.SQL.编码思想.算法等范围. 第1题:接口和抽象类有何区别? 第2题:静态方法和实例方法有何区别? 第3题:什么是多态? ...
随机推荐
- webpack debug
chrome地址栏输入:chrome://inspect/#devices 点击 Open dedicated DevTools for Node 在需要打断点的地方加入debugger 控制台输入 ...
- Python时间操作所相关
相关模块:time,datetime,calendar(日历模块) 获取当前时间: # 获取当前10位时间戳,默认返回为float类型 print int(time.time()) # output: ...
- Future 异步多线程
进来接手一个任务,需要做异步多线程数据源调用,数据源的配置和使用请阅读相关文章: https://www.cnblogs.com/haoliyou/p/9604452.html 配置好数据源后,实质上 ...
- Dungeon Master (三维BFS)
题目: You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed o ...
- 关于scanf与gets的区别
以下内容主要来源: scanf与gets读取字符串 scanf与gets函数读取字符串的区别 前两天有个同学问我scanf与gets的区别说了半天也没说出来个所以然,就搜了一下,scanf()和get ...
- ndarray数组的索引和切片
索引:获取数组中特定位置元素的过程 切片:获取数组元素子集的过程 import numpy as np 一维数组 一维数组的索引和切片与python中的列表类似 索引:若元素个数为n,则索引下标可表示 ...
- 从0到1,本地到远程git程序过程
从0到1,本地到远程git程序过程 切记一定要在需要提交代码的文件夹下git init,既是你使用了什么 tortoisegit什么工具,或者你在idea环境下已经add了,但是仍然需要你在当前文件夹 ...
- k8s环境部署.net core web项目(docker本地仓库)
在之前的文档中,我们部署了.net core web在k8s环境下,达成了集群管理项目的目的.但是,由于是本地部署,需要在所有的node节点都拉取好镜像,这是非常麻烦的,为了只维护一份代码,同步更新. ...
- html/css系列 BFC
本文详情:https://www.cnblogs.com/chen-... 第一种 BFC中的盒子对齐 <div class="container"> <div ...
- JZOJ 1492. 烤饼干
1492. 烤饼干 (Standard IO) Description NOIP烤饼干时两面都要烤,而且一次可以烤R(1<=R<=10)行C(1<=C<=10000)列个饼干, ...