经典C语言编程(20题)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.请编写一个函数fun,其功能是:删除字符串中的数字字符。

例如,输入字符串为:48CTYP9R6,则输出:CTYPR。

部分源程序已经给出,请勿改动主函数的内容。

main()
{ char item[100];
gtes(item);
fun(item);
printf(“The string:%s\n”,item);
}
解答:
#include<stdio.h>
#include<string.h>
void fun(char s[])
{int i,j;
for(i=j=0;s[i]!='\0';i++)
if(s[i]>='0' && s[i]<='9') i++;
else
s[j++]=s[i]; s[j]='\0';
}
main()
{ char item[100];
gets(item);
fun(item);
printf("The string:%s\n",item); }
2. 从键盘上读入一字符串存入字符数组xx中,请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应位置上,最后调用函数WriteDat()将结果xx输出。

替代关系如下:
f(p)=p*11%256
其中,p是数组xx中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符的ASCII值是偶数或计算后f(p)值小于32,则该字符不变,否则用f(p)所对应的字符进行替代。

设字符串的长度小于80个字符,部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{ char xx[80];
gets(xx);
encryptChar();
WriteDat();
}
解答:
#include<stdio.h>
#include<string.h>
void encryptChar(char a[]) {int i,j;
for(i=j=0;a[i]!='\0';i++) if(a[i]%2==0 ||
(a[i]*11%256<32))
a[j++]=a[i];
else
a[j++]=a[i]*11%256; } WriteDat(char a[]) {puts(a);}
main()
{ char xx[80];
gets(xx);
encryptChar(xx); WriteDat(xx);
} _
3. 设有数组:int a[10]={6012,5099,9012,7025,8088,9096,8080,3046,5082,2345};
请编制函数jssort(),其功能是:要求按每个数的后三位的大小进行升序排序,然后调用函数WriteDat()将结果输出。

部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{ int a[10]={6012,5099,9012,7025,8088,9096,8080,3046,5082,2345};
jssort();
WriteDat();
}
解答:
#include<stdio.h>
void jssort(int b[])
{int i,j,min,t;
for(i=0;i<9;i++)
{min=i;
for(j=i+1;j<10;j++)
if(b[min]%1000>b[j]%1000) min=j;
if(min!=i)
{t=b[min];b[min]=b[i];b[i]=t;} }
}
void WriteDat(int b[]) {int i;
for(i=0;i<10;i++)
printf("%6d",b[i]);
printf("\n");
}
main()
{int
a[10]={6012,5099,9012,7025,8088, 9096,8080,3046,5082,2345};
jssort(a);
WriteDat(a);
}
_
4. 编写一函数jsValue(int m, int k, int xx[]),该函数的功能是:将大于整数m且紧靠m 的k个素数存入数组xx并返回。

然后调用函数WriteDat()将结果输出。

部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{ int m,n,zz[100];
scanf(“%d%d”,&m,&n);
jsValue(m,n,zz);
WriteDat ( )
}
解答:
#include<stdio.h>
#include<math.h>
int j=0;
void jsValue(int m,int k,int xx[]) {int num,i,n;
for(num=m+1;num<=m+k;num++)
{n=sqrt(num);
for(i=2;i<=n;i++)
if(num%i==0) break;
if(i>n)
xx[j++]=num;
}
} void WriteDat(int k,int xx[]) {int i;
for(i=0;i<j;i++)
printf("%d ",xx[i]);
printf("\n");
}
main()
{ int m,n,zz[100];
scanf("%d%d",&m,&n);
jsValue(m,n,zz);
WriteDat(n,zz);
}
_
5.编写一函数jsValue(int bb[]),该函数的功能是:在三位数(100至999)中寻找符合条件的整数并依次从小到大存入数组b中,条件为:它既是完全平方数,又有两位数字相同,例如144、676是满足条件的数。

最后调用函数WriteDat()将结果输出。

部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{ int b[20], num;
num=jsValue(b);
WriteDat (num, b)
}
解答:
#include<stdio.h>
#include<math.h>
jsValue(int bb[])
{int n,x,k=0,ge,shi,bai;
for(n=100;n<1000;n++)
{x=sqrt(n);
ge=n%10;
shi=n/10%10;
bai=n/100;
if(n==x*x &&
(ge==shi||shi==bai||ge==bai)) bb[k++]=n;
}
return(k); }
WriteDat(int k,int b[]) {int i;
for(i=0;i<k;i++)
printf("%d ",b[i]); printf("\n");
}
main()
{ int b[20],num;
num=jsValue(b);
WriteDat(num,b);
}
6.编写一函数jsValue(),该函数的功能是:将一正整数序列k1,k2,…,k9重新排列成一个新的序列。

新序列中,比k1小的数据都在k1的前面(左边),比k1大的数据都在k1的后面(右边)。

