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

内容发布更新时间 : 2024/12/23 7:57:20星期一 下面是文章的全部内容请认真阅读。

前十行拷贝到一个新的文件(a.txt)中。

参数:sfile为输入源文件,dfile为目标文件。

答案:void copy(fstream &sfile,fstream &dfile){ int line=0; char buf[256]; while(sfile.getline(buf,256),sfile.eof()!=1&&line<10){//按行拷贝 A行 if(sfile.rdstate()==0) { dfile<

第116题: 已知10个数求最大值及最小值以及它们的差。例如

输入8,92,7,8,1,56,37,23,25,26则输出

max=92,min=1,ca=91。 答案:---------------------- max=min=a[0]; for(i=0;i<10;i++)

{if(a[i]>max)max=a[i]; if(a[i]

----------------------

第117题: 编写一个函数,统计出一维数组中

大于等于所有元素平均值的元素个数并返回它。

答案:---------------------- double m=0; int i; for(i=0;i=m) c++; return c;

----------------------

第118题: 将从文件输入的10个数按降序排列

答案:---------------------- for(i=0;i<9;i++) for(j= i+1;j<10;j++) if(n[i]

int cap_count(char* s)

返回输入字符串 s 中大写字母的个数。

答案: int c=0; while(*s) { if(*s>='A' && *s<='Z') c++; s++; }

return c;

第120题:函数char *dels(char *s, char *c);去掉字符串s

中的子字符串c,并将新得到的字符串返回,完成

该函数(不考虑去掉子字符串c后形成的新的子字

符串c)。例如s为”abcabcd”,c为”bc”,则调

用该函数后,s为”aad”。 答案: while(*psrc) {

p=psrc; psub=sub;

while(*p && *p == *psub) {

p++; psub++; }

if(*psub == '\\0')//找到一个子串 psrc = p; else

*pdest++ = *psrc++; }

*pdest = '\\0';

第121题:下面的函数aver计算数组a中所有正数的平均值并返

回。参数len是数组a中元素个数。完成该函数的编写。 答案: float res=0; int n=0; for(int j=0;j0) { n++; res+=a[j]; } } res/=n; return res;

第122题:编程定义一个整型(ival及指针(*ip)、一个双精度型(dval)及指针(*dp)、一个字符

型(cval)及指针及指针(*cp),并赋初值(100,99.9.'A'),然后显示各指针所指目标

的值与地址,各指针的值与指针本身的地址及各指针所占字节数(长度)。 *其中地址用十六进制显示。

注意:1.输出结果参照样张图片。

2.属性、操作名称与题目保持一致。 答案: int *ip,ival=100; double *dp,dval=99.9; char *cp,cval='A'; ip=&ival; dp=&dval; cp=&cval; cout<<*ip<<'\\t'<<&*ip<<'\\t'<

精品文档,知识共享!

cout<<(void*)cp<<'\\t'<<&cp<<'\\t'<

的个数,并分别保存在全局变量Supper和Low中。 答案: int i=0;

while (input[i]!='\\0') {

if(input[i]<='Z' &&input[i] >='A')

Supper++; if (input[i]<='z' &&input[i] >='a')

Low++; i++; } 第124题:猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了

前一天剩下的一半多一个,到第n天吃以前发现只剩下一个桃子,

要求编写函数GetNumber(int n)求出猴子共摘了几个桃子。

答案:int GetNumber(int n) { int number = 1; for(int i=n-1; i>0; i--) { number = (number+1)*2; } return number; }

第125题:完成函数days,计算某个日期在这一年中是第几天。如

1989年1月8是这一年的第8天。闰年判断条件:年份是4

的倍数且不是100的倍数,或者年份是400的倍数。

答案: int num=day.day; static int day_tab[2][13]= {{0,31,28,31,30,31,30,31,31,30,31,30,31,}, {0,31,29,31,30,31,30,31,31,30,31,30,31,},}; int i,lp; lp=(day.year%4==0 &&

day.year0!=0 || day.year@0==0); for(i=1;i

于或大于400000为止。请输出n的值、参与累加的奇数个数,

以及参与运算的最大的那个奇数。

答案:---------------------- for(odd=1; odd <= 100000 && sum < 400000; odd+=2) { count += 1; sum += odd; } odd-=2;

---------------------- 第127题: 请编写函数

int num_of_facs(int n); 计算一个正整数 n 的因子个数(包括1和自身)。 答案:

---------------------- int m =0;

for(int i=1;i

return m;

---------------------- 第128题:试编写一个判断6位密码是否正确的函数codec,

若密码正确返回1,密码不正确返回0,出现错误返回-1。

密码规则是:第i位数字是第i-1位数字加1后的3次方的个位数(2<=i<=6)。 比如:密码272727中第2位的'7'是第1位的'2'加1后的3次方的个位数 ((2+1)的3次方为27,其个位数为7),第3位的'2'是第2位的'7'加1后的3次方

的个位数((7+1)的3次方为512,其个位数为2),以此类推。 答案: if (result != -1) for (i=1; i<6; i++) if

(a[i]!=((a[i-1]+1)*(a[i-1]+1)*(a[i-1]+1))) result =0;

第129题:在包含10个数的一维整数数组a中查找给定的数据num。

如果找到则返回1,未找到返回 0 . 答案: for (int i=0; i<10; i++) if (a[i]==num) return 1; return 0;

第130题:写一个实现如样张所示的函数 答案:int myfun(int x) {

if(x>100) return x+10; if(x<-10) return -x+10; return 0; }

第131题: 完成函数sofp的编写,该函数计算n以内(不包含n)

的所有素数之和并返回。 答案: int i, sum=0, k; for(i=2; i

第132题:编写函数addto,求一个10*10的二维整型数组中所

有偶数的和,并返回结果。 答案: for(int i=0; i

并分别保存在全局变量Supper和Low中 答案: int i=0; while (input[i]!='\\0') { if(input[i]<='Z' &&input[i] >='A') Supper++; if (input[i]<='z' &&input[i] >='a')

Low++; i++; } 第134题:在一维数组中分类统计正数和负数的个数。

正数的个数存入变量C1中,负数个数存入变量C2中.

答案:---------------------- for (i=0; i<10; i++) if (a[i]>0) c1++;

else if (a[i]<0) c2++; ---------------------- 第135题: 利用选择法将10个数按降序排列

答案:---------------------- for(i=0;i<9;i++) {k=i;

for(j=i+1;j<10;j++) if(n[k]

t=n[i];n[i]=n[k];n[k]=t;} ----------------------

第136题:在一笼子里,鸡和兔的个数共m只,脚有n只,编写

函数myChicken来计算鸡和兔各多少只?计算结果

存放在参数c(鸡的只数)和r(兔的只数)中。

答案: for (c=0; c<=m; c++){ r = m - c; if ((c*2+r*4)==n) break; }

第137题:编写函数sumOfPrimes(int N),功能是求1至N之间

(含N)的所有素数的和并返回。素数是只能被1和自 己整除的数。

答案:bool IsPrime(int s) { if(s<2) return false; for(int j=2; j

int sumOfPrimes(int N) { int sum = 0; for(int i=2; i<=N; i++) if(IsPrime(i)) { sum += i; } return sum; }

第138题: 求具有10个数的数组中的最大值和次最大值,并

把最大值和a[0]中的数对调,次最大数和a[1]中

的数对调。

答案:---------------------- max=a[0]; cmax=a[1];

for(i=1;i<10;i++) if(a[i]>max) {max=a[i]; m=i;} t=a[0]; a[0]=a[m]; a[m]=t;

精品文档,知识共享!

for(j=2;j<10;j++) if(a[j]>cmax) {cmax=a[j]; n=j;} l=a[1]; a[1]=a[n]; a[n]=l;

----------------------

第139题:将1元钱换成1分、2分、5分的硬币,问共有多少种

换法?请将结果存入变量count。 答案: int i,j,k; for(i=0;i<=100;i++) for(j=0;j<=100;j++) for(k=0;k<=100;k++) if(i+j*2+k*5==100) { count++; cout<

答案: for (j=0;j<5;j++) { float m=0; for (i=0;i<4;i++) m+=s[i][j]; m = m/4; ave[j] = m; }

第141题:编写函数int atoi(char s[ ]),将字符串s转化为整型数返回。 注意负数处理方法。

提示:用指针处理字符串非常方便。使用符号位来处理负数。

答案:int atoi(char s[]){ int temp=0,f=1,i=0; while(s[i]!='\\0'&&s[i]!='-'&&(s[i]<'0'||s[i]>'9')) i++;//去除串前部无效字符 if(s[i]=='-'){//读负号 f=-1; i++; } if(s[i]<'0'||s[i]>'9')

cout<<\串非法时,输出提示,返回0 while(s[i]>='0'&&s[i]<='9'){//转换数字串 temp=temp*10+s[i]-48; i++; } return f*temp; }

第142题:3025这个数具有一种独特的性质:将它平分为二段,即30

和25,使之相加后求平方,即(30+25)*(30+25),恰好等于 3025本身。

要求:完成函数valid,该函数判断n是否是满足abcd=(ab+cd)*

(ab+cd)这样性质的四位数,是则返回true,否则返回 false。

答案: int a,b; a=n/100; b=n0; if((a+b)*(a+b)==n) return true;

return false; 第143题:一个长度不超过255的字符串前后各有若干个无用

的空格,编写函数stringBlank,将该字符串前后

的无用空格去除。

说明:允许字符串之间出现空格。 答案: char *p = str; while ( *p == ' ' ) p++; strcpy(str, p); p = str + strlen(str) - 1 ; while ( *p == ' ' ) p--; *(p+1) = '\\0';

第144题:编写一个函数indexOf,判断字符串s1是否是字

符串s2的子串。如果s1是s2的子串,函数

返回第一次匹配处的下标;否则,返回-1。

答案: for(int i=0; *(s2+i); i++) { for(int j=0; *(s1+j); j++) if ( *(s2+i+j) != *(s1+j) ) break; if (j == strlen(s1)) return i; } return -1; 第145题:求最大数

问555555的约数中最大的三位数是多少? 答案:---------------------- for(i=999;i>=100;i--) if(n%i==0) { break; }

----------------------

第146题:填写适当的代码,使得myMax()完成正确的功能。

函数myMax(int a[ ], int c)返回整数数组a中

最大值所在的下标值(如果有多个相同的最大值,

则返回最前面一次最大值的下标值),c为数组元 素的个数。

答案: int i=0, m=a[0]; for (i=1; i

start到finish之间的元素进行排序。

说明:快速排序的思想是先以数组中的某个数为基准,将

数组中所有小于该数的数放于数组左边,而所有大于

该数的数放于数组右边,所选的某个数放于这两种数

中间(程序中Partition函数的作用),然后对划分后

的左半边数组和右半边数组用同样的方式处理。

答案:int boundary = Partition(vec, start, finish);

Quicksort(vec, start, boundary - 1);

Quicksort(vec, boundary + 1, finish);

第148题:请编写函数

void sort(int a[], int len) 将数组a 中的元素从小到大进行排列。

答案:for(int i=0;i

int k=i;

for(int j=i;j

第149题:编写一个递归函数,计算下面的级数:

m(k) = 1 + 1/2 +1/3 +… + 1/k (k>=1)。

答案: double result = 0.0; if (k==1) result = 1; else result = 1.0/k + m(k-1); return result; 第150题:从若干学生成绩中统计高于平均分的人数k,用-1

做为学生成绩数据的结束标志(说明:数组cj表示 学生成绩)。

答案:---------------------- while(cj[n]>=0) {sum+=cj[n]; n++;} aver=sum/n;

for(i=0;iaver) k++; cout<

----------------------

第151题:针对程序中构造的单向动态链表,请编写函数append,

根据stud内容创建新的结点,并附加到头为head的 链表末尾。

答案: node *p1, *p2; p1 = head; while(p1->next != NULL) p1 = p1->next; p2 = new node; p2->age = stud.age; strcpy(p2->name, stud.name); p2->num = stud.num; p2->sex = stud.sex; p2->next = NULL; p1->next = p2; 第152题:设计函数int digit(int num,int k);返回整数

num从右边开始的第k位数字的值。要求:num位数小于10位。 例如:digit(4647,3)=6 digit(23523,7)=0 答案:int digit(int num, int k) { for (int i=0;i

第153题:函数myLen(int n)返回整数n的位数。例如345的位

数是3。填写适当的代码,使得myLen()完成正确的 功能。

精品文档,知识共享!

答案:int c=0; while (n>0) { n = n / 10; c++; } return c;

第154题:定义递归函数Acm(m,n)实现如下图所示的Ackman函数,其中m、n为正整数。

例如:Acm(2,1)=5,Acm(3,2)=29。 / n+1 ,m=0 |

Ackman(m,n)=| Ackman(m-1,1) ,n=0 | \\

Ackman(m-1,Ackman(m,n-1)), m>0,n>0 -答案:int Acm(int m,int n){ if(m==0) return n+1; if(n==0) return Acm(m-1,1); return Acm(m-1,Acm(m,n-1)); }

第155题: 请编写函数 int strlen(char*s)

统计字符串s的长度,返回字符串s的长度。

(不允许调用标准库函数)

答案:

---------------------- int m=0;

while(*(s+m)) m++; return m;

----------------------

第156题:在包含10个数的一维整数数组a中查找最大元素max 和最小元素min。

答案:---------------------- max=a[0]; min=a[0];

for (i=1; i<10; i++){

if (a[i]>max) max=a[i]; if (a[i]

----------------------

第157题:文本文件\中有一组整数,要求排序后输出到

另一个文件\中(整数以空格相间隔)。

-答案: fstream infile, outfile; int array[200]; int count; //打开输入文件,若打开出错,则返回-1 infile.open(\ if (!infile) return -1; //从输入文件数据并记数 count = 0; while (!infile.eof()){ infile >> array[count]; count++; } infile.close(); if (count!=0){ select_sort(array, count); //将排序后数据输出到文件\ outfile.open(\

ios::out); for (int i=0; i

第158题: 定义函数mymult(int m),已知一个正整数m,求m的各位数字之积 f 。

答案:---------------------- void mymult(int m) { while( m!=0) {n=m;f*=n;m=m/10;} }

---------------------- 第159题:编写一段程序,计算输入流input中第一个$之前的

字符数目,存入count变量。 答案:while (input.get(ch) && ch != '$') count++;

第160题:求200000以内的自守数。 要求编写函数selfhold,判断一个数是否是一个自守数,

若是,则返回1,否则返回0。

自守数是指一个数的平方的尾数等于该数自身的自然数。例如: 25*25=625 76*76=5776 9376*9376=87909376 答案:

---------------------- long mul,k,ll,kk; /*由number的位数确定截取数字进行乘法时的系数k*/ for(mul=number,k=1;(mul/=10)>0;k*=10); kk=k*10; /*kk为截取部分积时的系数*/ mul=0; /*积的最后n位*/ ll=10; /*ll为截取乘数相应位时的系数*/ while(k>0) { mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk; /*(部分积+截取被乘数的后N位*截取乘数的第M位),%kk再截取部分积*/ k/=10; /*k为截取被乘数时的系数*/ ll*=10; } if(number==mul) /*判断若为自守数则输出*/ return 1; else return 0;

----------------------

第161题:函数void encrypt(char * info);将info指向的字符串译成密码,密码规律是:

用原来的字母后面第4个字母代替原来的字母。例如,字母\后面第4个字母是\,用\

代替\。因此,\应译为\,若该字母后面的第4个字母超过Z,则回到\。

例如 \后面的第4个字母是\。 完成函数encrypt的编写。 答案: do{ if((*info>='a' && *info<='v') || (*info>='A' && *info<='V')) *info+=4; else *info-=22; info++; }while(*info); 第162题:文件\中存放了若干字符。函数int

tongji(int &n)是统计文件\中数字和字

母的个数。将字母个数存入到n中,数字的个数作为

函数值返回。请实现该函数。 答案: fstream infile; char str[100]; int i, letterCount=0, digitCount=0; infile.open(\ios::in); if (!infile){ return -1; //若文件打开出错,返回-1 } infile >> str; i = 0; while (*(str+i)!='\\0') { if ((*(str+i)>='A' &&

*(str+i)<='Z') || (*(str+i)>='a' && *(str+i)<='z')) letterCount++; if (*(str+i)>='0' && *(str+i)<='9') digitCount++; i++; } n = letterCount; return digitCount;

第163题:编写一个函数 instring,该函数的原型为:

bool instring(char c, char *str);

其功能是判断字符c是否在字符串str中出现。

例如,函数调用instring

('a',\)的返回值应为true。 答案:

----------------------

bool instring(char c, char *str) { while(*str++) if (*str==c) return true; return false; }

----------------------

第164题:编写函数求文件中一系列整数的和。假设第一个读取的整数指定后面要输入的数值

的个数。典型的输入序列如下:5 100 200 300 400 500。

数据已经在文件in.txt中,编写函数读取并计算。

答案: int summ=0,i,j,count; fstream infile;

infile.open(\ infile>>count; for(j=0;j

infile>>i;

精品文档,知识共享!

summ += i; } infile.close(); return summ;

第165题:将运行结果(Fibonacii数列的前20项)存入文件 myfile2_17.txt, 要求每行输出5个数据。再将文件结果输出到标准输出设备。

答案: long fib0=0,fib1=1,fib2,n; ofstream ofile(\ ofile<

第166题:从键盘输入一个正整数n,该正整数可以分解成两个正整数k1 和k2之和(允许k1和k2相等)。请编写一个函数求使两个正

整数的乘积最大的分解方案,并返回乘积max。 答案:

---------------------- int i,max; max = 1*(n-1); for(i=2;imax) { max = i*(n-i); }

----------------------

第167题:编写函数myfun,实现如样张所示的函数计算,计算

结果作为返回值返回。 答案:int myfun(int x) { if(x>100) return x+10; if(x<-10) return -x+10; return 0; }

第168题:写一个函数,计算x的n次方。 函数原型是long myfun(int x,int n) 答案: int x1=1; while(n>0) { x1=x1*x; n--; }

return x1; 第169题:完成函数isjishu的编写,该函数判断n是否是奇数,

是则返回true,否则返回false。 答案: if (n%2) return true; return false;

第170题:设计一个函数GCD,求两个数 m 和 n的最大公约数(假设 m>n>0) 。 答案:int k= m%n; while (k) {

m=n; n=k; k=m%n; }

return n; }

第171题:编写函数fun,将字符串s中所有小写字母改写成

大写字母,其它字符保持不变。 答案: for (int i=0; i='a' && s[i]<='z') s[i]=s[i]-'a'+'A';

第172题:编写求员工工资的函数double getSalary(double hours),

参数hours是累计工作小时数,函数返回工资金额(单位为元)。 工资的计算规则如下:工作时间小于等于8小时,25元/小时; 超过8小时,前面8小时25元/小时,超过部分35元/小时;

超过16小时,前面8小时25元/小时,8小时~16小时(含)部分35元/小时,

超过16小时部分55元/小时。 答案:double getSalary(double hours) { double sf = 0; if(hours<0) sf = 0; else if(hours <= 8) sf = hours * 25; else if(hours <=16) sf = 8 * 25 + (hours - 8) * 35; else sf = 8 * 25 + 8 * 35 + (hours - 16) * 55; return sf; }

第173题:编写一个函数f2c,功能是据华式温度求摄氏温度。

求解公式是C=5*(F-32)/9,其中F为华氏温度,C为摄氏温度。 答案:double f2c(double f) { return 5*(f-32)/9; }

第174题: 编写一个函数void SelectSort (int a[ ],int n),

采用选择排序的方法按升序排列数组a中的n个元素。

答案:---------------------- int i,j,k;

for (i=1;i

for (j=i;j

x=a[i-1];a[i-1]=a[k];a[k]=x; }

---------------------- 第175题: 打印水仙花数个数 n (水仙花数是三位数,每

位数字的立方和等于这个数本身示例见图1)。

答案:---------------------- for(m=100;m<=999;m++) {a=m/100; b=m0/10; c=m0; if(m==a*a*a+b*b*b+c*c*c) {cout<

----------------------

第176题:编写程序求出二维数组中的鞍点。所谓鞍点是指一个矩阵元素的值在其所在行中

最大,在所在列中最小(设矩阵各元素值互不相同)。

由文件读入10乘10的数组,结果放在数组s1,s2中,

表示a[s1[i]][s2[i]]是一个鞍点,并按行升序排列。

答案: int count=0,flag; for(int i=0;i<10;i++) {int ptr=0;

for(int j=1;j<10;j++) {

if(a[i][j]>a[i][ptr]) ptr=j; }

flag=1;

for(int k=0;k<10;k++) {

if(a[k][ptr]

if(flag==1) {

s1[count]=i; s2[count]=ptr; count++; } }

return count;

第177题:程序中的函数inv对数组m中的数据进行翻转转换,

即将数组中第一个数和最后一个数交换、第二个数

和倒数第二个数交换,依此类推。 答案: for (int i=0;i

第178题:编写函数void myfun(int a[3][5],int max[5]), 该函数的功能是:计算数组a的每列元素的最大值,

并将第i列最大值存入数组max相应的第i个元素。

答案: int i,j; for (i=0;i<5;i++){ max[i]=a[0][i]; for(j=1;j<3;j++) if(a[j][i]>max[i]) max[i]=a[j][i]; }

第179题:编写函数 char *itoa (int n,char *string);将整数n转换为十进制表示的字符串。

注意:1.输出结果参照样张图片。

2.属性、操作名称与题目保持一致。 答案:char *itoa (int n,char *string) { char *temp=string; if(n<0){ *temp++='-'; n=-n; } int len=0,tmp = n; while(tmp>0) { tmp=tmp/10; len++; } temp += len;

精品文档,知识共享!

*temp = '\\0'; temp--; do{ *temp=n+48; temp--; }while(n=n/10); return string;

}

第180题: 定义函数mymult(int m),找出1 m之中满足除以3余2,除以5余3, 除以7余2的最大整数。(m>50) 答案:int mymult(int m) { int i,max=1; for(i=1;i<=m;i++) if((i%3==2)&&(i%5==3)&&(i%7==2)) { max=i; } return max; }

第181题:程序中的函数tax计算个人所得税,根据工资m返回其应征的税款。 个人所得税率表如下: 月收入1200元起征,

超过起征点1000元(含)以内,超过1200元的部分按5%征税;

超过起征点3000元(含)以内,超过1200元的部分按10%征税;

超过起征点5000元(含)以内,超过1200元的部分按15%征税;

超过起征点10000元(含)以内,超过1200元的部分按20%征税;

超过起征点10000元以上的,超过1200元的部分按30%征税。

答案: double result=0; if (m<=1200) result=0; else if (m<=1200+1000) result=(m-1200)*0.05; else if (m<=1200+3000) result=(m-1200)*0.1; else if (m<=1200+5000) result=(m-1200)*0.15; else if (m<=1200+10000) result=(m-1200)*0.2; else if (m>1200+10000) result=(m-1200)*0.3; return result;

第182题:下面的函数count统计m和n(m和n都是3位数)之间(包含m 和n本身)有多少个数其各位数字之和是5,并将统计结果 返回。

答案: int i,num=0;; for(i=m;i<=n;i++) if((i+i/10+i/100)==5) { num++; } return num;

(结束)