问答题【说明】
计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 512037-*+”。
计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇,到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中。重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46 5120 37-*+”的计算过程如下。
a.依次将46、5、120、37压入栈中;
b.遇到“-”,取出37、120,计算120-37=83,将其压入栈中:
c.遇到“*”,取出83、5,计算5×83=415,将其压入栈中;
d.遇到“+”,取出415、46,计算46+415=461,将其压入栈中;
e.表达式结束,则计算过程完成。
函数computing(char expr[],int *result)的功能是基于栈计算后缀形式的表达式(以串形式存入字符数组expr)的值,并通过参数result返回该值。函数的返回值为-1/0,分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“/”)。
函数computing中所用栈的基本操作的函数原型说明如下。
· void InitStack(STACK *s):初始化栈。
· void Push(STACK,s,int e):将一个整数压栈,栈中元素数目增1。
· void Pop(STACK *s):栈顶元素出栈,栈中元素数目减1。
· int Top(STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。
· int IsEmpty(STACKs):若s是空栈,则返回1;否则返回0。
【C函数】
int computing (char expr[],int *result)
{
STACK s; int tnum,a,b; char *ptr;
InitStack(&s);
ptr=expr;pstr /*字符指针指向后缀表达式串的第一个字符*/
while(*ptr!='/0') {
if(*ptr==' ') { /*当前字符是空格*/
{{U}} (1) {{/U}}; /*字符指针指向下一字符*/
continue;
}
else
if(isdigit (*ptr)) {
/*当前字符是数字,则将该数字开始的数字串转换为数值*/
tnum={{U}} (2) {{/U}};
while (*ptr>='0' && *ptr <='9') {
tnum=tnum * 10 + {{U}}(3) {{/U}};
ptr++;
}
Push({{U}} (4) {{/U}});
}
else /*当前字符是运算符或其他符号*/
if (*ptr=='+'||*ptr=='-'||*ptr=='*'||*ptr=='/'){
if(!IsEmpty(s)) {
a=Top(s);Pop(&s); /*取运算符的第二个运算数*/
if(!IsEmpty(s)) {
b=Top(s);Pop(&s);/*取运算符的第一个运算数*/
}
else return -1;
}
else return -1;
switch (*ptr) {
case '+': Push(&s,b+a); break;
case '-':Push(&s,b-a); break;
case '*':Push(&s,b*a); break;
case '/':Push(&s,b/a); break;
}
}
else
return -1;
ptr++; /*字符指针指向下一字符*/
}/*while*/
if(IsEmpty(s)) return -1;
else{
{{U}}(5) {{/U}}=Top(s); Pop(&s); /*取运算结果*/
if(!IsEmpty(s)) return -1;
return 0;
}
}
问答题[说明]下面的程序演示了根据随机产生的奖牌数,生成金银奖牌榜的过程。程序使用的排序法是简单排序法。以金牌得数为例,其思想是选择最大的元素,将它交换到最前面;然后对剩下的部分采用同样的方法,直到全部排序完成。程序界面中,左右两个文本框分别用于存放随机产生的奖牌数以及生成的奖牌榜,名为Text1和Text2,上下两个按钮分别名为Command1和Command2。代码中使用的量主要有:一维数组cntries,用于存储10个国家的名称,二维数组medals,其元素medals(i,0)和medals(i,1)分别用于存放第i个(i从0开始)国家的金、银牌数目。[VisualBasic代码]Dimcntries(10)AsString,medals(10,2)AsInteger’随机产生奖牌数SubnewMedals()……’为数组cntries和medals赋值EndSub’输出奖牌榜SubprintOut(txtAs{{U}}(1){{/U}})DimstrResuhAsString,iAsIntegerstrResult=“国家”&Chr(9)&“金牌数”&Chr(9)&“银牌数”&vbCrLfFori=0To9strResult=strResult&cntries(i)&Chr(9)&medals(i,0)&Chr(9)&medals(i,1)&vbCrLfNexttxt.Text=strResultEndSub’交换两变量的值Subexchange({{U}}(2){{/U}}aAsVariant,{{U}}(2){{/U}}bAsVariant)DimtempAsVarianttemp=a:a=b:b=tempEndSub’随机产生并输出奖牌数PrivateSubCommand1_Click()newMedalsprintOutText1EndSub’生成并输出奖牌榜PrivateSubCommand2_Click()Dimi,j,kAsInteger,tempAsStringFori=0To9’按金牌数排序j=i’找到自第i个位置起全部数据中金牌得数最多者,记其下标为jFork=i+1To9If{{U}}(3){{/U}}Thenj=kNextIfi<>jThen’若i,j不等,则交换对应位置的国家名、金银牌数目exchangecntnes(i),entries(j)exchangemedals(i,0),medals(j,0)exchangemedals(i,1),medals(j,1)EndIfNextFori=0To9’按银牌数进行二次排序j=iFork=i+1To9Ifmedals(k,0)<>medals(j,0)Then{{U}}(4){{/U}}If{{U}}(5){{/U}}Thenj=kNextIfi<>jThenexchangecntries(i),cntries(j)exchangemedals(i,1),medals(j,1)EndIfNextprintOutText2EndSub
问答题
问答题【说明】设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值后跟用“()”括起来的各子树的列表(若有子树的话),各子树的列表间用“,”分隔。例如,如下图所示的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。本程序根据输入的列表生成一棵M叉树,并由M叉树再输出列表。【函数】#include#include#defineM3/*三叉树*/typedefstructnode{intval;structnode*subTree[M];}NODE;charbuf[255],*str=buf;NODE*d=NULL;NODE*makeTree()/*由列表生成M叉树*/{intk;NODE*s;s={{U}}(1){{/U}};s->val=*str++;for(k=0;k<M;k++)s->subTree[k]=NULL;if(*str=='('){k=0;do{str++;s->subTree[k]={{U}}(2){{/U}};if(*str==')'){str++;break;}k=k+1;}while({{U}}(3){{/U}});}returns;}voidwalkTree(NODE*t)/*由M叉树输出列表*/{inti;if(t!=NULL){{{U}}(4){{/U}};if(t->subTree[0]==NULL)return;putchar('(');for(i=0;i<M;i++){{{U}}(5){{/U}};if(i!=M-1}putchar(')');}}voidmain(){printf("Enterexp:");scanf("%s",str);d=makeTree();walkTree(d);putchar('/n');}
问答题试题四(共15分)阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。[说明]已知两个整数数组A和B中分别存放了长度为m和n的两个非递减有序序列,函数Adjustment(A,B,m,n)的功能是合并两个非递减序列,并将序列的前m个整数存入A中,其余元素依序存入B中。例如:合并过程如下:从数组A的第一个元素开始处理。用数组B的最小元素B[0]与数组A的当前元素比较,若A的元素较小,则继续考查A的下一个元素;否则,先将A的最大元素暂存入temp,然后移动A中的元素挪出空闲单元并将B[0]插入数组A,最后将暂存在temp中的数据插入数组B的适当位置(保持B的有序性)。如此重复,直到A中所有元素都不大于B中所有元素为止。[C函数]
问答题[说明] 有若干教师,每个教师只有姓名,一个教师可以指导多名研究生;每名研究生有姓名和研究方向,程序最后输出每个教师指导的所有研究生的姓名和研究方向。[Java程序]public class Teacher String name; int top=0; Student[] student=new Student[20]; public Teacher() public Teacher(String name) this.name=name; boolean add(Student stu) int len=this.student.length; if (top<len-1) this.student[top]=siu; (1) ; return true; else return (2) ; void disp() System.out.println(“指导老师"”+this.name); System.out.println(“研究生:”); for(int i=0;i< (3) ;i++) System.out.println(“姓名:”+this.student[i].name+“/t研究方向:”+this.student[i]. search); public static void main(String[] args) Teacher t[]=new Teacher(“李明”),new Teacher(“王华”); Student s1 = new Student(“孙强”,“数据库”); Student s2 = new Student(“陈文”,“软件工程”); Student s3 = new Student(“章锐”,“计算机网络”); if(! t[0].add(s1)) System.out.println(“每个老师最多只能指导20个学生!”); if(! t[0].add(a2)) System.out.println(“每个老师最多只能指导20个学生!”); if(! t[1].add(s3)) System.out.println(“每个老师最多只能指导20个学生!”); for(int i=0;i<2;i++) (4) ; class (5) String name; String search; public Student() public Student(String name,String search) this.name=name; this.search=search; String getName()return this.name; String getSearch()return this.search;
问答题【说明】函数sort(NODE*head)的功能是;用冒泡排序法对单链表中的元素进行非递减排序。对于两个相邻结点中的元素,若较小的元素在前面,则交换这两个结点中的元素值。其中,head指向链表的头结点。排序时,为了避免每趟都扫描到链表的尾结点,设置一个指针endptr,使其指向下趟扫描需要到达的最后一个结点。例如,对于图4-1(a)的链表进行一趟冒泡排序后,得到图4-1(b)所示的链表。链表的结点类型定义如下:typedefstructNode{intdata;structNode*next;}NODE;【C语言函数】voidsort(NODE*head){NODE*ptr,*preptr,*endptr;inttempdata;ptr=head->next;while({{U}}(1){{/U}})/*查找表尾结点*/ptr=ptr->next;endptr=ptr;/*令endptr指向表尾结点*/ptr={{U}}(2){{/U}};while(ptr!=endptr){while({{U}}(3){{/U}}){if(ptr->data>ptr->next->data){tempdata=ptr->data;/*交换相邻结点的数据*/ptr->data=ptr->next->data;ptr->next->data=tempdata;}preptr={{U}}(4){{/U}};ptr=ptr->next;}endptr={{U}}(5){{/U}};ptr=head->next;}}
问答题【程序2.1说明】
已知一个排好序的数组,现输入一个数,要求按原来的顺序规律,将它插入到数组中。
【程序2.1】
#include <stdioh>
#define N 100
void main()
{
float a[N+l],x;
int i,p;
printf("输入已经排好序的数列: ");
for(i=0; i<N; i++)
scanf(%f",
printf("输入要插入的数:");
scanf("%f",
for(i=0,p=N; i<N; i++)
if(x<a[i])
{
{{U}}(1) {{/U}}
break;
}
for(i=N-1; i>=p; i--)
{{U}} (2) {{/U}}
{{U}}(3) {{/U}}
for(i=0; i<=N; i++)
prinff("%f/t",a[i]);
}
【程序2.2说明】
本程序用变量count统计文件中字符的个数。
【程序2.2】
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *fp;
long count=0;
if((fp=fopen("letter.txt","r"))==NULL)
{
printf("can not open file/n");
exit(0);
}
while(!feof(fp))
{
{{U}} (4) {{/U}}
count++;
}
printf("count=%d/n",count);
{{U}} (5) {{/U}}
}
问答题[函数2.1说明] 函数void find(int *a, int n, int * max, int * min)的功能是在长度为n的整型数组a中,查找最大元素和最小元素的下标。main()中给出了调用find函数的一个实例。[函数2.1]#include<stdio.h>void find(int *a, int n,int *max,int * min) int i; *max =* min=0; for(i=1;i<n;i+ +) if(a[i]>a[* max]) (1) ; else if(a[i]<a[*min]) (2) ; return;main() int a[]=4,6,8,9,0,6,max,min; find(a,6, (3) ); printf("%5d%5d/n", max,min);[函数2.2说明] 以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串前端的公共部分。例如:输入的两个字符串分别是abcdefg和abceef,则输出为abc。[函数2.2]#include <stdio.h>main() char str1[100],str2[100],str[100],c; int i=0,s; printf("/nInput string 1:");gets(str1); printf("/nInput string 2:");gets(str2); while(( (4) ) i++; printf("%s/n",str);
问答题Dim{{U}} (2) {{/U}} '声明全局变量
Private Sub Form_Load()
Scale(0,0)-(20,6) '定义窗体的坐标系统
End Sub
Private Sub CmdStart_Click()
x=0
MMC.DevkeType=''WaveAudio'' '设置多媒体设备类型
MMC.FileName=''两只蝴蝶.wav'' '确定声音文件名
MMC.Cornmand=''Open'' '打开多媒体设备
MMC.Command=''P1ay'' '启动声音的播放
Timer1.Enabled=True '打开定时器
End Sub
Private Sub Timer1_Timer()
Ifx>20 Thenx=x-20 '蝴蝶飞到右边界后再回到左边界
Image1.Left=x '动态调整蝴蝶框的位置
Imagel.Top={{U}} (3) {{/U}}
Image2.Len=x
lmage2.Top= {{U}}(4) {{/U}}
x=x+0.1 '确定蝴蝶下一步飞行位置
End Sub
Private Sub CmdStop_Click()
{{U}} (5) {{/U}}
Image1.Left=0 '蝴蝶位置初始化
Image1.Top=2
Image2.Left=0
Imagc2.Top=3
MMlC.Command=''Stop'' '停止播放
MMC.Command=''Ciosc'' '关闭多媒体设备
End Sub
问答题【说明】
IC卡和200卡都是从电话卡派生的。下面的程序将电话卡定义为抽象类。其中 balance为双精度变量,代表电话卡中的余额;cardNumber是长整型变量,代表电话卡的卡号;password是整型变量,代表电话卡的密码;connectNumber是字符串变量,代表电话卡的接入号码;connected是布尔变量,代表电话是否接通。
performDial()实现各种电话接通后的扣除费用的操作。其中200卡每次通话扣除0.5元的通话费用和附加费用;IC卡每次通话扣除0.9元的通话费。TimeLeft()方法用于测试电话卡余额还可以拨打电话的次数。performConnection()用于电话接入操作,如果卡号和密码正确,则接通;否则,接不通。
【程序】
abstract class PhoneCard
{
doubte balace;
{{U}} (1) {{/U}}perfermDial();
double getBalance()
{ return balance; }
double TimeLeft()
{
double current=balance;
int times=0;
do
{
{{U}} (2) {{/U}}
times++;
}white(balance>=0);
balance=current;
return times-1;
}
}
abstract class Number_PhoneCard extends PhoneCard
{
long cardNumber:
int password;
String connectNumber;
Boolean connected;
Boolean performConnection(long cn, int pw)
{
if(cn==cardNumber
return true;
}
else return false;
}
}
class IC Card{{U}} (4) {{/U}}
{
boolean performDial()
{
if(balance>0.9)
{
balance-=0.9;
return true;
}
else return false;
}
}
class D200_Card{{U}} (4) {{/U}}
{
static double additoryFee;
static{ additoryFee=0.1; }
boolean performDial()
{
if(balance>(0,5+additeryFee))
{
{{U}} (5) {{/U}}
return true;
}
else return false;
}
}
问答题【说明】 以下【C程序】完成从指定数据文件中读入职工的工号和他完成产品个数的数据信息,对同一职工多次完成的产品个数进行累计,最后按如表5-11所示的格式输出职工完成产品数量的名次(ORDER),该名次是按每位职工完成的产品数量(QUANTITY)排序,之后是同一名次的职工人数(COUNT)和他们的职工号(NUMBER,同一名次的职工号以从小到大的顺序输出)。 {{B}}表5-11 职工完成产品数量名次输出格式表{{/B}}
ORDER
QUANTITY
COUNT
NUMBER
1
398
3
10
20
21
4
256
2
3
5
6
192
1
9
7
167
2
11
14
…
…
…
…
以下【C程序】采用链表结构存储有关信息,链表中的每个表元对应一位职工。在数据输入的同时,形成一个有序链表(按完成的产品数量和工号排序)。当一个职工有新的数据输入,在累计他的完成数量时会改变原来链表的有序性,为此应对链表进行删除、查找和插入等操作。 【C程序】 #include<stdio. h> typedef struct ele{ int no, q; struct ele * next; }elem; main(int argc, char ** argv){ FILE *fp; elem *h, *u, *proc(); if(argc==2 fclose(fp); output(h); while(h I=NULL){ u=h→*next; free(h); h=u; } } } elem * proc(FILE *fp){ int n, m; elem *u, *v, *p, *base; base=NULL; fscanf(fp, "%d', while(!feof(fp)){ fscanf(fp, '%d', for(v=base; v!=NULL u=v, v=v->next); if({{U}} (1) {{/U}}) if({{U}} (2) {{/U}}) base=v->next; else u->next=v-next; v->q+=m; else v=(elem *)malloc(Sizeof)elem)); v->no=n; v->q=m; p=base; while(p !=NULL) if({{U}} (3) {{/U}})break; else { u=p; p=p->next; } if({{U}} (4) {{/U}}) base=v; else u->next=v; {{U}} (5) {{/U}}; Fscanf(fp, "%d", } return base; } Output(elem *head){ int count, order; elem *u, *v; printf("ORDER QUANTITY COUNT NUMBER/n"); u=head; order=1; while(u !=NULL){ for(count=1, v=u->next; {{U}}(6) {{/U}};count++, v=v->next); printf("%4d%9d%6d", order, u->q, count); order+=count; for(;{{U}} (7) {{/U}};printf("%4d", u->no), u=u->next); printf("/n"); } }
问答题【说明】
在矩形类中重载关系运算符“>=”,采用友元,比较的依据是矩形面积的大小。重载算术运算符“+=”,采用成员函数,更新矩形对象的长与宽,分别加上形参矩形的长与宽。重载算术运算符+,利用构造函数,采用友元。
【代码】
class Crect
{
int length,witdth;
public;
CRect(int l,int w){
length=l;
width=w;
}
friend int operator>=(CRect//比较面积
}
void operator+=(CRect//求长
{{U}} (4) {{/U}};//求宽
}
friend operater+(CRect //利用构造函数
}
}
问答题试题六(15 分,每空3 分)
阅读以下说明和C++程序,将应填入(n) 处的字句写在答题纸的对应栏内。
【说明】
以下程序的功能是计算三角形、矩形和正方形的面积并输出。
程序由4 个类组成:类Triangle、Rectangle 和Square 分别表示三角形、矩形和正方形;抽象类Figure 提供了一个纯虚拟函数getArea(),作为计算上述三种图形面积的通用接口。
【C++程序】
#include
#include
class Figure {
public:
virtual double getArea() = 0; // 纯虚拟函数
};
class Rectangle : (1) {
protected:
double height;
double width;
public:
Rectangle(){};
Rectangle(double height, double width) {
this->height = height;
this->width = width;
}
double getArea() {
return (2) ;
}
};
class Square : (3) {
public:
Square(double width){
(4) ;
}
};
class Triangle : (5) {
double la;
double lb;
double lc;
public:
Triangle(double la, double lb, double lc) {
this->la = la; this->lb = lb; this->lc = lc;
}
double getArea() {
double s = (la+lb+lc)/2.0;
return sqrt(s*(s-la)*(s-lb)*(s-lc));
}
};
void main() {
Figure* figures[3] = {
new Triangle(2,3,3), new Rectangle(5,8), new Square(5) };
for (int i = 0; i getArea() << endl;
}
}
问答题[说明]以下[C程序]是对某电码明文(原文)进行加密形成密文。其加密算法如下。假定原文为C1C2C3……Cn,加密后形成的密文为S1S2S3……Sn其中n为小于256的任意自然数。首先读入正整数Key(Key>1)作为加密钥匙,并将密文字符位置按顺时针方向连成一个环,如图4-12所示。图4-12密文字符环示意图加密时从S1位置起顺时针计数,当数到第Key个字符位置时,将原文中的字符放入该密文字符位置中,同时从环中除去该字符位置;接着从环中下一个字符位置起继续计数,当再次数到第Key个字符位置时,将原文中字符C2放入其中,并从环中除去该字符位置;依此类推,直至n个原文字符全部放入密文环中。由此产生的S1S2……Sn即为原文的密文。例如,原文:OneWorldOneDream。当Key=5时,其密文为:meOnWlanDoOedrer;当Key=6时该原文的密文为:oeDnOedrrOnWmale。程序使用示例如图4-13所示。图4-13程序使用示例在[C程序]中,将电码的原文存入字符数组old[],加密钥匙存入在整数变量Key中。函数decode用于将原文old加密并返回密文字符数组的首指针。其中,函数采用一个双向循环链表CODE来表示密文环。函数strlen用于计算一个字符串中个数(不包括字符串结尾符'/0/)。为了简单起见,程序中假设内存容量足以满足动态存贮单元分配的要求。[C程序]#include<stdio.h>#include<alloc.h>#defineCR13typedefstructnodecharch;structnode*forward;/*Linktonextnode.*/structnode*backward;/*Linktopreviousnode.*/CODE;main()char(1),old[256];intstrlen(),key,num=0;printf("/nPleaseinputthetelegraph:/n")while(num<255old[(2)]='/0';doprintf("/nPleaseinputKey=?(Key>1):");scanf("%d",while(key<=1);printf("/nThedecodeoftelegraph:'%s'is:/n'%s'/n",old,decode(old,key));char*decode(old,key);char*old;intkey;char*new;intlength,count,i;CODE*loop,*p;length=strlen(old);loop=((3))malloc(length*sizeof(CODE));for(i=1;i<length-1;i++)loop[i].forward=loop[i].backward=loop[0].backward=loop[0].forward=loop[length-1].forward=loop;loop[length-1].backward=for(p=loop,i=0;i<length;i++)for(count=1;count<key;count++)p=(4);p->ch=*old++;p->backward->forward=(5);p->forward->backward=(6);p=p->forward;new=(char*)malloc((length+1*sizeof(char));for(i=0;i<length;i++)new[i]=loop[i].ch;new[length]='/0';return(new)intstrlen(s)char*s;intlen=0;while((7)!='/0')len++;return(len);
问答题[说明] 下面程序的功能是将多个文件的内容同时输出在屏幕上,文件名都作为参数传入,命令执行为:cat file1 file2 file3,即同时输出file1、file2、file3的内容。[程序]#include <stdio.h>#include <stdlib.h>void fileeopy(FILE * ifp, FILE *ofp) int c; while((c=getc( (1) ))!=EOF) pute(c, (2) ); int main(int arge, char *argv[]) FILE *fp; while( (3) >0) if((fp=fopen( (4) ,"r"))= =NULL) printf("Can't open file/n"); return 1; else filecopy(fp, stdout); fclose( (5) ); return 0;
问答题【说明】
下面的程序用DoleRob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。
a.在第一行的正中插入1。
b.新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。
c.若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。
例如,3阶魔方阵如下所示:
8 1 6
3 5 7
4 9 2
【C程序】
#include<stdio.h>
#include<stdlib.h>
#define SIZE 50
main( )
{ int row, col, n,value;
int a[SIZE+1][SIZE+1]; /*不使用下标为0的元素*/
printf("请输入要输出魔方阵的阶数n(奇数,<%d):n=",SIZE);
scanf("%d",&n);
if (!(n % 2)||n < 1 ||{{U}} (1) {{/U}}) {
printf("输入数据有误!/n"); exit(0);
}
row=1; col = (n+1)/2; value=1;
while(value< ={{U}} (2) {{/U}}) {
a[row][col] = value;
/*计算下一位置*/
if(value%n !=0){
row--; {{U}} (3) {{/U}};
if(row<1) row=n;
if(col>n){{U}} (4) {{/U}};
}
else row++;
value = {{U}}(5) {{/U}};
}
printf("/n%d阶魔方阵如下所示:/n/n",n);
for(row = 1;row <= n; row++){
for(col = 1; col <=n; col++)
printf("%5d",a[row][col]);
printf("/n");
}
}
问答题[说明]以下[C程序]所完成的功能是在3X3方格中填入数字1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。系统输出满足该要求的所有填法。系统的部分输出结果如图3-18所示。图3-18系统的部分输出结果3×3方格从第1行左上角方格开始的序号分别为0、1、2,第2行左边方格开始的序号分别为3、4、5,第3行左下角方格开始的序号分别为6、7、8。以下[C程序]采用试探法,即从序号为0的方格(左上角)开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的整数。直至序号为8的方格(右下角)也填入合理的整数时,就找到了一个解,将该解输出,并调整序号为8的方格所填的整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,C程序引入二维数组checkMatrix,用于存放需要进行合理性检查的相邻方格的序号。[C程序]#include<stdio.h>#defineN12inta[9];/*用于存储方格所填入的整数*/intb[N+1];intpos;checkMatrix[][3]=-1,0,-1,1,-1,0,-1,1,3,-1,2,4,-1,3,-14,6,-1,5,7,-1;voidwrite(inta[])inti,j;for(i=0;i<3;i++)for(j=0;j<3;j++)printf("%3d",a[3*i+j]);printf("/n");intisPrime(intm)inti;if(m==2)return1;if(m==1||m%2==0)return0;for(i=3;i*i<=m;)if(m%i==O)return0;i+=2;return1;intselectNum(intstart)intj;for(j=start;j<=N;j++)if(b[j])returnj;return0;intcheck()/*检查填入pos位置的整数是否合理*/inti,j;for(i=0;(j=(1))>=0;i++)if(!isPrime(a[pos]+a[j]))(2);(3);extend()/*为下一方格找一个尚未使用过的整数*/a[(4)]=selectNum(1);b[a[pos]]=0;voidchange()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/intj;while(pos>=0if(pos<0)return;b[a[pos]]=1;a[pos]=j;b[j]=0;find()intok=1;pos=0;a[pos]=1;b[a[pos]]=0;deif(ok)if((7))write(a);change();elseextend();elsechange();ok=check(pos);while(pos>=0);main()inti;for(i=1;i<=N;i++)b[i]=1;find();
问答题阅读以下标准书号校验码的技术说明和程序流程图,根据要求回答问题1至问题3。[说明]为实现图书的国际统一编码,便于实现计算机化的图书管理,每本正式出版的图书都印有国际标准书号。标准书号由“ISBN”、10个数字(0-9)组成,其格式如下。ISBN组号-出版者号-书名号-校验码其中,校验码是根据前面9个数字计算得到的,用于计算机自动校验。假设标准书号的10个数字依次是a(1),a(2),…,a(10),则校验码a(10)的设置应使S=1O*a(1)+9*a(2)+8*a(3)+…+1*a(10)能被11整除。如果校验码a(10)应设置成10,则规定以“X”表示之。例如,《软件设计师考试考前冲刺预测卷及考点解析》的标准书号为:ISBN7-121-05027-5。第1段上的数字“7”是国际ISBN中心分配给中国ISBN中心管理的组号;第2段上的“121”表示电子工业出版社。标准书号的校验过程如图3-16所示,计算校验码的过程如图3-17所示。其中,Mod(S,11)表示S除以11得到的余数。图3-16标准书号的校验过程图3-17计算校验码的过程
问答题【说明】以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。【C程序】#include<stdio.h>#defineM30#defineNLEN10typedefstructnodeintcur_s;/*最近输入成绩的科目*/Charno[NLEN];intscore;structnode*next;NODE;ints[M],sp,ss,i,mark,order,C;FILE*fp;NODE*h,*U,*V,*p;Charfname[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);elsebreak;if(strcmp(fname,"aaaa")==0)break;fscanf(fp,"%d",/*输入科目号*/s[sp]=s;for(i=0;s[i]!=ss;1++);if((1))printf("该科目的成绩已输入,请输入别的科目成绩文件。/n");continue;sp++;while(fscanf(fp,"%s%d",no,v!=NULLu=v,v=v->next);if(v!=NULL/*累计总成绩*/v->cur_s=ss;/*同一科目成绩重复输入,后输入成绩被忽略*/elsep=(NODE*)malloc(sizeof(NODE));/*一位新的学生*/strcpy(p->no,no);p->score=mark;p->cur_s=ss;p->next=v;if(v==h)(2);else(3);fclose(fp);printf("还有科目成绩文件要输入吗?(Y/N)");scanf("%c",if(ans=='N'||ans=='n')break;/*以下按总成绩和学号对链表排序*/v=(NODE*)malloc(sizeof(NODE));v->next=h;h=v;while(v->next!=NULL)/*在余下的部分链表中找总成绩高学号小的表元*/for(p=v,u=v->next;u->next!=NULL;u=u->next)if(u->next->score>p->next->score||u->next->score==p->next->scoreif(p!=v)u=p->next;p->next=(4);(5)=v->next;v->next=u;v=v->next;v=h;h=h->next;free(v);printf("名次总成绩人数学号/n");/*以下按格式要求输出*/v=h;order=1;while(v!=NULL)for(c=1,u=v->next;u!=NULL(6);printf("%4d%7d%8d",order,v->score,c);for(order+=c,i=1;(7);v=v->next,i++)if(i>1printf("%s",v->no);printf("/n");