最后调用函数WriteDat()将结果输出。

部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{ int a[9]={6,8,9,1,2,5,4,7,3};
jsValue(a);
WriteDat (a)
}
解答:
#include<stdio.h>
void jsValue(int a[])
{int i,j,t,min;
for(i=0;i<8;i++)
{min=i;
for(j=i+1;j<9;j++)
if(a[min]>a[j]) min=j;
{t=a[min];a[min]=a[i];a[i]=t; }
}
} void WriteDat(int a[])
{int i;
for(i=0;i<9;i++)
printf("%d ",a[i]);
printf("\n");
}
main()
{int a[9]={6,8,9,1,2,5,4,7,3}; jsValue(a);
WriteDat(a);
}
7.设某级数的前两项:a1=1,a2=1,以后各项具有如下关系:
an=an-2+2an-1
编写一函数jsValue(),该函数的功能是:对M=10000,求出对应的n值,使其满足:sn<M 且sn+1>=M,这里Sn=a1+a2+…+an。

最后调用函数WriteDat()将结果输出。

部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{ jsValue();
WriteDat ()
}
解答:
#include <stdio.h>
#define M 10000
int b[1];
jsValue()
{int a1=1,a2=1,a12,sn,k=2;
sn=a1+a2;
while(1)
{a12=a1+2*a2;
if(sn<M && sn+a12>=M)
{ b[0]=k;break;}
sn=sn+a12;
a1=a2; a2=a12;
k++;
}
return(b);
}
WriteDat(int b[]) {printf("n=%d\n",b[0]);} main()
{int n;
n=jsValue(); WriteDat(n);
}
8.请编写一函数countvalue(),该函数的功能是:找出所有100以内满足i,i+4,i+10都是素数的整数i(i+10也在100之内)的整数i及其个数cnt以及这些i之和sum。

#include <stdio.h>
int cnt,sum;
main()
{ cnt=sum=0;
countvalue( );
printf(“%d,%d\n”,cnt,sum);
}
解答:
#include<stdio.h>
#include<math.h>
int cnt,sum;
int countvalue(int *n,int *s) {int i,a,b,c;
for(i=2;i<90;i++)
{a=su(i);
b=su(i+4);
c=su(i+10);
if(a&&b&&c)
{printf("%4d",i);
(*n)++;
*s+=i;
}
}
printf("\n"); }
int su(int m)
{int i,k;
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) return(0);
return(1);
}
main()
{cnt=sum=0;
countvalue(&cnt,&sum);
printf("%d,%d\n",cnt,sum); }
9.从键盘上读取一个字符串存入字符数组xx中,请编写一函数convercharD(),该函数的功能是:把字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z。

大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。

例如:
原文:Adb.Bcdza
结果:Aca.Bbcyz
把已处理的字符串仍存入数组xx中。

最后调用函数WriteDat()将结果输出。

部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{char xx[80];
gets(xx);
convercharD(xx);
WriteDat (xx)
}
解答:
#include<stdio.h>
#include<string.h>
void convercharD(char xx[]) {int i;
for(i=0;xx[i]!='\0';i++)
if(xx[i]>='a'&&xx[i]<='z') { xx[i]=xx[i]-1;
if(xx[i]=='a'-1)
xx[i]+=26;
}
} void WriteDat(char xx[]) {puts(xx);}
main()
{char xx[80];
gets(xx);
convercharD(xx);
WriteDat(xx);
}_
10.请编写一个函数jsvalue(),其功能是:求出5000到8000中满足条件:千位上的数加上个位上的数等于百位上的数加十位上的数。

将这些数依次存放入一数组中,要求由函数返回满足条件的数的个数。

最后由主函数将满足条件的数及该类数的个数输出。

解答:
#include<stdio.h>
void main()
{int jsvalue(int a[]);
int m,i=0,aa[3000],s;
for(m=5001;m<8000;m++)
aa[i++]=m;
s=jsvalue(aa);
for(i=0;i<s;i++)
printf("%d ",aa[i]); printf("\n");
printf("ge shu=%d\n",s); } int jsvalue(int a[]) {int i,j=0,g,s,b,q; for(i=0;i<3000;i++) {g=a[i]%10;
s=a[i]/10%10; b=a[i]/100%10; q=a[i]/1000;
if(g+q==s+b)
a[j++]=a[i];
}
return(j);
}
11.设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行到m的报数,报数到第m个人,此人出圈,再从他的下一个人开始从1到m报数,如此进行下去直到所有的人都出圈为止。

请编制函数joseph()实现此功能。

不妨设n=10,s=1,m=4。

