西南科技大学814练习
Fairy 发布于 阅读:109
2025年硕士研究生招生考试(初试)试题
科目代码:814 科目名称:程序综合设计
说明:1.本试题为招生单位自命题题目。
2.所有答案必须写在答题纸上,写在本试题单上的一律无效。
3.考生答题时不必抄题,但必须写明题号。
4.本试题共计三道大题,满分150分。
5.所有程序的编译环境为x64系统下的Dev-c++。
【本试题共计xx页,此为第1页】【押题卷第一套】
一:程序阅读题。(45分)
1:阅读以下代码,给出运行结果。(5分)
.#include
int main(){
int a = 12,b = 3;
float x = 18.5,y= 4.6;
printf("%.f\n",(float)(a*b)/2);
printf("%d\n",(int)x%(int)y);
return 0;
}
答案:
2:阅读以下代码,给出运行结果。(5分)
.#include
int main(){
int k = 0;
char c = 'A';
do{
switch (c++) {
case 'A':k++;break;
case 'B':k--;
case 'C':k+=2;break;
case 'D':k=k%2;break;
case 'E':k=k*10;break;
default: k = k/3;
}
k++;
}while(c<'G');
printf("k = %d\n",k);
return 0;
}
答案:
3:阅读以下代码,给出运行结果。(5分)
.#include
.#include
int main(){
int x = 03,y = 02,z = 01;
char str[25]; x11 y10 z01
printf("x|y&z = %d\n",x|y&z); 与运算优先,00,或,11
printf("x^y&-z = %d\n",x^y&-z); 01-10+1=11,10,异或(只有一个真时才真),01
printf("x&y&z = %d\n",x&y&z);
x = 1;y = -1;
printf("!x|x = %d\n",!x|x); 非,取反,0,1
printf("~x|x = %d\n",~x|x);补码10,11,
return 0;
}
答案:
4:阅读以下代码,给出运行结果。(5分)
.#include
.#include
int main(){
double f(double,int);
printf("%.2f\n",f(2.0,14));
return 0;
}
double f(double x,int n){
double t;
if(n==1) t = x;
else{
if(n/22 == n) t = xf(x,n/2);
else t=x*pow(f(x,n/2),2.0);
}
return t;
}
答案:
5:阅读以下代码,给出运行结果。(5分)
.#include
int main(){
struct s1{char c[4],s;};
struct s1 s1 = {"abc","def"};
struct s2{char cp;struct s1 ss1;};
struct s2 s2 = {"ghi",{"jkl","mno"}};
printf("%c,%c\n",s1.c[0],*s1.s);
printf("%s,%s\n",s1.c,s1.s);
printf("%s,%s\n",s2.cp,s2.ss1.s);
printf("%s,%s\n",++s2.cp,++s2.ss1.s);
return 0;
}
答案:
6:阅读以下代码,给出运行结果。(5分)
.#include
.#include
int main(){
char line[] = "123456789";
int i,k = strlen(line);
for(i = 0;i<4;i++){
line[k-i] = '\0';
printf("%s\n",line+i);
}
return 0;
}
答案:
7:阅读以下代码,给出运行结果。(5分)
.#include
.#include
int f(char c,char *s){
int m,n,h;
for(n = 0,h = strlen(s);n<=h;){
m = (n+h) / 2;
if(c<s[m]) h = m-1;
else if(c>s[m]) n = m+1;
else return m;
}
return -1;
}
int main(){
printf("%d\n",f('g',"abdgkmxy"));
printf("%d\n",f('T',"BGMAXYZOTE"));
return 0;
}
答案:
8:阅读以下代码,给出运行结果。(5分)
int main(){
int a[] = {1,2,3,4,5,6,7,8,9};
int *p = a+sizeof(a)/sizeof(int)/2;
printf("%d",*p++ + *p-- + ++(*p) + *(--p));
return 0;
}
答案:21
9:阅读以下代码,给出运行结果。(5分)
.#include
int main(){
FILE *fp;
int i;
char s1[80],s[] = "abcdefghijklmnop";
fp = fopen("text.txt","wb+");
i = sizeof(s);
fwrite(s,i,1,fp);
rewind(fp);
fread(s1,i,1,fp);
printf("all = %s\n",s1);
fseek(fp,0,0);
printf("seek1 ch = %c\n",fgetc(fp));
fseek(fp,10,1);
printf("seek2 ch = %c\n",fgetc(fp));
fseek(fp,1,1);
printf("seek3 ch = %c\n",fgetc(fp));
return 0;
}
答案:
二:简答与计算题。(60分)
-
线性表有两种存储结构:一是顺序表,二是链表。试问:(8分)
(1)如果有 n 个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用哪种存储结构?为什么?
(2)若线性表的元素总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结构?为什么?
答案:
(1)选用链式存储结构。链式存储结构可动态申请内存空间,只要内存空间允许,链表中的元素个数就没有限制;此外,这种存储结构对元素进行插入和删除操作时都无须移动元素,而仅仅修改指针即可,所以很适用于线性表容量变化的情况。
(2)选用顺序存储结构。顺序表是由数组实现的,它是一种随机存取结构,指定任意一个位置序号 i,都可以在 O(1)时间内直接存取该位置上的元素,即存取速度较高;另外由于题目中描述的线性表的元素总数基本确定,且很少进行插入和删除,故这一特点恰好避开了顺序存储结构的缺点。因此,应选用顺序存储结构。 -
按照上图所示的无向网,请给出:
(1)邻接矩阵;
(2)邻接表;
(3)最小生成树。
答案:
3.设主串 S =“aaabaaacaaca”,子串 P =“aaac”,求出使用 KMP 算法在应用 next 函数和 nextval 函数的情况下模式匹配过程需要执行的趟数分别为多少次。(10分)
答案:
-
假设用于通信的电文仅由 8 个字母组成,字母在电文中出现的频率分别为 0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21 和 0.10。(12分)
(1)试为这 8 个字母设计哈夫曼编码;
(2)试设计另一种由二进制表示的等长编码方案;
(3)对于上述实例,比较两种方案的优缺点。
(4)已知字符集{a, b, c, d, e, f, g, h},若各字符的哈夫曼编码依次是 0100, 10, 0000,
0101, 001, 011, 11, 0001,则编码序列 0100011001001011110101 的译码结果是
答案:
(4)哈夫曼编码是前缀编码,任何一个编码都不是其他任何编码的前缀,因此可根据编码序列从头至尾与各字符的哈夫曼编码进行对比。该编码序列可被划分成 0100 011 001 001 011 11 0101,译码结果是 afeefgd -
设散列表的地址范围为0~ 17 , 散列函数为H(key) = key%16。用线性探测法处理冲突,输入关键字序列:(10, 24, 32, 17, 31, 30, 46, 47, 40, 63, 49), 构造散列表,试回答下列问题:(12分)
①:画出散列表的示意图。
②:若查找关键字 63和60, 需要依次与哪些关键字进行比较?
③:假定每个关键字的查找概率相等,求查找成功时的平均查找长度。
答案:
-
设待排序的关键字序列为{12,2,16, 30,28,10,16*,20,6,18}, 试分别写出使用以下排序方法,每趟排序结束后关键字序列的状态。(12分)
①:希尔排序(增量选取5、3 和1)
②:冒泡排序
③:快速排序
三:算法设计题。(45分)
1:写出直接插入排序的代码(15分)
2:设计一个算法,通过一趟遍历确定长度为 n 的单链表中值最大的结点,返回该结点的数据域。(15分)
答案:
3:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。(要求:键盘输入n)(15分)
答案:
.#include<bits/stdc++.h>
using namespace std;
int main(){
long long int n;
cin>>n;
for(int i = 1;i<9999999;i++){
int t = i;
for(int j = 1;j<=n;j++){
t = t/2 -1;
if(t<0)break;
}
if(t == 1){cout<<i/2 -1<<endl;return 0;}
}
return 0;
}
/*
基本思路:
原始数据:x //循环
第一天:x/2 -1;//循环
第二天:(x/2 -1)/2 -1
......
第n天:1个;