1、 C语言上机编程题总结 石寅斌 第一部分 前十次上机题汇总 1. 一个较大的偶数可分解为两个质数之和。编程要求:(1)编写函数int guess(int a[][3],int m,int n),其功能是将[m,n]内任一偶数i分解成两个质数k和j之和(得到验证即可,如果有多个答案,只取一个),将i,j,k依次写到a指向的二维数组一行中的三个元素中,函数返回实际写入二维数组中的行数;(2)编写main
2、函数,定义一个行数为100列数为3的二维数组a,用a作为实在参数,调用guess函数求出[6,20]内偶数的分解情况,并按行的形式输出a数组中的元素。
#include
3、{ 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");}
4、 getch();
}
2.请按下列要求编程:(1)请编写函数int fun(int a[]),其功能是:在三位数(100至999)中寻找符合下列条件的整数并按从小到大的顺序存入a指向的数组中,条件为:它是一个完全平方数,且有两位数字相同(例如144、676是满足条件的数),函数返回满足条件的该类数的个数。(2)编写main函数,定义一个长度为100的整型数组a,用a作为实在参数调用函数fun,将满足条件的依次存入a数组中,输出在给定范围内满足条件的数及这类数的个数
#include
5、 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
6、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
7、nt 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
8、");} 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]的端
9、点值,用a、m和n作为实在参数调用函数plalindrome,并按行的形式输出所有满足条件的数及其平方数和立方数。
#include
10、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 11、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 12、0,p=0;
for(i=m;i<=n;i++)
{for(g=2;g 13、已知整型数组中的元素值在0~9范围内,编程统计每个整数的个数。
#include 14、" c[%d]=%2d\n",i,c[i]);
getch();
}
7.下列程序的功能是将字符串中的数字字符删除后输出。
#include 15、
8将一字符串做压缩处理。函数int compress(char s[])的功能是将s中连续出现的多个相同字符压缩为一个字符,统计被删除的字符个数,返回被删除的字符个数。
#include 16、char str[100];
gets(str);
n=compress(str);
printf("%d %s\n",n,str);
getch();
}
9.编写函数void fun(char x[]),其功能是在x指向的字符串中所有的数字字符之前分别插入一个字符$。
#include 17、];
}
b[j+1]='\0';
puts(b);
}
main()
{
char a[100];
gets(a);
fun(a);
getch();
}
10.在m行n列的二维数组找出最小的元素,然后将该元素所在行与最后一行交换,将该元素所在列与最后一列交换。
#include 18、0;j 19、a[M-1][k]=t;}
for(k=0;k 20、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 21、)
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个元素案升序排列。
22、include 23、"%5d",a[i]);
getch();
}
14.归并排序。
#include 24、i=0;i 25、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 26、
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 27、le(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 c 28、ount_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' 29、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 30、c) s[i++]=*p;p++;} s[i]=’\0’;
² 删除一个字符串中指定下标的字符。 Int I,j=0; for(i=0;i 31、不胜”。
3.在1到2000000寻找如145这样每位数字的阶乘之和等于本身的数。
#include 32、rintf("%12ld",i);
getch();
}
4.含有特征值的类型。
在a数组中查找与x值相同的元素的所在位置。
#include 33、 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.
34、include






