2011 第二次上机练习参考答案
- 格式:doc
- 大小:1.05 MB
- 文档页数:10
2011春江苏省二级C上机考试第2套(暂缺部分答案)(总分:40.00,做题时间:70分钟)一、改错题(16分)(总题数:1,分数:16.00)1.【程序功能】统计一个字符串中包含的字母串个数并找出其中最长的字母串。
所谓字母串是指一个连续的字母序列(不区分大小写),字母串之间用非字母字符分隔。
函数count的功能是统计p指向的字符串中包含的字母串个数,找出的最长字母串存放在pmax指向的数组中,函数返回字母串的个数。
【测试数据与运行结果】测试数据:you are teaeher234too. 屏幕输出:a=you are teacher234too. number is 4 max string is:teacher 【含有错误的源程序】#include #include #include int count(char p[],char pmax[]) { int j=0,k,m=0; char temp[100]; while(*p) { while((!isalpha(*p)) && *p) p++; k=0; if(*p!='/0') m++; while(isalpha(*p)) temp[k++]=*p++; temp[k]="/0"; if(k(分数:16.00)__________________________________________________________________________________________ 正确答案:(改错1:将第13行 "temp[0]="/0" 修改为 temp[0]='/0' 改错2:将第 14行 if(kj) 改错3:将第16行 pmax=temp,修改为 strcpy(pmax,temp); 改错4:将第24行i=count(a[],max[])修改为i=count(a,max); )解析:二、编程题(24分)(总题数:1,分数:24.00)2.【程序功能】将一个二维数组中的若干行数据按要求插入到另一个二维数组中。
2011年计算机二级C语言上机操作题及答案(99)来源:考试大【相信自己,掌握未来,考试大值得信赖!】 2011年7月27日第一题请补充fun函数的功能是:把字符下标能被2或3整除的字符串str中删除,把剩余的字符重新保存在字符串str中。
字符串str从键盘输入,其长度作为参数传入fun函数。
例如,输入“abcdefghijk”,输出“bfh”。
请勿改动主函数main和其他函数中的任何内容,仅在fun函数的横线上填入所编写的若干表达式或语句。
#include#define N 80void fun(char s[], int n){int i, k;___1___;for (i=0; i{s[k++] = s[i];if ((i%2==0) ___2___ (i%3==0))k--;}___3___;}main(){int i = 0, strlen = 0;char str[N];printf("\nInput a string:\n");gets(str);while (str[i] != '\0'){strlen++;i++;}fun(str, strlen);printf("\n********* display string *********\n");puts(str);}答案:第1处填空:k=0;第2处填空:||第3处填空:s[k]=’\0’或s[k]=0第二题下列给定程序中,函数fun的功能是:统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数;并把该整数中各位上最大的数字值作为函数值返回。
例如,若输入无符号整数30800,则数字值为零的个数为3,各位上数字值最大的是8。
请改正函数fun中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!#includeint fun(unsigned n, int *zero){int count = 0, max = 0, t;do{t = n ;/********found********/if (t = 0)count++;if (max < t)max = t;n = n/10;} while (n);/********found********/zero = count;return max;}main(){unsigned n;int zero, max;printf("\nInput n(unsigned): ");scanf("%d", &n);max = fun(n, &zero);printf("\nThe result: max=%d zero=%d\n", max, zero);}答案:第1处:if(t=0)应改为if(t==0)第2处:zero=count; 应改为*zero=count;第三题请编写函数fun,其功能是:计算并输出例如,若主函数从键盘给n输入20后,则输出为s=534.188884。
重要说明:本题库为从题中一题一题复制出来工作量大,而且有许多表达式无法在word中快速表示出来(这样会加大工作量)故而省略,或者表达错位,有的地方可能或者肯定会有错,我相信准备参加C语言二级考试的同学应当能够对照参考答案看出来,这是2011年最新版最完整考试题库,相信大家一定都能通过!第一套程序填空给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。
如输入一个数:27638496,新的数为729第一空:{ t=*n%10;第二空:if(t%2!=0)第三空:*n=x;2.程序修改给定程序modi1.c中函数fun的功能是:计算n!。
例如,给n输入5,则输出120.000000。
double fun(int n ){ double result=1.0;/*****found******/if(n==0)return 1.0;while(n>1&&n<170)/*****found******/result*=n--;return result;}程序设计请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。
long fun(char *p){int i,len,t;long x=0;len=strlen(p);if(p[0]==‘-‗){ t=-1;len--;p++;}else t=1;while(*p)x=x*10-48+(*p++);return x*t;}第二套1. 给定程序中,函数fun的功能是将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
第一套1.程序填空程序通过定义学生结构体数组,存储了若干个学生的学号、姓名和三门课的成绩。
函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大排序)。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
第一处struct student t;第二处for(i=0;i<n-1;i++)第三处if(strcmp(a[i].name,a[j].name)>0)2程序修改给定程序MODI1.C中函数fun的功能是:在p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向上顺序移动。
/**found**/q=p+i;/**found**/while(q>p)3程序设计学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写了函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。
int fun(STREC *a,STREC *b,int l,int h){int i,j=0;for(i=0;i<N;i++)if((a[i].s>=1&&a[i].s<=h)b[j++]=a[i];return j;}第二套1.程序填空给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序连接。
函数fun的功能是:删除链表中数据域值相同的结点,使之只保留一个。
第一处free(q);第二处q=p->next;第三处q=q->next;2. 程序修改给定程序MODI1.C中函数fun的功能是:用选择法对数组中的n各元素按从小到大的顺序进行排序。
/**found**/p=j;/**found**/p=i;3. 程序设计请编写一个fun函数,它的功能是:求出1到m之间(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。
参考答案--------信息学院11年级计算机科学基础II上机试卷A(考试时间70分钟卷面成绩100分)学号姓名机位号说明:首先在Z盘建立一个以自己的学号命名的文件夹,用于存放上交的*.CPP文件和.dat文件,考试结束前根据机房要求,将这个文件夹传送到网络服务器上,注意:提交时只保留文件夹中的CPP文件和dat文件。
一、改错题(50分)【要求】调试程序,修改其中的语法错误及逻辑错误(共10处)。
1)只能修改、不能增加或删除整条语句。
2)请在修改行的末尾用"注释符号//+序号"表示此行修改过,如//3)3)源程序以"学号f1.cpp"命名,存入自己学号命名的文件夹中。
如04011011f1.cpp。
【含错误的源程序】#include<iostream>#include<cstring> //错1,该句改为:#include<string>using namespace std;#define day 3class CGlasses{ int ID;string Name;double *Price;public:CGlasses( int =0, string ="\0", double * =NULL );CGlasses(CGlasses &);~CGlasses();void Rewrite( int ,string );friend ostream& operator<<( ostream& out, CGlasses &obj ){out<<"ID: "<<obj.ID<<endl<<"Name: "<<<<endl<<"Price list: "<<endl;if(obj.Price){for(int i=0;i<day;i++)out<<obj.Price[day]<<'\t'; //错2,该句改为:out<<obj.Price[ i ]<<'\t';out<<endl<<endl;}else out<<"No price were recorded.\n\n";return cout; //错3,该句改为:return out;}};CGlasses::CGlasses( int id, string name, double *p) : id(ID), Name(name)//错4,上一行改为:CGlasses::CGlasses( int id, string name, double *p) : ID(id), Name(name) {if ( !p )//错5,该句改为:if ( p ){if ( Price=new double [day] )for ( int i=0; i<day; i++ )Price[ i ] = p[ i ];else{cout<<"Memory allocation error\n!";exit(1);}}else Price=p;}CGlasses::CGlasses( CGlasses obj )//错6,该句改为:CGlasses::CGlasses( CGlasses &obj ) {ID=obj.ID;Name=;if ( obj.Price ){if ( Price=new double [day] )for ( int i=0; i<day; i++ )Price[ i ] = obj.Price[ i ];else{cout<<"Memory allocation error\n!";exit(1);}}else Price=obj.Price;}~CGlasses() //错7,该句改为:CGlasses::~CGlasses(){cout<<"No. "<<ID<<" glasses were deleted!\n\n";if ( Price ) delete Price; //错8,该句改为:if ( Price ) delete [ ] Price;}void CGlasses:: Rewrite( int id, string name ){ID=id;Name=name;if ( !Price ){Price=new double(day); //错9,该句改为:Price=new double[day];if ( !Price ){cout<<"Memory allocation error!\n";exit(1);}}if ( Price ){cout<<"please input "<<day<<" price records:\n";for ( int i=0; i<day; i++ )cin>>Price[ i ];}}int main(){double plist[day]={70,85,78};CGlasses glass(10,"Sun glasses",*plist);//错10,上一行改为:CGlasses glass(10,"Sun glasses",plist);cout<<glass;CGlasses glass1( glass );cout<<glass1;glass1.Rewrite(11,"Hyperopic glasses");cout<<glass1;return 0;}二、编程题(50分)【注意】源程序以“学号f2.cpp”命名,存入自己学号文件夹。
三、上机操作题1、现有一个名为888的拨号连接,要求配置如下属性:电话号码从163改为8888,如果忙音重拨100次,每次间隔30秒,断线不重拨,使用WindowsXP的防火墙。
“开始”——“设置”——“网络”----选常规选项卡:电话号码:8888;选项选项卡:重拨次数:100、重拨间隔:30秒、去掉勾选“断线重拨”;高级选项卡:勾选“通过限制……”。
2、在windowsXP中添加西班牙文输入法。
开始——控制面板——日期、时间、语言和区域设置——添加其它语言——详细信息——添加——勾选“键盘布局/输入法”——选择“西班牙文”——确定3、设置Internet Explorer,禁止用户访问所有可能含有暴力内容的网站,监督人密码设为21。
启动IE——工具菜单——Internet选项——内容——分级审查:启用——暴力——级别0——确定——密码:21、确认密码:21——确定4、打开资源管理器,完成以下的一个目录结构:①创建如图所示的一个目录结构;②在考试文件夹下的CWINLX下创建一个名为AB5的文件夹;③将考试文件夹下的KS3.txt及KS5.tst文件移到AB5文件夹中;④将考试文件夹下的LS文件夹换名为KS5;⑤将KS4.txt设置成只读属性;⑥删除考试文件夹下的KS1.txt;⑦将系统设置成“显示所有文件”;⑧利用查找功能查找文件,并在AB5文件夹下建立的快捷图标,并命名为MYCAL。
右击“开始”----资源管理器----打开C盘----选考试----右键选新建----文件夹----AB5----选中ks3.txt和ks5.txt----剪切----选AB5----粘贴----选LS---右键重命名为ks5----选ks4.txt右键----选属性只读----确定----单击“工具”菜单----文件夹选项----“查看”选项卡----选“显示所有文件”--确定---搜索----右键----创建快捷图标----mycal----剪切----选AB5粘贴。
参考答案(最好单独再打印一张答案以备用,学海狗不要偷看)一、程序填空题1、1)std[i].year(2)std[i](3)n2、(1)[N](2)i(3)i+13、(1)j++(2)s[i]=t1[i](3)j4、(1)[N](2)t[i][j](3)t[j][i]5、(1)t=i(2)i(3)06、(1)tt(2)tt.score[i](3)std7、(1)sum=0(2)t[i][i](3)18、(1)0(2)x[i]/N(3)j++9、(1)x[i]/N(2)j++(3)i++10、(1)s/N(2)j++(3)-111、(1)1(2)j++(3)j12、(1)M(2)<(3)k13、(1)b[k](2)N/2(3)<14、(1)1(2)i(3)a[p+i]15、(1)FILE *(2)fp(3)ch16、(1)a[0][i](2)<(3)x,y17、(1)s[i](2)'9'(3)*t=n18、(1)a[i](2)a[j](3)a[j]19、(1)j(2)k(3)p20、(1)i++(2)m(3)m21、(1)a[i]%2(2)a[j](3)j22、(1)0(2)||(3)123、(1)'0'(2)s++(3)ctod(a)+ctod(b)24、(1)1(2)s[k](3)c25、(1)ss[i](2)n+j(3)126、(1)N(2)N-1(3)027、(1)double(2)f1(3)f228、(1)pb(2)p->data(3)p->next29、(1)i+1(2)k=j(3)t30、(1)a[i](2)m%10(3)m/1031、(1)&&(2)0(3)s[j]32、(1)i%5(2)\n(3)a[i]33、(1)N(2)break(3)n34、(1)char(2)ch<='9'(3)'0'35、(1)[N](2)len(3)*n=len36、(1)k(2)len(3)ss[i][j]37、(1)*std(2)std[i].age(3)38、(1)STU(2)std[i].num(3)std[i]39、(1)0(2)j--(3)j40、(1)t[][N](2)i=0;i<n(3)s41、(1)0(2)0(3)c42、(1)filename(2)fp(3)fp43、(1)"rb"(2)>(3)fwrite44、(1)*std(2)PERSON(3)std45、(1)*av(2)i(3)x[j]46、(1)STU(2)score[i](3)&std47、(1)0(2)t(3)i+t48、(1)n/2(2)i(3)a[n-i-1]49、(1)*a(2)2(3)i+150、(1)FILE *(2)fclose(fp)(3)fp二、程序修改题1、(1)int t[N] ,i, num=0;(2)t[num++]=b[i];(3)for(i=0; i<num; i++)2、(1)aa[i]=m%k;(2)printf("%d",aa[i-1]);3、(1)for(j=i+1;j<6;j++)(2)*(pstr+i)=*(pstr+j);4、(1)#define FU(m,n) ((m)/(n))(2)return (value);5、(1)while((fabs(t))>=num)(2)t=s/n;6、(1)m=i;(2)if(a[k]>a[m]) m=k;7、(1)double r;(2)while(fabs(m-n)>0.001)8、(1)double fun(int m)(2)for(i=100;i<=m;i~1+=0)9、(1)num[k]=0;(2)switch(*s)10、(1)#include "stdio.h"(2)upfst(char *p)11、(1)t=a;a=b;b=t;(2)return(b);12、(1)if(('a'<=tt[i])&&(tt[i]<='z'))(2)tt[i]-=32;13、(1)IsPrime(int n)(2)if(!(n%i))14、(1)float k;(2)if(*c>*a)15、(1)s[j++]=s[i];(2)s[j]=0;16、(1)void fun(int *x,int *y)(2)t=*x;*x=*y;*y=t;17、(1)t=*x;*x=y;(2)return t;18、(1)switch(g)(2)case 1: return 1; case 2:return 1;19、(1)while(i<j)(2)if(*a)20、(1)while((2<=high) && (n<10))(2)yes=0; break;21、(1)fun (int n)(2)if(n==1)22、(1)t-=1.0/i;(2)return t;23、(1)void fun ( char *s, int *a, int *b )(2)++(*a);(3)++(*b);24、(1)long s=0,t=0;(2)t=t/10;25、(1)if(*p==' ')(2)*(p-1)=toupper(*(p-1));26、(1)s=s+(n+1.)/n;(2)return t;27、(1)char *fun(char *s,char *t)(2)ss++;(3)tt++;28、(1)int i, one=0, zero=0;(2)switch( s[i] )(3)case 0:zero++;break;29、(1)void fun(char *str, char ch )(2)if(*str!=ch)(3)str[1] = 0;30、(1)b[i] = a[i][0];(2)for (j=1; j<=N-1; j++)(3)if ( b[i] > a[i][j] )31、(1)for(i=2;i<=m;i++)(2)y+=1.0/i/i;32、(1)return t;(2)for(i=0;i<N;i++) t[i]=x[i];(3)x[i+1]=findmid(a,b,c);33、(1)sum=0;(2)scanf("%d",&a[i][j]);34、(1)b[k]=*p;(2)b[k]=' ';k++;35、(1)t+=1./i;(2)return t;36、(1)result*=(double)n--;(2)return result;37、(1)void fun(int *a,int *b)(2)t=*b;*b=*a;*a=t;38、(1)r++;p++;(2)if(*r==0)39、(1)double f(double x)(2)return s;40、(1)fun(int a[],int m)(2)else if(m>a[mid])41、(1)double sum=0.;(2)sum /= c;42、(1)p=(NODE *)malloc(sizeof(NODE));(2)return h;43、(1)p=s;(2)while(*p++);44、(1)int k,q,i;(2)pt[i]=str[k][i];45、(1)float fun(int n)(2)for (i=1; i<n; i++)46、(1)if(k>0)(2)else if(k==0)47、(1)b[i]=0;(2)b[a[i] - 'a']++;(3)if (b[max] < b[i])48、(1)n= *p-'0';(2)n=n*8+*p-'0';49、(1)sum=0;(2)if((i+1)%5==0)50、(1)t=(STU *)calloc(sizeof(STU),m);(2)t[k]=b[j];三、程序编写题1、void fun( STU a[], STU *s ){int i,j=0,max;max = a[0].s;for(i=1;i<N;i++){if(max<a[i].s){max =a[i].s;*s=a[i];}}}2、len=strlen(a[i]) ;if(maxlen<len)k=i , maxlen=len ;3、int count=0 ;while(*ss != '\0'){if(*ss = = c)count++ ;ss++ ;}return count;4、int i,len=0;while(a[len] == '*')len++;i=len;while(a[i]!= '\0'){a[i-len]=a[i];i++;}5、a[n]=0 ;strcpy(b , a) ;strcat(b , a + strlen(a)+1);6、unsigned num=w,n=1;while(num!=0){num=num/10;n=n*10;}n=n/10;return w%n;7、char *r,*q;for(q=p;q>h;q--){if(*q == '*'){r=q;while(*r!='\0'){*r=*(r+1);r++;}}}8、int i;*s=a[0];for(i=1;i < N;i++){if((*s).s > a[i].s )*s=a[i];}9、int sum=0,i;for(i=0;i<N;i++)sum=sum+a[0][i]+a[M-1][i];for(i=1;i<M-1;i++)sum=sum+a[i][0]+a[i][N-1];return sum;10、int sum=0,i;for(i=0;i<N;i++)sum=sum+w[0][i]+w[N-1][i];for(i=1;i<N-1;i++)sum=sum+w[i][0]+w[i][N-1];return (double)sum/(4*N-4);11、void fun( char *a ){char *t;while(*a){if(*a=='*'){t=a-1;while(*a){ *(a) = *(a+1); a++; }*a='\0';a=t;}a++;}}12、void fun( int m, int *k, int xx[] ){int i,j,num=0;for(i=2;i<m;i++){for(j=2;j<i;j++){if(i%j==0){xx[num++]= i;break;}}}*k=num;}13、int count=0;while(*s!='\0'){if(*s>=48 && *s<=57)count++;s++;}return count;14、int fun( STREC *a, STREC *b ){ int i,num=0,max;max = a[0].s;for(i=1;i<N;i++){if(max<a[i].s)max =a[i].s;}for(i=0;i<N;i++){if(max==a[i].s){b[num]=a[i];num++;}}return num;}15、void fun(char s[][N], char *b){int i,j,n=0;for(i=0; i < N;i++) /* 请填写相应语句完成其功能*/{for(j=0;j< M;j++) b[n++]=s[j][i];}b[n]='\0';}16、int fun(int lim, int aa[MAX]){/* 以下代码仅供参考*/int i,j,k=0;/* 其中变量k用于统计素数个数*/for(i=2;i<=lim;i++){/* 以下找出小于或等于lim的素数存入aa数组中并统计素数个数*/ for(j=2;j<i;j++)if(i%j==0)break;if(i==j)aa[k++]=i;}return k;}17、void fun (int *a, int *n){int i=1;*n=0;while(i<1000){ if((i%7==0||i%11==0)&&(i%77!=0))a[(*n)++]=i;i++;}}18、void fun(STREC *a){int i;float sum=0;for(i=0;i<N;i++){sum+=a->s[i];}a->ave = sum/N;}19、void fun(char *s, char t[]){int i,j=0,len;len = strlen(s);for(i=0;i<len;i++){if(i%2==0&&s[i]%2!=0) ;else{t[j]=s[i];j++;}}t[j]='\0';}20、double fun(){double x1=0.0,x0;do{x0=x1;x1=cos(x0);}while(fabs(x0-x1)>=1e-6);return x1;}21、void fun( char *a,int n ){int num=0;char *p=a;while(*p)p++;p=p-1;while(*p=='*'){num++;p--;}if(num>n){p=p+n+1;*p=0;}}22、void fun(char *str){int i,j=0,len=0;char *p=str;while(*p){len++;p++;}p=str;for(i=0;i<len;i++){ if(*p!=' '){str[j++]=*p;}p++;}str[j]=0;}23、float fun ( float h ){return (int)(100*h+0.5)/100.0;}24、void fun(char *tt, int pp[]){int i;for(i=0;i<26;i++)pp[i]=0;while( *tt){pp[*tt-'a']++;tt++;}}25、void fun(char *s,int num){int i,j;char t;for(i=1;i<num-2;i++)for(j=i+1;j<num-1;j++)if(s[i]>s[j]){t=s[i];s[i]=s[j];s[j]=t;}}26、int fun( int t){int f1=0,f2=1,fn;fn=f1+f2;while(fn<=t){ f1=f2;f2=fn;fn=f1+f2;}return fn;}27、void fun(char *w, int m) /* 可调用fun1函数左移字符*/ {char a[N];int i;for(i=0;i<m;i++) a[i]=w[i];while(w[i]) { w[i-m]=w[i]; i++;}i--;m--;for(;m>=0;m--,i--) w[i]=a[m];}28、void fun( char *a , char *s){while(*a = *s){a++;s++;}}29、void fun ( char *s ){ nt i,j,k=0;char t;while(s[k]!='\0') k++;for(i=0,j=k-1;i<k/2;i++,j--){t=s[i];s[i]=s[j];s[j]=t;}}30、double fun(double a[ ] , int n){double t,r,sum; int i,j; for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(a[i]>a[j]){ t=a[i];a[i]=a[j];a[j]=t;}sum=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8];r=sum/8.0;return r;}31、int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)b[i][j]=0;for(i=0;i<3;i++)for(j=0;j<3;j++)b[i][j]=a[i][j]+a[j][i];32、int i; for(i=0;i<N;i++)if(s[i]==x)return i;return -1;33、int i,j,t;for(i=0;i<3;i++)for(j=0;j<i;j++){t=array[i][j];array[i][j]=array[j][i];array[j][i]=t;}34、float ave,sum=0.0;STREC *p;p=h->next;while(p){sum+=p->s;p=p->next;}ave=sum/N;return ave;35、int i,j=0;for(i=0;str[i+1]!=’\0’;i++)if(str[i]==substr[0]&&str[i+1]==substr[1])j++;return j;36、int i=0;char *p;p=s;while(*p){if (*p!=c){s[i]=*p;i++;}}s[i]=’\0’;37、int min;int i,j;for(i=0;i<N;i++){min=tt[0][i];for(j=0;j<M;j++){if(min>tt[j][i])min=tt[j][i];}pp[i]=min;}38、int i=0;for(;*s!=’\0’;s++)if(*s%2==1)t[i++]=*s;t[i]=’\0’;39、int i;double s=0.0;for(i=1;i<m;i++)s=s+log(i);return sqrt(s);40、char *t=a;for(;t<=p;t++) if(*t!=’*’) *(a++)=*t;for(;*t!=’\0’;t++) *(a++)=*t;*a=’\0’;41、double fun(int n){int i;float s=1.0, t=1.0;for(i=2;i<=n;i++){t=t+i;s=s+1/t;}return s;}42、int fun( char *s){int i=0,j=0,f=1;while(s[i]){if(s[i]<'a' || s[i]>'z'){if(f) j++;f=0;}elsef=1;i++;}43、void fun( int *a, int *b){int i,k;for(i=0;i<M;i++) b[i]=0;for(i=0;i<N;i++){ k=a[i]/10;if(k>=10) b[10]++;else b[k]++;}}44、void fun ( int a[][N] ){int i,j;for(i=0;i<N;i++)for(j=0;j<=i;j++)a[i][j]=0;}45、void fun ( int a[][N], int m ){int i,j;for(i=0;i<N;i++)for(j=i;j<N;j++)a[i][j]*=m;}46、void fun ( int a[][N], int n ){int i,j;for(i=0;i<N;i++)for(j=0;j<=i;j++)a[i][j]=a[i][j]*n;}47、long fun( char *s ){int i,j;long int p;i=strlen(s);p=s[0]-48;for(j=1;j<i;j++)p=p*10+(s[j]-48);return p;}48、STREC fun( STREC *a, char *b ){STREC res;int i;for(i=0;i<N;i++){if(strcmp(a[i].num,b)==0){res=a[i];return res;}}strcpy(res.num,"");res.s=-1;return res;}49、double fun( STREC *a, STREC *b, int *n ) {int i,j;double ave,sum=0.0;*n=0;for(i=0;i<N;i++){sum+=a[i].s;}ave=sum/N;for(i=0,j=0;i<N;){if(a[i].s<=ave){b[j]=a[i];j++;(*n)++;}i++;}return ave;}50、int fun(int a[], int n){int i,j=0;for(i=1;i<n;i++){if(a[i]!=a[j]){j++;a[j]=a[i];}}return j+1;}。
运筹学第二次上机练习题参考答案
1、安排四个人去做四项不同的工作。
每个工人完成各项工作所消耗的时间如表所示(时间单位:分钟)。
每个工人完成各项工作所消耗的时间
(2)如果把(1)中的消耗时间数据看成创造效益的数据,那么应如何指派,可使得总的效益最大?
(3)如果在(1)中再增加一项工作E,甲、乙、丙、丁四人完成工作E的时间分别为17分钟、20分钟、15分钟、16分钟,那么应指派这四个人干哪四项工作,使得这四人总的消耗时间最少?
(4)如果在(1)中再增加一个人戊,他完成A、B、C、D工作的时间分别为16分钟、17分钟、20分钟、21分钟,这时应指派哪四个人去干这四项工作,使得总的消耗时间最少?
解:(1)为典型的指派问题
winQSB中指派模型建立与求解如下:
基于上述最优指派方案,总的消耗时间最少,为71分钟。
(2)为求总效益最大的指派问题, 只需把目标最小改为目标最大。
基于上述最优指派方案,总效益最大,为102。
(3) 在(1)基础上增加工作E
基于上述最优指派方案(其中,工作D没有被安排给任何人执行),此时这四人总的消耗时间最少,为68分钟。
(4)为人多事少的指派问题,添加了一位工人。
基于上述最优指派方案(其中,乙没有被安排任何工作),总的消耗时间最少,为69分钟。
试回答:
(1)该项工程从施工开始到全部结束的最短时间?
(2)若工序L拖期10天,对整个工程进度有何影响?
(3)若工序J的工序时间由12天缩短到8天,对整个工程进度有何影响?(4)为保证整个工程进度在最短周期内完成,工序I最迟必须在哪一天开工?
解:(1)
有上述结果克制,工程完成的最短时间为80天。
(2)基于(1)的计算结果,工序L的松弛变量取值为28天,且大于10天,因此工序L拖期10天是可以接受得,整个工程仍能够在预计期限内完成。
(3) 基于(1)的计算结果,因为J处于关键路径上,因此如其工期变短,会影响更个工程进度,并且使总工期变短。
(4) 基于(1)的计算结果,I最迟在第56天开工可以保证在最短工期内整个项目完工。
3、金星社区计划在小区广场上建造一个老年活动室,具体项目的活动安排如表3- 1所示。
表3- 1
问题:
(1)找出关键路径,并判断项目能否在一年内完工。
(2)由于社区要参见全国百家优秀社区的评选,所以要紧缩项目,假定该项目必须在50周之内完成,才能来得及参加评选,请利用表3- 2所给出的信息,制定成本最小的方案。
并计算出实际所需成本、为紧缩时间所增加的费用。
表3- 2
解:
(1)基于Normal Time计算关键路径如下。
基于上述计算结果可发现,关键路径上的节点包括A、C、E、F和H,总工期为58周=58*7=406(天)>365,故无法在一年内完成。
(2)
基于上述计算结果,在50周内完成最低成本为139.08万元,而正常情况下成本为131万元,紧缩时间后增加成本为8.08万元。
4、某市六个新建单位之间的交通线路的长度(公里)如下表所示。
其中单位A距市煤气供应网最近,为1.5公里。
为使这六个单位都能使用煤气,现拟沿交通线铺设地下管道,并且经A与煤气供应网连通。
应如何铺设煤气管道使其总长最短。
解:该问题是一个最小支撑树问题。
应该在A->B,F->C,E->D,B ->E,E->F之间铺设,此时总长度最短为9.9(公里)5、求点s到点t的最短路,及到各点的最短路长
解:
到各点的最短路长如下。
6、下图表示了企业所处的供应市场、配送中心以及销售市场组成的网络,各弧上括号里的
前一个数字表示弧的容量,后一个数字是目前的实际流量。
其中,v1,v2为两家供应源,供应商v1的最大供货能力为15,供应商v2的最大供货能力为12。
v3,v4代表两个配送中心的仓库。
V5,v6,v7代表3个目标市场,市场v5的容量是5而现有需求量为4,市场v6 的容量为10而现有需求量为8,市场v7的容量为8而现有需求量为6.通过促销,扩大了市场v6的需求量,由现在需求量8扩大到10.试求这个供应---销售网络的最大流方案。
解:为了寻求网络最大流,将供应商V1,V2进行虚拟合并为Vs ,作为供应源,即网络的发点;弧(Vs ,V1)与(Vs ,V2),即为两条虚拟供应路径,其容量分别为供应商V1和V2的最大供货能力,流量分别为他们现有流出量,即如下图左方虚线上的数字。
再将三个目标市场V5,V6,V7虚拟合并成Vt ,为网络的收点;弧(V5,Vt ),(V6,Vt ),(V7,Vt ),即为3条虚拟收货路径,其容量分布不低于目标市场V5,V6和V7的最大市场容量,流量分布为它们现有流入量,即如下图右边虚线数字。
接着,检查上图的流量分布,需要这是一个可行流,显然,网络中,各条弧的流量都没有超过其容量,满足容量限制;而且V 1,….,V7的流入量都等于流处量,发点Vs 的流出量为18(6+12),收点为18(4+6+8),满足平衡条件。
这说明上图是可行流。
通过WinQSB 求解如下:
经计算,该销售网络的最大流方案如下。
7、长虹街道今年新建了11个居民小区,各小区的大致位置及相互间的道路距离(单位:100m)如图所示,请帮助决策:
(a)电信部门拟将宽带网铺设到各小区,应如何铺设最为经济?
(b)一个考察小组从小区1出发,最后到小区9然后离去,试帮助选择一条最短的考察路线。
解:
(a)该问题为最小支撑树问题,通过winQSB求解得
即应该这样子布置宽带:小区1<—>2, 2<—>4, 4<—>5, 5<—>6, 6<—>3, 4<—>8, 8<—>7, 8<—>9, 8<—>11, 7<—>10,之间进行布置最为经济。
此时,宽带网线路铺设的总长度最短,
为4700米。
(2)最短路径问题,求解得题目要求的最短路为小区1—>小区4—>小区8—>小区9,此时,最短路长为1600米。
8、求出下图所示的网络的最大流。
解:建立模型如下
求解得到的最大流如下。
9
10 12 8
15
7 4
6
9
6
10
13 s
15 11
5 18
t
7。