C++-题库186道题(简缩) 下载本文

精品文档,知识共享!

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; imax) max=a[i]; if(a[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<data<

第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;i0) k=j; } if(k!=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;imax) { max=a[i]; m=i; } } t=a[0]; a[0]=a[m]; a[m]=t; max=a[1]; for(i=2;imax) { max=a[i]; m=i; } } t=a[1]; a[1]=a[m]; a[m]=t; 第55题:题目:设计函数PrintDiagram(m)打印直方图,直方图宽度为3行,每列代表数据1%。

运行结果如样张所示。

答案: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: