资源描述
C语言上机编程题总结
石寅斌
第一部分 前十次上机题汇总
1. 一个较大的偶数可分解为两个质数之和。编程要求:(1)编写函数int guess(int a[][3],int m,int n),其功能是将[m,n]内任一偶数i分解成两个质数k和j之和(得到验证即可,如果有多个答案,只取一个),将i,j,k依次写到a指向的二维数组一行中的三个元素中,函数返回实际写入二维数组中的行数;(2)编写main函数,定义一个行数为100列数为3的二维数组a,用a作为实在参数,调用guess函数求出[6,20]内偶数的分解情况,并按行的形式输出a数组中的元素。
#include<stdio.h>
#include<math.h>
int prime(int p)
{int g,h; h=sqrt(p);
for(g=2;g<=h;g++)
if(p%g==0) return 0;
if(g>h) return 1;}
int guess(int a[][3],int m,int n)
{ int i,k,j,p=0;
for(i=m;i<=n;i+=2)
{ for(k=3;k<=i/2;k+=2)
if(prime(k))
{j=i-k;if(prime(j))
{a[p][0]=i;
a[p][1]=k;
a[p][2]=j;p++;break;}
}
}
}
void main()
{
int i,j,a[100][3];
guess(a,6,20);
for(i=0;i<8;i++)
{for(j=0;j<3;j++)
printf("%3d",a[i][j]);
printf("\n");}
getch();
}
2.请按下列要求编程:(1)请编写函数int fun(int a[]),其功能是:在三位数(100至999)中寻找符合下列条件的整数并按从小到大的顺序存入a指向的数组中,条件为:它是一个完全平方数,且有两位数字相同(例如144、676是满足条件的数),函数返回满足条件的该类数的个数。(2)编写main函数,定义一个长度为100的整型数组a,用a作为实在参数调用函数fun,将满足条件的依次存入a数组中,输出在给定范围内满足条件的数及这类数的个数
#include<stdio.h>
#include<math.h>
int fun(int a[])
{ int i,d,b,c,m,sum=0,p=0;
for(i=101;i<999;i++)
{m=sqrt(i);
d=i/100;b=i/10%10;c=i%10;
if((d==b)+(d==c)+(b==c)>=1&&i==m*m)
{sum++;a[p]=i;p++;}
return sum;
}
main()
{
int a[100],t,i;
t=fun(a);
printf("%d\n",t);
for(i=0;a[i]!='\0';i++)
printf("%3d\n",a[i]);
getch();}
3.设n0是一个给定的正整数。对于i=0,1,2,…,定义:若ni是偶数,则ni+1=ni/2;若ni是奇数,则ni+1=3ni+1;若ni是1,则序列结束。用这种方法产生的数称为冰雹数。请按下列要求编程:(1)编写一个函数int hailstones(int n,int a[]),其功能是将按公式生成的从n到1为止的序列中的数依次存放到a指向的数组中,函数返回符合条件的序列中数据的个数;(2) 编写main函数,定义一个长度为100的一维数组a,从键盘上输入任一种子n,用n和a作为实在参数调用函数hailstones,最后按每行6个数输出数组中的数。
#include<stdio.h>
int hailstones(int n,int a[])
{ int p=0,sum=0;
while(n!=1)
{ a[p]=n;
if(n%2==0)
n=n/2;
else n=3*n+1;
sum++;p++; }
a[p]=1;
return sum+1;
}
void main()
{
int a[100],n,t,i,m=0;
scanf("%d",&n);
t=hailstones(n,a);
printf("%d\n",t);
for(i=0;a[i]!='\0';i++)
{printf("%5d",a[i]);
m++;if(m%6==0) printf("\n");}
getch();
}
4.找出满足如下条件的整数m:(1)该数在[11,999]之内;(2) m、m2、m3均为回文数。例如m=11,m2=121,m3=1331,11、121、1331皆为回文数,故m=11是满足条件的一个数。请按下列要求编程:(1)请编写函数int plalindrome (long a[][3],int m,int n),其功能是将[m,n]内符合条件的数i,i2,i3依次写到a指向的二维数组的一行中,函数返回满足条件数的个数(即为所写二维数组的有效行数);(2) 编写main函数,声明一个行数为100列数为3的二维数组a,从键盘上输入区间[m,n]的端点值,用a、m和n作为实在参数调用函数plalindrome,并按行的形式输出所有满足条件的数及其平方数和立方数。
#include<stdio.h>
int value(long m)
{ long t=0,b;
int a;b=m;
while(m)
{a=m%10;m=m/10;t=t*10+a;}
if(t==b)
return 1;
else
return 0;
}
int plalindrome(long a[][3],int m,int n)
{long i,sum=0;
for(i=m;i<=n;i++)
if(value(i)+value(i*i)+value(i*i*i)==3)
{
a[sum][0]=i;a[sum][1]=i*i;a[sum][2]=i*i*i;
sum++; }
return sum;}
main()
{int t,i,j;
long a[100][3];
t=plalindrome(a,11,999);
printf("%d",t);
for(i=0;i<t;i++)
{for(j=0;j<3;j++)
printf("%8ld",a[i][j]);
printf("\n");}
getch();
}
5.请按下列要求编程:(1)编写函数int primecount(int a[],int m,int n),其功能是:找出[m,n]内的所有质数并依次将它们存储到a指向的数组中,函数返回[m,n]内质数的个数。(2)编写main函数,声明一个长度为100的一维数组a,从键盘上输入m和n,用a、m、n作为实在参数调用函数primecount,将结果数组输出到屏幕,并输出[m,n]内质数的个数。调试程序时可在main函数中输入m、n的值分别为100和200。
#include<stdio.h>
#include<math.h>
int primecount(int a[],int m,int n)
{int i,g,sum=0,p=0;
for(i=m;i<=n;i++)
{for(g=2;g<sqrt(i);g++)
if(i%g==0) break;
if(g>sqrt(i))
{sum++;a[p]=i;p++;}
}
return sum;
}
main()
{
int m,n,t,i,a[100];scanf("%d %d",&m,&n);
t=primecount(a,m,n);
printf("%d\n",t);
for(i=0;a[i]!='\0';i++)
printf("%5d",a[i]);
getch();
}
6. 已知整型数组中的元素值在0~9范围内,编程统计每个整数的个数。
#include<stdio.h>
#include<stdlib.h>
void getdata(int *s)
{ int i;
for(i=0;i<50;i++)
s[i]=rand()%10;
}
void stat(int *a,int *c)
{ int i;
for(i=0;i<50;i++)
c[a[i]]+=1;
}
main()
{int i,a[50],c[10]={0};
getdata(a);
stat(a,c);
for(i=0;i<10;i++)
printf(" c[%d]=%2d\n",i,c[i]);
getch();
}
7.下列程序的功能是将字符串中的数字字符删除后输出。
#include<stdio.h>
void delnum(char s[80])
{
int i,j;
for(i=0,j=0;s[i]!='\0';i++)
if(s[i]<'0'||s[i]>'9')
{ s[j]=s[i],j++;}
s[j]='\0';
}
void main()
{
char item[80];
gets(item);
delnum(item);
puts(item);
getch();
}
8将一字符串做压缩处理。函数int compress(char s[])的功能是将s中连续出现的多个相同字符压缩为一个字符,统计被删除的字符个数,返回被删除的字符个数。
#include<stdio.h>
int compress(char s[])
{
int i,j,sum=0,n=0;
for(i=j=0;s[i];i++)
{ while(s[i]==s[i+1])
{i++;n++;}
sum+=n;n=0;
s[j++]=s[i];}
s[j]='\0';
return sum;
}
main()
{
int n;
char str[100];
gets(str);
n=compress(str);
printf("%d %s\n",n,str);
getch();
}
9.编写函数void fun(char x[]),其功能是在x指向的字符串中所有的数字字符之前分别插入一个字符$。
#include<stdio.h>
void fun(char x[])
{
int i,j;
char b[40];
for(i=0,j=0;x[i]!='\0';i++,j++)
{
if(x[i]>='0'&&x[i]<='9')
{ b[j]='$';j++;}
b[j]=x[i];
}
b[j+1]='\0';
puts(b);
}
main()
{
char a[100];
gets(a);
fun(a);
getch();
}
10.在m行n列的二维数组找出最小的元素,然后将该元素所在行与最后一行交换,将该元素所在列与最后一列交换。
#include<stdio.h>
#define M 3
#define N 4
main()
{int x,k,j,com,col,t;
int a[M][N]={12,1,56,34,10,2,45,3,9,7,4,65};
for(k=0;k<M;k++)
{ for(j=0;j<N;j++)
printf("%3d",a[k][j]);
printf("\n");}
printf("\n");
x=a[0][0];com=0;col=0;
for(k=0;k<M;k++)
for(j=0;j<N;j++)
if(x>a[k][j])
{com=k;col=j;x=a[k][j];}
for(k=0;k<M;k++)
{t=a[k][col];a[k][col]=a[k][N-1];a[k][N-1]=t;}
for(k=0;k<N;k++)
{t=a[com][k];a[com][k]=a[M-1][k];a[M-1][k]=t;}
for(k=0;k<M;k++)
{for(j=0;j<N;j++)
printf("%3d",a[k][j]);
printf("\n"); }
getch();}
11.打印杨辉三角形。
#include<stdio.h>
void main()
{
int i,j;
int a[6][6];
for(i=0;i<6;i++)
{a[i][0]=1 ;a[i][i]=1;}
for(i=2;i<6;i++)
for(j=1;j<=i-1;j++)
a[i][j]=(a[i-1][j-1]+a[i-1][j]);
for(i=0;i<6;i++)
{for(j=0;j<=i;j++)
printf("%3d",a[i][j]);
printf("\n");}
getch();
}
12.编写函数void find odd(int odd[],int n),其功能是找到n个连续奇数,满足n的立方等于这些连续奇数之和。并将这些奇数存放到数组odd中。
#include"stdio.h"
void find_odd(int odd[],int n)
{int b;
odd[0]=n*n-n+1;
for (b=1;b<n;b++)
odd[b]=odd[b-1]+2;
}
main()
{ int n,i;
int a[100];
scanf("%d",&n);
find_odd(a,n);
printf("%d",n);
printf("^3=");
for (i=0;i< n-1;i++)
{printf("%d",a[i] );
printf("+"); }
printf("%d",a[n-1]);
getch();
}
13.调用selsort函数实现将数组中的3~8个元素案升序排列。
#include<stdio.h>
void selsort(int a[],int n)
{int i,j,k,t;
for(i=2;i<n-3;i++)
{ k=i;
for(j=i+1;j<n-2;j++)
if(a[k]>a[j]) k=j;
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
void main()
{
int a[10]={6,8,9,12,16,-3,90,-9,10,1},i;
selsort(a,10);
for(i=0;i<10;i++)
printf("%5d",a[i]);
getch();
}
14.归并排序。
#include<stdio.h>
void main()
{ int a[10]={1,2,5,8,9,10},an=5;
int b[10]={1,3,4,8,12,18},bn=5;
int i,j,k,c[20],max=9999;
a[an+1]=b[bn+1]=max;
i=j=k=0;
while((a[i]!=max)||(b[j]!=max))
if(a[i]<b[j])
{ c[k]=a[i];k++;i++;}
else
{c[k]=a[j];k++;j++;}
for(i=0;i<k;i++)
printf("%4d",c[i]);
printf("\n");
getch();
}
15.用二分法求f(x)=lnx+x^2在(1/e,1)内的近似根。
#include<stdio.h>
#include<math.h>
float f(float x)
{ return (log(x)+x*x);
}
void main()
{
float m=1/2.72,n=1,r;
r=(m+n)/2.0;
while(1)
{
if(fabs(f(r))<1e-5) break;
if(f(m)*f(r)<0) n=r;
else m=r;
r=(m+n)/2.0;
}
printf("The result is %6.3f\n",r);
getch();
}
16.如1,1,2,3,5,8,13,21、、、的数列,设计程序输出大于n的最小的数,如n=9,应输出13.
#include<stdio.h>
int Fibonacci(int n)
{ int f1=1,f2=1,f3,m;
f3=f1+f2;
while(f3<n)
{
f1=f2;
f2=f3;
f3=f2+f1;
}
m=f3;
return(m);}
void main ()
{
int t,m;
scanf("%d",&t);
m=Fibonacci(t);
printf("%d",m);
getch();
}
17,利用公式求pai的值。
#include <stdio.h>
double fun(double e)
{ int i,k;
double s, t, x;
s=0; k=1; i=2;
x=3.0/4;
while(x>e )
{ s=s+k*x;
k=-k;
t=2*i;
x=(2*i+1)/(t*t);
i++;
}
return (s);
}
main()
{ double e=(1e-3);
printf("\nThe result is: %lf\n",fun(e));
getch();
}
第二部分 改编题
1. 编写函数,统计给定字符串中各个字母出现的次数,不区分大小写。比如对hello,Tom 进行统计。
void count_chars(char s[],int cnt[])
{ int i;
for(i=0;s[i]!='\0';i++)
{ if(s[i]>='a'&&s[i]<='z') cnt[s[i]-'a']++;
if(s[i]>='A'&&s[i]<='Z') cnt[s[i]-'A']++; } }
main()
{ char s[]="hello,Tom"; int cnts[26]={0};
int i; count_chars(s,cnts); for(i=0;i<26;i++)
{ printf("字母%c(或者%c)的出现次数为%d\n",'a'+i,i+'a'-32,cnts[i]); }
}
注:类似的问题还有统计0~9每个数字出现的次数;
50个人对食堂饭菜的打分,如1,2,3,4分,统计四种分数出现的次数。
以上三种问题都是一种类型的 都要用到a[表达式]++这个重要式子。请同学们复习时把上面两道也编程出来。
2.删除类题目
² 删除字符串中的所有空格。 int i=0;char *p=str; while(*p) {if(*p!=’ ’) str[i++]=*p;p++;} str[i]=’\0’
² 从字符串中删除指定的字符。 Int i=0;char *p=s; while(*p){if(*p!=c) s[i++]=*p;p++;} s[i]=’\0’;
² 删除一个字符串中指定下标的字符。 Int I,j=0; for(i=0;i<LEN;i++) if(i!=n) b[j++]=a[i];b[j]=’\0’;
² 将s所指字符串中ASCII值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。 Int I,j=0,n=strlen(s); for(i=0;i<n;i++) if(s[i]%2!=0) t[j++]=s[i]; t[j]=’\0’
注:这类题目大同小异,希望同学们对比着学习。编程的时候只是穿插着其他几个函数,只要做到条理清晰,就会“战无不胜”。
3.在1到2000000寻找如145这样每位数字的阶乘之和等于本身的数。
#include<stdio.h>
fac(int m)
{ long t=1; int i;
for(i=0,i<=m;i++)
t=t*i; return t; }
facsum(long n)
{ long x,t=0;
while(n)
{ t=fac(n%10)+t;
n/=10;} if(x==t) return 1;
else return 0;}
main()
{long i;
for(i=1;i<2000000;i++)
if(facsum(i))
printf("%12ld",i);
getch();
}
4.含有特征值的类型。
在a数组中查找与x值相同的元素的所在位置。
#include<stdio.h>
void main()
{
int a[11],x,i;
printf("Enter 10 Integers:\n");
for(i=1;i<=10;i++)
scanf("%d",&a[i]);
printf("Enter x:");
scanf("%d",&x);
a[0]=x;i=10;
while(x!=a[i]) i--;
if (i!=0)
printf("%5d 's position is %4d\n",x,i);
else
printf("%d is not found!\n",x);
getch();}
;
注:本题中的a[0]是设置的特征值,为了不无下限找下去。课本p43 最后day==-1也是设置的特征值。总之,在c编程中,有时候有些值不好表达,或者值不影响函数最终结果的输出,可以设置特征值方便表达。掌握特征值的运用在c编程还是很重要的。
5.输入十位之内的整数,要求设计程序重组出最小的数。如输入6352410,则应输出1023456.
#include<stdio.h>
regroup(int a[],long n)
{ int k,i=-1,t,j,p,m;
while(n)
{ a[++i]=n%10;
n=n/10;} m=i+1;
for(i=0;i<=m-2;i++)
{k=i;
for(j=k+1;j<m;j++)
if(a[k]>a[j]) k=j;
t=a[i];a[i]=a[k];a[k]=t;
}
if(a[0]==0)
{for(i=0;i<m;i++)
if(a[i]!=0) break;
p=a[0];a[0]=a[i];a[i]=p;}
return m;
}
main()
{
int a[20]; long t,q;
int i;
scanf("%ld",&t);
q=regroup(a,t);
for(i=0;i<q;i++)
printf("%d",a[i]);
getch();}
展开阅读全文