初级程序员下午试题-107 (总分90, 做题时间90分钟) 试题一
阅读下列说明和流程图,将应填入 (n) 处的字句写在对应栏内。 [流程图说明]
下列流程图用泰勒(Taylor)展开式
sinx=x-x3/3!+x5/5!-x7/7!+…+(-1)n*x2n+1/(2n+1)!+…
计算并打印sinx的近似值。其中用ε(>0)表示误差要求。 [流程图]
SSS_FILL1.
分值: 3 答案:x*x SSS_FILL 2.
分值: 3 答案:x-t SSS_FILL3.
分值: 3 答案:|t|:ε SSS_FILL 4.
分值: 3 答案:s+2→s SSS_FILL5.
分值: 3
答案:(-1)*t*x2/(s*(s-1))
[解析] 本题的关键是搞清楚几个变量的含义。很显然变量t是用来保存多项各项的值的,变量s和变量x2的作用是什么呢?从流程图的功能上看,需要计算1!、3!、5!,…又从变量s的初值置为1可知,变量s主要用来计算这些数的阶乘,但没有其他变量用于整数自增的,这样就可以判断s是用来存储这些奇数的,即s值依次为1、3、5,…。但X2的功能还不明确,现在可以不用管它。
空(2)的作用是给t赋初值,即给它多项式的第一项,因此应填写
“x→t”。空(3)处需填写循环条件,显然当t的绝对值小于ε(>0)时就表示已经达到误差要求,因此空(3)应填入“|t|;ε”。由变量s的功能可知,空(4)应当实现变量s的增加,因此空(4)应填入“s+2→s”。空(5)应当是求多项式下一项的值,根据多项式连续两项的关系可知,当前一项为t时,后一项的值为(-1)*t*x*x/(s*(s-1))。但这样的话,每次循环都需要计算一次x*x,计算效率受到影响,联想到变量x2还没用,这时就可以判断x2就是用来存储x*x的值,使得每次循环者少进行一次乘法运算。因此空(1)处应填入“x*x”,空(5)处应填入“(-1)*t*x2/(s*(s-1))”。 试题二
阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。 [说明]
函数void convert(char *a,int n)是用递归方法将一个正整数n按逆序存放到一个字符数组a中,例如n=123,在a中的存放为'3'、'2'、'1'。 [函数2.1]
void convert(char *a,int n) int i;
if((i=n/10)! =0) convert( (1) ,i); *a= (2) ;
[函数2.2说明]
函数int index(char *s,char *t)检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则返回-1。 [函数2.2]
int index(char *s, char *t) int i,j=0;k=0;
for(i=0; s[i]!='\\0';i++)
for ( (3) ;(t[k]!='\\0')&&(s[j]!='\\0') &&( (4) );j++,k++);
if( (5) ) return (i);
return (-1);
SSS_FILL 1.
分值: 3
答案:a+1 SSS_FILL 2.
分值: 3 答案:n%10+'\\0' SSS_FILL 3.
分值: 3 答案:j=i,k=0 SSS_FILL 4.
分值: 3 答案:t[k]=s[j] SSS_FILL5.
分值: 3
答案:t[k]='\\0'或!t[k]
[解析] 函数1采用递归方法将一个正整数n按逆序存放到一个字符数组a中,递归调用为convert(a+1,i),所以空(1)填a+1。按逆序输出字符保存在数组a中为*a_n%10+'\\0',即空(2)填n%10+'\\0'。
函数2检查字符串s中是否含有字符串t是在for循环中实现的。空(3)应填j=i,k=0。如果两个字符串中含有相同的字符,则字符串s和字符串t都指向下一个字符,循环继续,直到字符串t结束。所以空(4)应填t[k]=s[j],空(5)应填t[k]='\\0'或!t[k]。 试题三
阅读下列函数说明和C代码,将应填入 (n) 处的字句写在对应栏内。 [函数说明3.1]
假设以带头结点的单循环链表作非递减有序线性表的存储结构。函数deleteklist(LinkList head)的功能是删除表中所有数值相同的多余元素,并释放结点空间。 [函数3.1]
Void deleteklist (LinkList head)
LinkNode *p,*q; p=head->next;
while (p!=head)
q=p->next;
while( (1) )
(2) ; free(q);
q=p->next;
p=p->next;
[函数说明3.2]
已知一棵完全二叉树存放于一个一维数组T[n]中,T[n]中存放的是各结点的值。下面的程序的功能是:从T[0]开始顺序读出各结点的值,建立该二叉树的二叉链表表示。 [函数3.2]
#include<istream.h> typedef struct node int data;
stuct node leftChild,rightchild; BintreeNode;
typedef BintreeNode *BinaryTree;
void ConstrucTree(int T[] , int n, int i, BintreeNode *&ptr)
if(i>=n) (3) ; /*置根指针为空*/ else
ptr=(BTNode*) malloc(sizeof(BTNode)) ptr->data=T[i];
ConstrucTree (T,n, 2*i+1, (4) );
ConstrucTree (T,n, (5) ,ptr->rightchild);
main(void)
/*根据顺序存储结构建立二叉链表*/ Binarytree bitree; int n;
printf(\"please enter the number of node: \\n%s\"; n); int *A=(int*)malloc (n*sizeof (int)) ;
for (int i=0; i<n; i++) scanf(\"%d\" ,A+i); /*从键盘输入结点值*/
for (int i=0; i<n; i++) printf(\"%d\
ConstructTree (A,n, 0,bitree);
SSS_FILL 1.
分值: 3
答案:q!=head &&q->data=p->data SSS_FILL 2.
分值: 3
答案:p->next=q->next SSS_FILL 3.
分值: 3 答案:pt=NULL SSS_FILL4.
分值: 3
答案:ptr->leftchild SSS_FILL 5.
分值: 3 答案:2*i+2
[解析] 这一题共有两个程序,第一个函数是考查链表操作,第二个程序是使用递归法创建链式存储的二叉树。
先看第一个函数。这个函数由于while循环实现对链表的遍历,在这个while循环中又嵌套着一个while循环,内循环实现了删除相同元素的功能。由说明和程序可知,p指针指向当前遍历结点,q指向当前结点的后继结点,如果这两个结点的数据域相等,则将其删除。这个循环何时结束呢?显然,当各结点的数据域不相等时要结束,或者当q指向链表头结点时,整个链表已经遍历完了也要结束,因此空(1)处应填写“q!=head && q->data==p->data”或其等价形式。如果指针p和指针q所指的结点的数据域相等,则要将指针q所指的结点删除,从内存中释放空间必须使指针q所指的结点的后继结点接到指针p所指的结点后,因此空(2)处应填写“p->next=q->next”。
再来分析第二个程序。这个程序由两个函数组成,函数main()实现数据输入,函数ConstrucTree(int T[],int n,int i,BintreeNode *&ptr)用于建立二叉链表。根据空(3)所在语句的注释,很容易填写空(3),当i>=n时,就说明二叉树不存这个结点,即将根指针置空,因此空(3)应填写
“ptr=NULL”。当i<n时,先生成一个结点,将数组T[]第i个元素数据填入该结点,接下来建立结点的左子树和右子树。根据完全二叉树的顺序存储的定义,可以第i个元素左子树根结点为2*i+1,右子树的根结点为2*i+2。因此第一条递归调用是建立左子树,第二条递归调用是建立右子树。因此空(4)应填写“ptr->leftchild”,空(5)应填写“2*i+2”。 试题四
阅读以下说明和C代码,将应填入 (n) 处的字句写在对应栏内。 [说明]
从文件in.dat中读取一篇英文文章存入到字符串数组xx中,以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后把结果xx输出到文件OUT6.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。 [函数]
#include<string.h> #include<conio .h> #include<ctype.h> #include<stdio.h> char xx[50][80];
int maxline =
0 ; /*文章的总行数*/ int ReadDat (void) ; void WriteDat (void) ; void StrOL(void)
char *p1,*p2,t [80]; int i;
for (i=0; i<maxline; i++) p1=xx[i];t[0]=0; while (*p1) p1++; while (p1>=xx [i])
while (! isalpha (*p1) &&p1 ! =xx [i]) p1--; p2 =p1;
while( (1) )p1--;
if (p1==xx [i])
if (isalpha (*p1) p1--;
else if (! isalpha (* (p1+1;)) break;
p2++;
(2) ; strcat (t,p1+1) ; strcat (t, \" \") ;
strcpy (xx [i] ,t) ;
void main
if( (3) )
printf (\"数据文件in.dat不能打开! \\n\\007\") ; return;
StrOL (); writeDat (); getch;
int ReadDat (void)
FILE *fp; int i=0; char *p;
if ((fp=fopen (\"e:\\\\a\\\\\\in.dat \" , \"r\")) ==NULL) return 1;
while (fgets (xx [i] , 80, fp) ! =NULL) p=strchr (xx [i] , '\\n') ; if(p)*p=0 i++ ;
maxline= (4) ; fclose (fp); return 0;
void WriteDat (void)
FILE *fp; int i;
fp=fopen(\"e: \\\\a\\\\out6 .dat\" ,\"w\"); for (i=0; i<( (5) ) ; i++) printf(\"%s\\n\" ,xx [i]); fprintf (fp, \"%s\\n\
fclose(fp);
SSS_FILL 1.
分值: 3
答案:isalpha(*p1)&&p1!=xx[i] SSS_FILL 2.
分值: 3 答案:*p2=0 SSS_FILL 3.
分值: 3 答案:ReadDat() SSS_FILL 4.
分值: 3 答案:i SSS_FILL5.
分值: 3 答案:maxline
[解析] 在主函数中首先调用函数ReadDat(),从文件in.dat中读取一篇英文文章存入到字符串数组xx中,所以空(3)应填入“ReadDat()”。用变量maxline表示文章的行数,所以空(4)应填入“i”。
函数StrOL()的功能是以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排,然后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,采用的算法是先让两字符指针都指向串尾,然后使一指针(p1)往前移动,当出现不是字母时则表示在p1+1与p2之间是一个单词,并将该单词存入一变量(t1),最后将t1连接到新串中(t);接着再往前找第二个单词,依次类推,直到字符串头。for循环中的第一个while循环将字符指针移到串尾,在第二个while循环中,首先要去掉不是字母的字符,将p2也指向串尾,然后向前找一个单词及p1所指向的应为字母,且要保证仍然在本行,所以空(1)可填入“isalpha(*p1)&&p1!=xx[i]”(或等价形式),这样p1+1与p2之间是一个单词,要作字符串处理,p2加1,指向字符串结束标记,所以空(2)应填入“*p2='\\0'”或者“*p2=0”。
最后通过调用函数Writedat()把结果XX输出到文件中,空(5)为输入的行数,显然应填入\"maxline”。 试题五
阅读下列说明和C++程序,将应填入 (n) 处的字句写在对应栏内。 [说明]
设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。 在Date类中设计如下重载运算符函数。
Date operator+(int days):返回某日期加上天数得到的日期。 Date operator-(int days):返回某日期减去天数得到的日期。 int operator-(Date &b):返回两日期相差的天数。 [C++程序]
#include<iostream. h>
int day_tab[2][12]=31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
31, 29, 31,30, 31, 30, 31, 31,30,31,30,31;
//day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年 class Date
int year,month,day;//年,月,日
int leap (int); //判断是否为闰年 int dton (Date&); Date ntod (int); Public: Date()
Date(int y,int mint d)year=y;month=m;day=d; void setday (intd) day=d; void setmonth (int m)month=m; void setyear(int y)year=y; int getday()return day; int getmonth()return month; int getyear() return year;
Date operator+(int days) //+运算符重载函数
static Date date; int number= (1) ; date=ntod (number); return date;
Date operator-(int days) //-运算符重载函数
statis Date date;
int number= (2) ; number-=days;
date=ntod (number); return date;
int operator-(Date &b) //-运算符重载函数
int days= (3) ; return days;
void disp()
cout<<year<<\".\"<<month<<\<<day<<endl; ;
int Date::leap (int year) if( (4) ) //是闰年 return 1; //不是闰年 else
return 0;
int Date::dton (Date &d) //求从公元0年0月0日到d日期的天数
int y,m,days=0;
for (y=1;y<=d.year;y++)
if( (5) )days+=366; //闰年时加366天 else days+=365; //非闰年时加365天 for (m=0;m<d.mont.h-1;m++) if (leap (d.year)
days+=day_tab [1] [m]; else
days+=day__tab [0][m]; days+=d.day; return days;
Date Date::ntod (int n) //将从公元0年0月0日的天数转换成日期
int y=1,m=1,d,rest=n,1p; while (1)
if (leap (y)) if (rest<-366)break; else rest-=366; else //非闰年 if (rest=365)break; else rest-=365;
y++;
y--;
1p=leap (y); while (1)
if (1p) //闰年
if (rest>day_tab [1][m-1])rest-=day_tab [1] [m-1]; else break;
else //非闰年
if(rest>day_tab[0] [m-1])rest-=day_tab[0][m-1]; else break; m++:
d=rest;
return Date (y; m, d);
void main()
Date now(2003, 10,1),then (2005,6,5); cout<<\"now:\"; now. disp(); cout<<\"then:\"; then .disp();
cout<<\"相差天数:\"<<(then-now)<<endl; Date d1=now+1000,d2=now-1000; cout<<\"now+1000:\"; d1. disp(); cout<<\"now-1000:\"; d2. disp();
SSS_FILL1.
分值: 3
答案:dton(*this)+days SSS_FILL 2.
分值: 3 答案:dton(*this) SSS_FILL 3.
分值: 3
答案:dton(*this)-dton(b)-1 SSS_FILL 4.
分值: 3
答案:year%4==0&&year%100!=0||year%400==0 SSS_FILL 5.
分值: 3 答案:leap(y)
[解析] 本题程序中对运算符进行重载。其中运算符+表示某日期加上若干天后的日期,第一个“-”表示某日期减去若干天后的日期,第二个“-”表示两日期相差的天数。
函数leap()判断指定的年份是否为闰年,闰年的条件有两个,一是能被4整除,但不能被100整除,或者既能被100整除,又能被400整除,所以空(4)应填入“year%4=0 &&year%100 !=0||year%400=0”。
函数dton()将指定的日期转换成从0年0月0日起的天数,空(5)用来判断之前的年份是否为闰年,调用函数leap(),所以填入“leap(y)”。函数ntod将指定的0年0月0日起的天数转换成对应的日期。
“+”运算符重载时,先将当前日期转换为从0年0月0日起的天数,再加上要加的天数,最后将天数再转换成对应的日期。所以空(1)应填入“dton(*this)+days”。
第一个“-”运算符重载时,先将当前日期转换为从0年0月0日起的天数,再减去要减的天数,最后将天数再转换成对应的日期。而天数的相减由语句“number-=days”完成,所以空(2)应填入“dton(*this)”。
第二个“-”运算符重载时,先将两个比较的日期都转换为从0年0月0日起的天数,再相减,所以空(3)应填入“dton(*this)-dton(b)-1”。 试题六
阅读以下说明和Java程序,将应填入 (n) 处的字句写在对应栏内。 [说明]
下面程序是为汽车市场编制的一个程序的一部分。其中automobile是基类。
[Java程序]
class MainJava
public static void main (String agr[] car sedan=new car;
sedan.initialize (24, 20.0, 4);
System.out.println(\"The sedan can travel\" + (1) +\"miles.\\n\");
System.out .println(\"The sedan has\"
+ (2) +\"doors.\\n\");
class automobile
protected int miles_per_gallon; //汽车每加仑行驶公里数 (3) double fuel_capacity; //油箱容积
public void initialize (int in_mpg, int in_fuel) miles_per_gallon=in_mpg; fuel_capacity=in_fuel;
public int get_mpg() //提供一辆特定汽车每加仑公里数 return miles_per_gallon;
public double get_fuel() //提供油箱容积 return fuel_capacity;
public double travel_distance() //计算满油箱情况下的可行驶总公里数
return (4) ;
class car (5)
private int Total_doors;
public void initialize(int in_mpg, double in_fuel, int doors) Total_doors=doors;
miles_per_gallon=in_mpg; fuel_capacity=in_fuel;
public int doors() return Total_doors;
SSS_FILL 1.
分值: 3
答案:sedan.travel_distance() SSS_FILL 2.
分值: 3 答案:sedan.doors()
SSS_FILL3.
分值: 3 答案:protected SSS_FILL 4.
分值: 3
答案:fuel_capacity/miles_per_gallon SSS_FILL5.
分值: 3
答案:extends automobile
[解析] 本题以Java语言为载体,考查面向对象程序设计中的关于类的几个概念,包括继承以及基类和派生类中函数的调用。
本题的功能是定义了一个automobile基类,并由其派生出了car类,主函数中定义了car的对象,并通过该对象调用了基类和派生类中的函数。 首先,通过整体阅读该题目,我们发现类car中的initialize函数直接对基类中的两个成员函数赋值,所以基类中的两个成员函数应该是被保护的,空(3)处应填入protected。在基类中提供了这样一个成员函数
travel_distance,它返回的是该交通工具的可能行驶距离,根据题目中给出的数据,空(4)处应填入fuel_capacity/miles_per_gallon。
其次,本题还考查了派生类继承的方式,由于在主函数中直接通过car的对象调用了基类的公有函数,空(5)处应填入extends automobile。
最后,通过定义car的对象sedan,分别调用了基类和派生类中的一个函数,空(1)处应填入sedan.travel_distance(),空(2)处应填入sedan.doors()。
1
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务