精品文档,知识共享!
C++题库182道设计题
第1题:已知有结构体类型定义: struct node
{ int data; struct node *nextPtr;
};
请编写函数void
computingList(node * head),对head 指向的单向链表,分别统计结点的data成员值为负数、0、
正数的结点个数分别存入变量negtive、zero、positive中。 答案: struct node *p; p=head; while(p!=NULL) { if(p->data > 0) positive++; else if (p->data < 0) negtive++; else if (p->data == 0) zero++; p=p->nextPtr; }
第2题:设计函数char capitalize(char);将小写英文字符变为对应的大写字符。
答案:char capitalize(char ch) { if(ch>='a'&&ch<='z') return ch-'a'+'A'; else return ch; }
第3题:函数mySum(int a[ ][ ], int m, int n)返回二维
整数数组a中所有元素的和,m、n分别为数组a的行
数、列数。填写适当的代码,使得mySum()完成正确 的功能。 答案:int i, j, s=0; for (i=0; i 第4题: 求1-1000之间同构数的个数n。同构数是: \某数与其自身的平方数的后几位相同\。 例如:25×25=625,25是同构数。答案: int i=1; k=m; j=m*m; while(k!=0) { k/=10; i*=10; } if(j%i==m) n++; 第5题:补充函数aver的代码,该函数计算n个学生成绩(通 过参数cj传入)的平均分数。 答案: int sum = 0; int i; for( i=0;i 第6题:输入两个正整数m和n,求其最大公约数和最小公倍数。 答案: while(r!=0) { m=n; n=r; r=m%n; } 第7题:编程计算,计算公式如右图所示。 答案: int i, k, s; s=0; for (i=1; i<=20; i++) for (k=1; k<=3; k++) s = s + (i+1)*(i+1)*(k+2)*(k+2); return s; 第8题: 完成函数cal,该函数计算数组a中的所有数据的 最大值及最小值以及它们的差,并存入到全局变 量max、min、ca中。例如数组a中包含8,43,7, 18,2,56,37,123,25,26则max=123,min=2, ca=121。 答案: int i; max=min=a[0]; for(i=0; i 到二维字符数组str1中。 答案:for(i=0;i if((strcmp(str[i],\tr[i],\ { strcpy(str1[j],str[i]); j++; } } 第10题:函数myStrCat(char *dst, char *src)将字符串src 连接到字符串dst的后面。填写适当的代码,使得 mySum()完成正确的功能。 答案:int i=0, len; len = strlen(dst); while (src[i]) dst[len++] = src[i++]; dst[len] = '\\0'; 第11题:编写函数eachPrime,判断两个正整数m和n是否为 互质数。若是,返回1;否则,返回-1。 互质数:最大公约数为1的两个数称为互质数。 答案: int temp; while (n != 0) { temp = m; m = n; n = temp % n; } if(m == 1) return 1; else return -1; 第12题:定义函数double max(double a,double b,double c)实现求三个实数中的最大值。 答案:double max(double a,double b,double c) { if(a>b&&a>c) return a; if(b>a&&b>c) return b; return c; } 第13题:邮政汇款的收费标准是汇款金额的1%,但单笔收费上限是50元。 编写一个函数double shouFei(double money),根据输入的 汇款金额money,返回所要收取的费用。 答案:double shouFei(double money) { double sf = 0; if(money<0) return 0; sf = money*0.01; if(sf > 50.0) sf = 50.0; return sf; } 第14题:请输出个、十、百位数字各不相同的所有三位数, 结果写入f2.txt中,一个数一行。 要求:输出时按从小到大的顺序输出。 答案:for(i = 0; i < 10; i++) for(j = 0; j < 10; j++) for(k = 1; k < 10; k++) { if(i != j && j != k && i != k) { output << k << j << i; count++; if(count == 60) { count = 0; output << endl; } else output << \\ } } 第15题:下面程序中的函数char *delc(char *s, char c); 去掉字符串s中的字符c,并将新得到的字符串返回,完成 该函数。 答案: char *p; while (p = strchr(s,c)) { strcpy(p,p+1); } return s; 第16题:已知三个数a,b,c,按由小到大的顺序存入a,b, c中并输出。 三个数a,b,c的值从已有文件infile596.txt中读 取。 答案: if(a>b){t=a;a=b;b=t;} if(a>c){t=a;a=c;c=t;} if(b>c){t=b;b=c;c=t;} 第17题:编写函数pfh,功能是返回两个实数的平方和。 答案:double pfh(double x, double y) { return x*x+y*y; } 第18题: 编写函数getSum()求整数m的各位数字之和并返回该值。 例如m=252时,各位数字之和为9。 答案:---------------------- int s=0,n; while( m!=0) {n=m;s+=n;m=m/10;} return s; ---------------------- 第19题:约瑟夫问题 这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个 非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个 办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海, 如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。 答案: ---------------------- int i,j,k; j=30; /*j:指向已经处理完毕的数组元素,从link[i]指向的人开始计数*/ for(i=0;i<15;i++) /*i:已扔下海的人数计数器*/ { for(k=0;;) /*k:决定哪个人被扔下海的计数器*/ if(k<9) { j=link[j].nextp; /*修改指针,取下一个人*/ k+=link[j].no_out; /*进行计数。因已扔下海的人计标记为0*/ } else break; /*计数到15则停止计数*/ link[j].no_out=0; /*将标记置 0,表示该人已被扔下海*/ } ---------------------- 第20题:函数compare比较两个长度为N的数组是否相等(即 两数组中下标相同的数组元素均相等)。请完成该 函数。 答案:for(int index = 0; index < 200; index++) { if(a[index] != b[index]) { equal = false; break; } } 第21题: 已知某文本文件 in.txt 中存放有若干整数,请将其按照 从小到大的顺序排列后存入另一文件 out.dat。 你需要完成三个函数 1. void read_in (node* & p_head, char* s_file) 负责从某个文件 s_file 中读入,并存在以 p_head 为头部指针的链表中; 2. void sort(node* p_head) 将链表内的元素按照从小到大的顺序排序; 3. void write_out(node* p_head, char* s_file) 将链表中的元素依次写入到 s_file 中 (注意,写入的元素以回车分割)。 其中,链表节点结构 node 已经定义。 答案:void read_in(node* & p_head, char* s_file) { node * p_tail = p_head; ifstream inf(s_file,ios::in); int m; while(inf>>m) { node * p_new = new node; p_new->data =m; p_new->next = NULL; if(!p_head || !p_tail) { p_tail = p_head = p_new; } else { p_tail->next = p_new; p_tail=p_new; } } inf.close(); } void sort(node* p_head) { for(node * p_i = p_head; p_i;p_i=p_i->next) { node* p_k= p_i; for(node* p_j=p_i;p_j;p_j=p_j->next) if(p_j->data < p_k->data) p_k=p_j; int x = p_i->data; p_i->data = p_k->data; p_k->data = x; } } void write_out(node* p_head, char* s_file) { ofstream ouf(s_file,ios::out); for(node * p_cur = p_head; p_cur; p_cur=p_cur->next) { ouf< 第22题:一个首项大于0且等差大于0的等差数列前四项和为 26,前四项积为880。请写一个函数返回该数列的第 精品文档,知识共享! 20项的值。 提示:如果一个数列从第二项起,每一项与它的前一项的 差等于同一个常数,这个数列就叫做等差数列,这 个常数叫做等差数列的公差。如等差数列:1,3, 5,7,9,11。公差是2,该数列的第5项值是9。 答案:int myfun() { int a,b,c,d,flag; for(flag=1,a=0; flag && a<5;++a) for(d=1;flag && d<5;++d) { b=a+(a+d)+(a+2*d)+(a+3*d); c=a*(a+d) *(a+2*d)*(a+3*d); if(b==26&&c==880) { return a+19*d; } } return -1; } 第23题:打鱼还是晒网 中国有句俗语叫\三天打鱼两天晒网\。某人从1990年1月1日起开始 \三天打鱼两天晒网\,问这个人在以后的某一天中是\打鱼\还是\晒网\。 答案: ---------------------- for(year=1990;year 第24题:下面程序中的函数void ins(int a[], int len,int n); 将n插入到一个包含len个从小到大排好序的整数数组a中,插入 后保证数组的有序性。完成该函数的编写。例如: a) 调用ins(a, 0,3)后,数组a中为3 b) 调用ins(a, 1,2)后,数组a中为2,3 c) 调用ins(a, 2,6)后,数组a中为2,3,6 答案: int i; for (i=len;i>0;i--) { if (i>0 && a[i-1]>n) a[i] = a[i-1]; else break; } a[i] = n; 第25题:一个整数数列,它的第一项是0,第二项是1, 以后每项都是前两项之和,编写求前n项之和的函数GetSum(int n)。 答案:---------------------- int GetSum(int n) { int a1 = 0, a2 = 1; int sum = a1 + a2; for(int i=0; i sum += next; a1 = a2; a2 = next; } return sum; } ---------------------- 第26题:编写一个函数void changeString(char str[]);, 功能是把其中的大写字母变成小写字母,小写字母变成大写字母, 非字母的字符不作变换。变换结果依旧保存在str数组内。 大写字母的ASCII码值比对应的小写字母的ASCII码值小32, 如'A'的ASCII码值比'a'的ASCII码值小32。 答案:void changeString(char str[]) { for(int i=0; str[i] != '\\0'; i++) { if(str[i]>='a' && str[i]<='z') str[i] -= 32; else if(str[i]>='A' && str[i]<='Z') str[i] += 32; } } 第27题:编写一个函数,实现对一维数组的二分(折半) 查找算法。如找到,则返回其数组下标,否则返回-1。 二分查找的思想是:要查找的数据保存在数组中,并且 数据已经排好序(如从小到大递增)。查找时,每次比较 数组中间(用数组下标判断)那个数据,如果相等,则找到; 如果小于它,则在数组左半边按照相同的方式查找;如果大于它, 则在数组右半边按相同方式查找。 答案:int mid; while(true) { if(last < first) return -1; mid = (first+last)/2; if (key == sorted_array[mid]) return mid; if (key < sorted_array[mid]) // search the left half last = mid - 1; else // search the right half first = mid + 1; } 第28题:编写一个函数:将一个N进制数转换成M进制数(N和M在2到10进制之间), N进制数和M进制数均以字符串方式存储。 第29题:完成函数sofd,该函数计算一个数的各位数字之和 并返回,如sofd(252)返回9。 说明:sofd函数编写时只需考虑n大于等于0的情况,不用 处理负整数的情况。 答案: int m,s = 0; while(n!=0) { m=n; s+=m; n=n/10; } return s; 第30题:请编写一段代码,求出给定正整数s的所有因子, 并按从小到大的顺序存放在数组factor中。 例如:24的因子是1、2、3、4、6、8和12,因子个数是7。 答案: for(int j=1;j<=s/2;j++) { if(s%j==0) { factor[count]=j; count++; } } 第31题:请编写函数int find(int n),判断整数n是否满足 下面的条件:n加上100后是一个完全平方数,n再 加上168又是一个完全平方数。若满足条件,函数 返回整数n;否则返回0。 说明:如果一个整数n是另一个整数的平方,则称整数n是 完全平方数。例如81是9的平方,则81是完全平方数。 答案: int x,y, result; result=0; x=sqrt(n+100); /*x为n加上100后开方后的结果*/ y=sqrt(n+268); /*y为n再加上168后开方后的结果*/ if(x*x==n+100 && y*y==n+268) result = n; return result; 第32题:给定一组十进制正整数,请统计各个正整数的各位 数字中0的个数。数据保存在f1.txt文件中,要求编写 计算0的个数的函数countZero。 答案:if(num == 0) return 1; while(num != 0) { digi = num % 10; if(0 == digi) count += 1; num = (num - digi) / 10; } return count; 第33题: 用“辗转相除方法”计算两个数 x,y 的最大公约 数 答案:---------------------- n=x%y; while(n!=0) {x=y;y=n;n=x%y;} ---------------------- 第34题:请编写函数 int occ_num(int a[], int x, int len) 计算整数 x 在数组 a 中出现的次数,其中 len 为数组a的长度。 答案: ---------------------- int m =0; for(int i=0;i 精品文档,知识共享! return m; ---------------------- 第35题: 编写函数 reverse, 对给定的10个数置逆序排列. 答案: for(i=0;i 第36题:下面程序中的函数void conv(char *s);将字符串s中 的所有字符逆序存放,例如s中为”abc”时,调用该函数后 s中的字符串变为”cba”,完成该函数。 答案: int len = strlen(s), j; for (j=0;j 第37题:写一个函数myfun,计算x的n次方并将结果返回。 -答案: long x1=1; while(n>0) { x1=x1*x; n--; } return x1; 第38题:函数void sort(char a[][100], int len);对二维 字符数组中的字符串按字典顺序从小到大排序,编 写该函数。 答案:char ch[100]; int i,j; bool flag=1; for(i=0;i flag=0; for(j=0;j if(strcmp(a[j],a[j+1])>0) { strcpy(ch,a[j]); strcpy(a[j],a[j+1]); strcpy(a[j+1],ch); flag=1; } } ---------------------- int i,j,k; for(i=0;i char temp[100]; strcpy(temp,array[i]); strcpy(array[i],array[k]); strcpy(array[k],temp); } } 第39题:部分源程序给出如下。请勿改动主函数main和其它 函数中的任何内容,仅在函数的花括号中填入所编 写的若干语句。 答案:---------------------- for(i=0;i<200;i++) { for(j=0;j<200;j++) { if(arr[j+1]>arr[j]) { k=arr[j+1]; arr[j+1]=arr[j]; arr[j]=k; } } } ---------------------- 第40题: 编写函数sum7s(int n), 该函数的功能是求1到 n之间(含n)所有7的倍数之和。若n小于7,则 返回0。 答案:int sum7s(int n) { int sum = 0; for(int i=7; i<=n; i+=7) sum += i; return sum; } 第41题:编写程序,求一个 3 ╳ 5阶矩阵 a 与其自身转置矩阵 c 的乘积, 结果存入数组 b 中。 答案: for(i=0;i<3;i++) for(j=0;j<5;j++) c[j][i]=a[i][j]; for(i=0;i<3;i++) for(j=0;j<3;j++) { for(int k=0;k<5;k++) b[i][j]+=a[i][k]*c[k][j]; } 第42题:有一群士兵,人数不超过n。孙子将其按照一行3人 排队,余2人;按照一行5人排队,余1人;按照一 行7人排队,刚好排成若干行。编写函数myArmy()来 计算士兵的人数。(提示:可以采用穷举法求解。) 答案:for (c=1; c<=n; c++) if ((c%3==2) && (c%5==1) && (c%7==0)) return; 第43题: 编写一个函数trans,将传入此函数的直角坐标值 转换为极坐标值(求极坐标的公式如图所示),并 返回主调函数中,要求两值均以指针参数带回。 答案: float x, y; x = *c; y = *q; *c = (float)sqrt(x*x + y*y); *q = (float)atan(y/x); 第44题:定义人民币类IntRMB,数据成员包括:圆(IYuan)、角(Jiao)、分(Fen),均为整型。 类型转换函数将人民币类强制转换为浮点数,以圆为单位。 参考:内置数据类型可以进行类型强制转换,类也可以进行同样的转换,这是通过定义类型 转换函数实现的。它只能是类的成员函数,不能是友元函数。 格式为:类名::operator 转换后的数据类型( ) {…} 如:operator float()是转换为浮点数的成员函数。 使用时的格式为:float(对象名); 或 (float) 对象名; 答案:class IntRMB{ //人民币类 private: int IYuan; int Jiao; int Fen; public: IntRMB(int y=0,int j=0,int f=0); //构造函数 void print(); //数据输出函数 operator float(); //浮点数类型转换函数 }; IntRMB::IntRMB(int y,int j,int f){//构造函数 IYuan=y; Jiao=j; Fen=f; } IntRMB::operator float(){ float temp; temp=float(IYuan + (Jiao/10.0) + (Fen/100.0)); return temp; } void IntRMB::print(){ cout < 第45题:阶乘尾数零的个数 100!的尾数有多少个零? 答案:---------------------- for(i=5;i<=100;i+=5) { ++count; if(!(i%)) ++count; } ---------------------- 第46题:编写一个以任意两点之间距离作为返回值的函数 double distance(Point point1, Point point2)。 注:计算距离会使用求平方根,它的函数原型是double sqrt(double v)。 答案:double distance(Point point1, Point point2) { return sqrt((point1.x-point2.x) * (point1.x-point2.x) + (point1.y-point2.y) * (point1.y-point2.y) + (point1.z-point2.z) * (point1.z-point2.z)); } 第47题: 求多项式 1!+2!+3!+……+10!的值存入变量 out 中. 答案:---------------------- for (int i=1; i<=10; i++) { 精品文档,知识共享! n = n*i; s += n; } cout < ---------------------- 第48题:某个公司采用公用电话传递数据,数据是四位的整 数,在传递过程中是加密的。加密规则如下:每位 数字都加上5,然后用和除以10的余数代替该数字, 再将第一位和第四位交换,第二位和第三位交换 。 写一个函数实现这个算法,函数原型是 int changeinfo(int info) 答案:int changeinfo(int info) { int a[4]; a[0]=info; a[1]=info0/10; a[2]=info00/100; a[3]=info/1000; for(int i=0;i<=3;i++) { a[i]+=5;a[i]%=10;} for( i=0;i<=3/2;i++) { int t=a[i]; a[i]=a[3-i]; a[3-i]=t; } return a[0]+a[1]*10+a[2]*100+a[3]*1000; } 第49题:编写函数borrow,实现下述功能:小明有五本新书,要借 给A,B,C三位小朋友,若每人每次只能借一本,则可以有 多少种不同的借法?要求将计算出的结果返回。 答案:---------------------- int a,b,c,count=0; for(a=1;a<=5;a++) for(b=1;b<=5;b++) for(c=1;a!=b&&c<=5;c++) if(c!=a&&c!=b) count++; return count; ---------------------- 第50题: 判断一个数是否是素数(要求程序中设置一个参 数flag,flag为1代表是素数,为0代表不是) 答案:for(n=2;n<=m/2&&flag;n++) if(m%n==0) flag=0; cout< img表示其虚部。函数add实现两个复数one和two 的加,并返回结果;函数mul实现两个复数one和 two的乘,并返回结果。请完成这两个函数。 答案: temp.real=one.real+two.real; temp.img=one.img+two.img; temp.real=one.real*two.real-one.img*two.img; temp.img=one.real*two.img+one.img*two.real; 第52题: 找出1-200之间的完数个数 n (完数是一个数的因 子之和是这个数本身。例如6=1+2+3)。 答案:---------------------- n=0; for(m=1;m<=200;m++) {s=1; for(l=2;l if(m==s){n++;cout< 第53题:将100元换成用10元、5元和1元的组合,共有多少种组合方法。 答案: int i,j,k,count=0; for(i=0;i<=10;i++)//i是10元张数,j是5元张数,k是1元张数 for(j=0;j<=20;j++){ k=100-10*i-5*j; if(k>=0){ cout< 第54题:下面的函数swap先将数组a中最大的数和a[0]交换, 然后再将其中次大的数和a[1]交换,参数len(>2) 是a中数组元素的个数。完成该函数的编写。 答案: int max,i,t,m; max=a[0]; for(i=1;i 运行结果如样张所示。 答案:void PrintDiagram(int m){ int i ; cout<<'|'< } cout<<'|'< 第56题:创建一个整形数据的线性链表,对线性链表中的整 形数据进行排序,然后向线性链表中插入一个元素, 然后输入一个数找出该数是线性链表中第几个元素, 最后删除整个线性链表。 答案:for(int i=2;i<=len;i++) { p1=new node; cout<<\请输入一个整数\ cin>>p1->num; p2->next=p1; p2=p1; } p2->next=NULL; for(p1=head;p1!=NULL;p1=p1->next) { p=p1; for(p2=p1->next;p2!=NULL;p2=p2->next) if(p2->num>p->num) p=p2; if(p!=p1) { int temp; temp=p->num; p->num=p1->num; p1->num=temp; } } p1=p2=head; for(p1=head;p1->num>pnode->num&&p1->next!=NULL;p1=p1->next) p2=p1; if(p1->next==NULL) { p1->next=pnode; pnode->next=NULL; } else { if(p1==head) { pnode->next=p1; head=pnode; } else { pnode->next=p1; p2->next=pnode; } } for(p1=head;p1!=NULL;p1=p1->next) { if(p1->num==key) break; i++; } while(p1!=NULL) { p2=p1; 精品文档,知识共享! p1=p1->next; delete p2; } 第57题:某个公司采用公用电话传递数据, 数据是四位的整数,在传递过程中是加密的, 加密规则如下:每位数字都加上5, 然后用和除以10的余数代替该数字, 再将第一位和第四位交换, 第二位和第三位交换 。 写一个函数实现这个算法, 函数原型是 int changeinfo(int info) 答案:int changeinfo(int info) { int a[4]; a[0]=info; a[1]=info0/10; a[2]=info00/100; a[3]=info/1000; for(int i=0;i<=3;i++) { a[i]+=5;a[i]%=10;} for( i=0;i<=3/2;i++) { int t=a[i]; a[i]=a[3-i]; a[3-i]=t; } return a[0]+a[1]*10+a[2]*100+a[3]*1000; } 第58题:用迭代法求a的平方根,求平方根的迭代公式如下 所示: x(0)=1; x(n+1)=1/2(x(n)+a/x(n)) (n>=0) 要求前后两次求出的x的差的绝对值小于0.00005.。 答案:while(fabs(y-x)>1.0e-5) { x=y; y=1/2.0*(x+a/x); } 第59题: 编写一个函数 int day_of_month(int year, int month) 输入年(year)、月(month),打印出该年份该月的天数。 (若输入数据不合法,要求返回值为0) 公历闰年的计算方法为: i) 能被4整除且不能被100整除的为闰年; 或者 ii) 能被400整除的是闰年。 答案:switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: