#include
/*此处为栈类型及其基本操作的定义,省略*/
int main(){
STACK station;
int state[1000];
int n; /*车厢数*/
int begin, i, j, maxNo; /*maxNo为A端正待入栈的车厢编号*/
printf("请输入车厢数:");
scanf("%d",&n);
printf(“请输入需要判断的车厢编号序列(以空格分隔):”);
if(n<1)return-1;
for (i=0; i
scanf("%d",&state[i]);
(1) ; /*初始化栈*/
maxNo=1;
for(i=0; i<n; ){ /*检查输出序列中的每个车厢号state[i]是否能从栈中获取*/
if((2) ){ /*当栈不为空时*/
if (state[i]=Top(station)) { /*栈顶车厢号等于被检查车厢号*/
printf("%d",Top(station));
Pop(&station);i++;
}
else
if ((3) ) {
printf(“error\n”);
return 1;
}
else{
begin= (4) ;
for(j=begin+l;j <=state [i];j++){
Push(&station, j);
}
}
}
else{ /*当栈为空时*/
begin=maxNo;
for(j=begin; j<=state[i];j++) {
Push(&station, j);
}
maxNo= (5) ;
}
}
printf("OK");
return 0;
}
第1题
【说明】
以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。
该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。
该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。
【C程序】
include<stdio.h>
define M 30
define NLEN 10
typedef struct node {
int cur_s; /* 最近输入成绩的科目*/
Char no[NLEN];
int score;
struct node *next;
} NODE;
int s[M], sp, ss, i, mark, order, C;
FILE *fp; NODE *h, *U, *V, *p;
Char fname[80], no[NLEN], ans;
main()
{ for(h = NULL, sp = 0; ;)
{ printf("输入科目成绩文件名(输入aaaa表示强行结束)。 \n");
while(1)
{ scanf("%s", fname);
if (strcmp(fname, "aaaa") == 0)
break;
if ((fp = fopen(fname, "r")) == NULL)
printf("不能打开文件%s, 请重新输入科目文件名。 \n", fname);
else
break;
}
if (strcmp(fname, "aaaa") == 0) break;
fscanf(fp, "%d", &ss); /* 输入科目号 */s[sp]=s;
for (i=0; s[i] ! = ss; 1++);
if ( (1) )
{ printf("该科目的成绩已输入,请输入别的科目成绩文件。\n");
continue;
}
sp++;
while (fscanf(fp, "%s%d", no, &mark) == 2)
{ /* 在链表中寻找最近输入的学号 */
for(v = h; v != NULL && strcmp(v-> no, no)<0; u=v, v= v-> next);
if (v !=NULL && strcmp(v->no, nb) == 0)
{ /* 该生已有成绩 */
if (V->cur_s != ss)
{ /* 该生的当前科目成绩是第一次输入 */
v->score += mark; /* 累计总成绩 */
v->cur_s = ss;
} /* 同一科目成绩重复输入,后输入成绩被忽略 */
}
else
{ p = (NODE *)malloc(sizeof(NODE)); /* 一位新的学生 */
strcpy(p->no,no);
p->score = mark;
p->cur_s = ss;
p-> next = v;
第3题
A.选择【开始】|【所有程序】|【附件】|【控制面板】命令
B.选择【开始】|【所有程序】|【设置】|【附件】|【控制面板】命令
C.选择【开始】|【控制面板】命令
D.以上都不对
第6题
【说明】
某大学征询学生意见,从各学院预选的n(n≤60)位优秀大学生中,评选出“十佳大学生”。以下【C程序】对各位学生选票进行相关的统计、排序等处理。
(1)各学院预选的优秀大学生按1,2,…顺序连续编号,每个编号用两个字符表示,即01,02,…。
(2)所回收的选票按以下格式存于文件source中,每行字符串对应一张选票。其中,姓名占10个字符,学院名称占30个字符,大学生编号占20个字符。
(3)对应名次的大学生编号可以有空缺,但必须用00表示。
(4)若编号超出规定范围,或编号重复出现,按照废票处理。
(5)按选票中所列“十佳大学生”顺序给出各名大学生的得分。评分标准如下:
一 二 三 四 五 六 七 八 九 十
15 12 9 7 6 5 4 3 2 1
(6)按各位大学生得分数由高到低顺序排队,并按以下格式列出“十佳大学生”排行表。
名次 大学生编号 合计得分 合计得票数
若得分相同,则得票数多的在前;若得分和得票数都相同,则编号小的在前。
以下【C程序】中所应用到的函数fopen、fclose和fgets都是I/O程序库中的函数。
【C程序】
include <stdio. h>
define n 60
long int tn[n], td[n], score[n+1][10], order[n];
char s[80];
int mark[]=(15,12,9,7,6,5,4,3,2,1);
FILE *fp, *fopen();
Main()
{ int c, g, k, I, j, b[10];
long int e, d, t, tt, dd;
char * p;
for(i=0; i<=n; i++)
for(j=0; j<10; j++)
score[i][j]=0;
fP=fopen("source", "r"); /*以读方式打开文件source*/
p=fgets(s, 80, fp); /*读fp所指文件的下一行字符串于s*/
while(*p){
g=l; k=0; p+=40;
while(k<10){
c=((*p++)-'0')*10+((*p++)-'0');
b[k++]=c)
if(c<=n){
if(c)
{ i=0;
While( (1) );
If( (2) ){g=0; break;}
}
else{g=0; break;}
}
If(g)
For(i=0; i<k; i++)
If(b[i])
(3);
p=fgets(s, 80, fP);
}
Fclose(fp); /*关闭fp所指文件*/
For(i=1; i<n; i++){
For(t=0, d=0, j=0; j<10; j++){
t +=(e=score[i][j]);
d +=e * mark[j];
}
tn[i-1]=t; td[i-1]=d; order[i-1]=i;
}
For(i=0; i<n-1; i++){
k=i;
for(j=i+1; j<n; j++)
if(
第7题
【说明】
某超市集团为发展业务向社会公开招聘N个工种的工作人员,每个工种各有不同的编号(1至M)和计划招聘人数。每位应聘者需申报两个工种,并参加集团组织的考试。该集团公司将按应聘者的成绩从高分至低分的顺序进行排队录取。具体录取原则是:从高分到低分依次对每位应聘者先按其第一志愿录取;当不能按其第一志愿录取时,便将他的成绩扣去5分后,重新排队,并按其第二志愿录取。
以下C程序为输出各工种实际招聘的应聘人员,每个工种都保留一个录取者的有序队列。录取处理循环直至招聘额满或已对全部应聘者都作了录取处理后跳出。
C程序中,类型STU包含有应聘者的基本信息:编号、成绩、志愿、排队成绩和录取志愿号。数组 rzl)的每个元素对应一个工种,包含有计划招聘人数和已录取的人数。
【C程序】
include
define N 36
define EDMARK 5
typedef struct stu {
int no, total, z[2], sortm, zi;
struct stu *next;
} STU;
struct rznode {
int lmt, count;
STU *next;
} rz [N];
STU *head = NULL, *over = NULL;
int all
FILE *fp;
char dataf [ ] = "zp2008.dat" ;
print(STU *p)
{ for (;p!=NULL; p = p->next)
printf( "%d(%d) \t" , p->no, p->total
}
insert(STU **p, STU *u)
{ STU *v, *q;
for (q = *p;q != NULL; v = q , (1) )
if (q-> sortm < u->sortm)
break;
if ( q == *p)
(2);
else
(3);
u->next = q ;
}
main ( )
{ int zn, i, no, total, zl, z2 ;
STU *p, *v, *q;
fp = fopen(dataf, "r" );
if (fp == NULL)
{ printf ("Can't open file %s.kn" ,dataf);
exit (0);
}
fscanf (fp, "%d" ,&zn);
for (all = 0, i = 1; i <= zn; i++)
{ fscanf (fp, "%d", &rz [ i ].lmt ;
rz[i].count = 0;
rz[i].next = NULL;
all +=(4);
}
for (;;)
{ if (( fscanf(fp, "%d%d%d%d" ,&no,&total,&zl,&z2)) != 4 )
break;
p = ( STU *) malloc (sizeof (STU));
p->no = no;
p->total = p->sortm = total;
p->zi = 0;
p->z[0] = z1;
p->z[1] = z2;
(5);
}
fclose (fp);
for (;all && head != NULL;)
{ p = head;
head = head->next;
if (rz[p->z[p->zi]].count <(6))
{ rz[p->z[p->zi]].count ++;
insert(&rz[p->z[p->zi]].next,p);
all--;
continue;
}
if (p->zi >= 1 )
{ p->next = over;
ver = p;
continue;
}
p->sortm -= DEMARK;
(7);
insert(&head,p);
}
for (i = 1; i <= zn; i++ )
{ printf("%d:\n" ,i);
print( rz[i ].next);
printf(" \n");
}
printf( "over:\n" );
print(head);
print(over);
printf(" \n");
}
第9题
阅读以下问题说明、C 程序和函数,将解答填入答题纸的对应栏内。
【 问题1 】
分析下面的C 程序,指出错误代码(或运行异常代码)所在的行号。
【C程序】
【 问题2】
函数inputArr(int a[], int n)的功能是输入一组整数(输入0或输入的整数个数达到n时结束)存入数组 a,并返回实际输入的整数个数。函数 inputArr 可以成功编译。但测试函数调用inputArr后,发现运行结果不正确。
请指出错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行,使之符合上述设计意图。
【C 函数】
第10题
【说明】
【C程序1】用回溯算法来产生由0或1组成的2m个二进位串,使该串满足以下要求。
视串为首尾相连的环,则由m位二进制数字组成的2m个子序列,每个可能的子序列都互不相同。例如,如果m=3,在串11101000首尾相连构成的环中,由3位二进制数字组成的每个可能的子序列都在环中恰好出现一次,它们依次是111,110,101,010,100,000,001,011,如图2-14所示。
【C程序2】是求“背包问题”的一组解的递归算法程序。“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为W1,W2,…,Wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。
【C程序1】
define N 1024
define M 10
int b [N+M-1]
int equal(int k, int j int m) {
int i;
for(i=0; i<m; i++
if ( b[ k + i] (1) )
return 0;
return 1; }
int exchange (int k, int m, int v){
while ( b[ k + m - 1 ) == v ) {
b[ kncm--i]=! v (2);
}
(3)=v;
return k;
}
init ( iht v) {
int k
for( k = 0;K = N + M - 1;k++)
b[k] = v;
}
main ( ) {
int m, v, k, n, j;
printf ('Enter m (l<m<10) , v v=0, v=1)\ n") ;
scanf (" %d%d , &m, &v);
n = 0x01 << m;
init (!v);
k=0;
while((4)< n)
for (j=0;j<k;j++)
if (equal (k, j, m)) {
k=exchange (k, m, v)
j=(5);
}
for (k= 0 ;k<n ;k++ )
print{ (" %d\ n" , b[k]) ;
}
}
【C程序2】
include<stdio. h>
define N 7
define S 15
int w[N+1] = {0, 1, 4, 3, 4, 5, 2, 7};
int knap (int S, int n){
if (S == 0)
return 1;
if (s<0 || (s>0 && n<1))
return 0;
if ((6))) {
printf( "4d", w[n]);
return 1;
}
return (7)
}
main ( ) {
if (knap (S, N)
printf("OK:\n");
else
printf("NO!\n")
}
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!