解答:
#include <stdio.h>
#define N 10
#define S 1
#define M 4
int p[10],n,s,m;
void main()
{void joseph();
int i;
joseph();
for(i=N-1;i>=0;i--)
printf("%d ",p[i]);
printf("\n");
}
void joseph()
{int i,j,s1,w;
s1=S; /*第一个出圈的人*/
for(i=1;i<=N;i++) /*对p数组赋初值*/
p[i-1]=i;
for(i=N;i>=2;i--) /*控制没出圈总的人数*/
{s1=(s1+M-1)%i; /*找出报数后出圈人的下标,对i求余的作用是使报数按圈
进行(即报到尾后又从头报)*/
if(s1==0) /*当报数正好到最后一个时s1为0,故而要进行if(s1==0)*/
s1=i;
w=p[s1-1];
for(j=s1;j<i;j++) /*将出圈以后的人依次往前移*/
p[j-1]=p[j];
p[i-1]=w;
}
}
12.从键盘上读取一个字符串存入字符数组xx中,请编写一函数chg(),该函数的功能是:把字符串中的所有小写字母改写成该字母的下一个字母,如果是字母z,则改写成字母a。

大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。

例如:
原文:Mn.123Zxy
结果:No.123Ayz
把已处理的字符串仍存入数组xx中。

最后调用函数WriteDat()将结果输出。

部分源程序已给出。

除增加必要的数据定义、函数参数外,请勿改动主函数的内容。

#include <stdio.h>
main()
{char xx[80];
gets(xx);
chg(xx);
WriteDat (xx)
}
解答:
#include<stdio.h>
#include<string.h>
void convercharD(char xx[]) {int i;
for(i=0;xx[i]!='\0';i++)
if(xx[i]>='a'&&xx[i]<='z') { xx[i]=xx[i]+1;
if(xx[i]=='z'+1)
xx[i]-=26;
}
} void WriteDat(char xx[]) {puts(xx);}
main()
{char xx[80];
gets(xx);
convercharD(xx);
WriteDat(xx);
}_
13.请编写一个函数jsvalue(),其功能是:求出5000到8000中满足条件千位上的数减百位上的数减十位上的数减个位上的数大于零的数,将这些数依次存放入一数组中,要求由函数返回满足条件的数的个数。

最后由主函数将满足条件的数及该类数的个数输出。

解答:
#include<stdio.h>
void main()
{int jsvalue(int a[]);
int m,i=0,aa[3000],s;
for(m=5001;m<8000;m++)
aa[i++]=m;
s=jsvalue(aa);
for(i=0;i<s;i++)
printf("%d ",aa[i]); printf("\n");
printf("ge shu=%d\n",s); } int jsvalue(int a[]) {int i,j=0,g,s,b,q; for(i=0;i<3000;i++) {g=a[i]%10;
s=a[i]/10%10; b=a[i]/100%10; q=a[i]/1000;
if(q-b-s-g>0)
a[j++]=a[i];
}
return(j);
}
14.编程将一字符串做压缩处理。

编程要求如下:(1)编写一个函数int compress(char s[ ]),将s中连续出现的多个相同字符压缩为一个字符,统计被删除的字符个数。

返回被删除的字符个数。

(2)编写主函数main,从键盘上读入一行字符数据放入一个字符型数组中,调用compress函数对该字符数组中的字符做压缩处理,将压缩后的字符串输出。

(3)用以下数据测试程序:
@@@@@@ I wwilll successful &&&&&& and you too !!!!!###########
解答:
#include <stdio.h>
#include <string.h> int compress(char a[]) {int i,j=0,k=strlen(a); for(i=0;i<k;i++)
if(a[i+1]!=a[i])
a[j++]=a[i];
a[j]='\0'; return (k-j);
} void main()
{char str[81];
int t;
gets(str);
t=compress(str);
puts(str);
printf("zi fu shu=%d\n",t); }
15.编写一函数delete(s,i,L),其功能是从字符数组s中的指定位置i开始删除指定的L 个字符,结果仍放在字符数组s中。

例如:字符数组中有“abcdefghijk”,调用delete(s,3,3)后,s中的字符串为“abfghijk”。

在主函数调用该函数以实现现上述功能。

解答:
#include<stdio.h>
#include<string.h>
void delete(char str[],int n,int l)
{int i,j=0;
for(i=0;i<n;i++)
str[j++]=str[i];
for(i=n+l;i<strlen(str);i++) str[j++]=str[i]; str[j]='\0'; }
void main() {char s[81];
gets(s); delete(s,3,3); puts(s);
}_
16.输入一行字符串到字符数组xx中,请编写一个函数jsvalue(),其功能是把该字符串中的每一个字母串的首字母都换成大写字母,并输出转换后的字符串。

如输入good mor23ning!,则输出为Good Mor23Ning!。

注:字母串是以字母开头的字母序列(不区分大小写),即不同字母串之间用非字母隔开。

在主函数中调用该函数,并输出变化以后的xx。

解答:
#include <stdio.h>
#include <string.h> void jsvalue(char s[]) {int i,word=0;
for(i=0;s[i]!='\0';i++)
{if(s[i]>'z'||s[i]<'a')
word=0;
else if(word==0)
{ s[i]-=32;
word=1;
}
}
}
void main() {char xx[81]; gets(xx); jsvalue(xx); puts(xx);
}
17.请编写一个函数jsvalue(),其功能是:求出2000到5000中满足条件个位上的数减十位上的数减百位上的数减千位上的数大于零的数,将这些数依次存放入一数组中,要求由函数返回满足条件的数的个数。

最后由主函数将满足条件的数及该类数的个数输出。

解答:
#include<stdio.h>
void main()
{int jsvalue(int a[]);
int m,i=0,aa[3000],s;
for(m=2001;m<5000;m++)
aa[i++]=m;
s=jsvalue(aa);
for(i=0;i<s;i++)
printf("%d ",aa[i]); printf("\n");
printf("ge shu=%d\n",s); } int jsvalue(int a[]) {int i,j=0,g,s,b,q; for(i=0;i<3000;i++) {g=a[i]%10;
s=a[i]/10%10; b=a[i]/100%10; q=a[i]/1000;
if(g-s-b-q>0)
a[j++]=a[i];
}
return(j);
}
18.请编写函数countvalue(),它的功能是:求n以内(不包括n)同时能被3和7整除的所有自然数之和的平方根s,并作为函数值返回。

最后调用函数wirtedat()输出结果。

解答:
#include<stdio.h>
#include<math.h>
float jsvalue(int a[]) {int m,i,j=0,sum=0;
float k;
for(m=1;m<100;m++)
if(m%3==0 && m%7==0) a[j++]=m;
for(i=0;i<j;i++)
sum+=a[i];
k=sqrt(sum);
return(k);
} float WriteDat(float k) {printf("he de ping fang gen=%f\n",k);
}
main()
{int a[100];
float s;
s=jsvalue(a);
WriteDat(s);
}
19.从键盘上输入一组整数至整型数组xx中,请编写一个函数jsvalu(),其功能为:不计这组整数中的最大和最小数(若有重复,则都不计),求出余下数中的最大数max及最大数的个数cnt1、最小数min及最小数的个数cnt2。

#include <stdio.h>
#define N 10
void jsvalue(int a[])
{int i,j=0,maxi,mini,max,min;int cnt1=0,cnt2=0,b[N]; maxi=mini=a[0];
for(i=0;i<N;i++)
if(maxi<a[i]) maxi=a[i];
for(i=0;i<N;i++)
if(mini>a[i]) mini=a[i];
for(i=0;i<N;i++)
if(a[i]!=maxi&&a[i]!=mini)
b[j++]=a[i];
max=min=b[0];
for(i=0;i<j;i++)
if(max<b[i] ) max=b[i];
for(i=0;i<j;i++)
if(min>b[i] ) min=b[i];
for(i=0;i<N;i++)
{ if(b[i]==max)
cnt1++;
if(b[i]==min)
cnt2++; }
printf("max=%d,min=%d,cnt1=%d,
cnt2=%d\n",max,min,cnt1,cnt2); }
void main()
{int i,xx[N];
for(i=0;i<N;i++)
scanf("%d",&xx[i]);
jsvalue(xx);
}
20. 请编写一个函数countvalue(),其功能是:计算500到800区间内素数的个数cnt,并按所求素数的值按从大到小的顺序,再计算其间隔加、减之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数-…的值sum。

方法一:
#include<stdio.h>
#include<math.h>
int countvalue()
{int m,k,i,cnt=0,a=1,t,sum=0; for(m=799;m>500;m--)
{k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) break;
if(i>k)
{printf("%5d",m);
t=a*m;
a=-a;
sum+=t;
cnt++;
if(cnt%10==0)
printf("\n");
}
}
printf("\n");
printf("cnt=%d\n",cnt); printf("sum=%d\n",sum); }
main()
{
countvalue();
} 方法二:(老师编)
#include "stdio.h"
main()
{
int a[300],c,sum,i;
c=countvalue(a,&sum);
for(i=0;i<c;i++)
printf("%d ",a[i]);
printf("\n");
printf("sum=%d\n",sum);
}
countvalue(int a[],int *sum) {
int c=0,i;
for(i=500;i<800;i++)
if(prime(i))
{a[c++]=i;
if(c%2)*sum=*sum+i;
else *sum=*sum-i;
}
return(c);
}
prime(int i)
{int j;
for(j=2;j<i-1;j++)
if(i%j==0)return(0);
return(1);}。

相关文档
最新文档