C语言编程及上机题

更新时间:2024-04-21 21:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言编程及上机题

1. 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,问第10次落

地时,共经过多少米?第10次反弹多高?请编程实现。

2. 试编程序,找出1至99之间的全部同构数。同构数是这样一组数:它出现在平方数的

右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数。 3. 有一分数序列:

23581321,,,,,,??? 1235813

编写求这个数列前20项之和的程序。

4. 编写满足条件1+2+3+?+n≥500的最小n及和s的程序。

sin(x)?x?x33!?x55!?x77!?????(?1)nx2n?1(2n?1)!????5. 已知正弦值近似的多项式计算公式为:

输入x和ε,编写按上述公式计算sin(x)近似值且误差小于ε的程序。 设:x=1.57 ε=0.000001

6. 有一高楼,有阶梯若干级,每步跨2级,最后余1级;每步跨3级,最后余2级;每步

跨5级,最后余4级;每步跨6级,最后余5级;每步跨7级,正好到楼顶。计算该楼至少多少级。

7. 从键盘输入若干个整数(数据个数少于50个),其值在0至4的范围内,用-1作为输

入结束标志。统计每个整数的个数。试编程。

8. 求出1至599中能被3整除,且至少有一位数字为5的所有整数。如15,51,513等均

是满足条件的整数。要求每行输出六个数。

9. 用以下的递归公式求数列a0,a1,??,a19,递归公式为:

a0=0; a1=1; a2=1; ai = ai-3 +2ai-2 +ai-1(当i大于2时)。 10. 求满足条件abcd=(ab)2+(cd)2有所有四位数。

11. 生成一个数列的前100项。该数列的第一、第二项分别为2、3,以后每个奇数编号的

?e2??1??211414126????(?2?1n)???? (2?n()n?0,1,2,???)????????? ? ???? (n?1,2,3???)1!32!53n?!1)37!(2?n(2?n?1)项是前两项之和,偶数编号的项是前两项之差(前项减后项)。

12. 计算自然数e和π的值,e的值精确到小数点后6位。求e的近似值的计算公式:

求π/2的近似值的计算公式为: 取n=1000时的π值。

x?f(x2)?x2f(x1)x?1f(x2)?f(x1)13. 使用弦截法解下列方程的根:x3-5x2+16x-30=0。弦截法为:

1)设f(x)= x3-5x2+16x-30。

2)取两个不同的点x1和x2,且使f(x1)·f(x2)<0。

3)连接f(x1)和f(x2)得一弦线交X轴于x,则x点的坐标为: 求出x点的f(x)值。

4)若f(x)与f(x1)的符号相同,则根在(x,x2)区间内,将x作为新的x1;否则根在(x1,x)区间内,将x作为新的x2。

5)重复第3,4步,直到f(x)的绝对值小于0.0000001为上。此时将x作为该放程的近似根。

14. 用如下的迭代公式可以求的值,迭代公式为:

yn?1?23yn?x23yny?3x初始值y=x,精度要求为:| yn+1-yn|<=10-5,

依次求出当x=0.75,3.3,6.5,20.9时,对应的y值。

15. 编程题。任意输入10个整数,每一个整数的绝对值小于104,要求打印出每一个整数,

每一个整数的各位数字之和,以及这10个整数的累加和。 如输入为:476 1048 367?? 则输出为:476 17 1048 13 367 16 ??

16. 如果整数A的全部因子(包括1,但不包括A本身)之和等于B;且整数B的全部因

子(包括1,但不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以

x3

arcsinx?x?2?3?1?32?4?5x?51?3?52?4?6?7x?...?7(2n)!22n?(n!)?(2n?1)2x2n?1?...17. 18.

19.

20. 21. 22.

23.

24.

25. 26. 27.

内的全部亲密数。

arcsinx的级数展开式为:

求当x=0.5,n=10时,arcsin(x)的前11项的近似值。

mn

已知m和n均为小于15的正整数,设x=5,y=5,求x与y的最后三位数相同,且m+n之和为最小的m,n,x,y值。若无解,则输出“No solutions!”。

39

注:1)如5和5的值分别为125和1953125,它们的最后三位数相同。 2)用长整型数表示5的方幂。

求满足下列条件的三位数n,它除以11(整数相除)所得到的商等于n的各位数字的平方和,且其中至少有二位数字相同的数。如:131,它除以11的商为11,各位数字的平方和为11,又如550,也是满足条件的三位数。 找出所有满足下列条件的正整数对a、b:(1)a+b=99;(2)a

编程验证下列各题:设n是一个两位正整数,s1是n的各位数之和,s2是2*n的各位数字之和。若s1=s2,则n是9的倍数。输出所有满足这些条件的n、s1、s2。

雨水淋湿了算术书的一道题目,9个数字只能看清其中的4个,第一个数字虽然模糊不清,但可以看出不是1(即a不为1):[a*(b3+c)]2=8de9

其中a、b、c、d、e表示淋湿的数字,请编写程序求出这些数字。 首先将正整数:121、221、2198、1234、2111、0(“0”只作结束标记)存入整型数组中,然后在这些正整数中找出连续两个数字(或更多个数字)同为奇数字或同为偶数字的所有正整数。例如:221便是这样的一个数。

编程分别确定:什么进制下,891能被198整除;什么进制下,952能被259整除;什么进制下,561能被165整除。对上述每组数据,求出一个满足整除条件且大于9的最小进制基数d。将原来的一对数据、求出的进制数d以及原来一对数所对应的十进制数值作为一组输出,输出时每组占一行。

定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。

通过赋初值按行顺序给一个2×3的二维数组赋予2、4、6、?等偶数,然后按列的顺序输出该数组。试编程。

通过循环按行顺序为一个5×5的二维数组赋1到25的自然数,然后输出该数组的左下半三角。试编程。

28. 数组a包括10个整数,把a中所有的后项除以前项之商取整后存入数组b,并按每行3

个元素的格式输出数组b。试编程。 29. 从键盘上输入一个字符,用折半查找法找出该字符在已排序的字符串a中的位置。若该

字符不在a中,则打印出**。试编程。

30. 从键盘上输入两个字符串a和b,要求不用库函数strcat把串b的前五个字符连接到串

a中;如果b的长度小于5,则把b的所有元素都连接到a中。试编程。 31. 从键盘输入一字符串a,并在a串中的最大元素后边插入字符串b(b[]=”ab”)。试编程。 32. 若有说明:int a[2][3]={{1,2,3},{4,5,6}};现要将a的行和列的元素互换后存到另一个二

维数组b中。试编程。

33. 编程实现,按如下递归公式,输出菲波那契数列的前20项的值。菲波那契数列的递归

定义如下:当n=0时,f0=0,当n=1时,f1=1,当n>1时,fn=fn-1+fn-2。 34. 编写一个函数,该函数能将字符数组中的字符顺序颠倒。由主函数输入五个不同的字符

串,每个字符串的长度大于7,调用上述函数分别颠倒各个字符串中字符的顺序,并输出结果。每行输出一个字符串。

35. 编程将一字符串做压缩处理。编程要求如下:(1)编写一个函数int compress(char s[ ]),

将s中连续出现的多个相同字符压缩为一个字符,统计被删除的字符个数。返回被删除的字符个数。(2)编写主函数main,从键盘上读入一行字符数据放入一个字符型数组中,调用compress函数对该字符数组中的字符做压缩处理,将压缩后的字符串输出。(3)用以下数据测试程序:@@@@@@ I wwilll successful &&&&&& and you too !!!!!###########

36. 编写一程序,将一字符串插入到另一字符串的指定位置。编程要求如下:(1)编写一个

函数char *insert_str(char *s1, char *s2, int n),将字符串s2插入到字符串s2中第n个字符(即数组下标为n-1的元素)开始的位置上,返回s1的首址;(2)编写主函数main,声明一个字符数组s存储由26个小写英文字符组成的字符串,从键盘读入若干组数据,每组有两个数据,第一个按整型读入,第二个按字符串读入。当输入的一组数据中的整型数为负数时,停止程序运行。每读入一组数据后,调用insert_str函数,按第1个数据的值将第2个数据(字符串)插入到字符串s中对应的位置上,每当在s中插入一个字符串后,将s字符串输出。(3)键盘输入两组测试数据为:10 9876和31共处 ExAmPLE。

37. 改错题(可调整语句顺序,增加少量变量说明或编译预处理命令,不准增减语句行。

以下改错题同此要求):从键盘上输入十个字符串,从中求出最长的一个字符串。 #include main( )

{ int i, maxlen, len;

char inline[10][100], maxline[100]; for (i=0; i<10; i++){ gets(inline[i]);

printf(“%s\\n”, inline[i]); }

maxlen=0;

for(i=0; i<10; i++){ strlenth (inline[i],len);

if (len>maxlen) strcpy(maxline, inline[i]), maxlen=len; }

printf (“max string is: %s\\n maxlen=%d\\n”, maxline, maxlen); }

strlenth(char p, int len)

{ len= =0;

while (p[len]!=?\\0?) ++len; }

cos(x)?1?x22!?x44!?x66!?x88!?????(?1)nx2n(2n)!????38. 改错题:cos(x)的计算公式为:

下面的程序用来分别求出x=0.0,0.5,3.14159/4,1.5时的cos(x)的值。精度要求:当

2 n

通项x/(2n)!小于等于0.0000001为止。含有错误的源程序为: # include # include main( )

{ int n; float f;

printf (“cos(0.0)=%f \\n”, cos1(0.0)); printf (“cos(0.5)=%f \\n”, cos1(0.5));

printf (“cos(%f)=%f \\n”, 3.14159/4, cos1(3.14159/4)); printf (“cos(1.5)=%f \\n”, cos1(1.5)); }

float cos1(float x) { int n; float s, term; term=1; s=0; n=1; while (term>=1e-7){ s+=term;

term=-x*x/n*(n+1); n+=2; } return s; }

39. 改错题:下面程序的功能为:对键盘输入的每个字母(不分大小写)出现的次数进行统

计。26种字母出现次数分别存放在数组的前26个元素中,最后一个元素中存放非字母字符出现的次数。含有错误的源程序如下: #include void count(letter) int letter[ ]; { int ch, i;

for (i=0; i<27; i++) letter[i]=0;

while ((ch=getchar())!=EOF) if (ch>=?A?&&ch<=?z?) ++ letter[ch];

else if (ch>=?a?&&ch<=?z?) ++letter[ch]; else ++letter[27]; } main( )

{ int le[27], i; count(le); for(; i=0; i<26; i++)

{ printf(“%c=d”, i+‘a’, lc[i]); if ((i+1)/8= =0) printf(“\\n”); }

printf (“other=d”, le[27]); printf(“\\n”); }

40. 改错题。本程序的功能是任取一个十进制整数,将其倒过来后与原来的整数相加,得到

一个新的整数后重复上述步骤,则最终可得到一个回文数。 #define MAX 2147483647 #include main( )

{ long int n,m; int count=0;

printf(\ scanf(\

printf(\ while(!nonre(m+n))

if(m+n>=MAX) { printf(\

else { printf(\ printf(\ }

long rev(long int a) { long int t;

for(t=0; a>0; a/=10) t=t+a; return t; }

nonre(long int *s)

{ if(rev(s)==s) return 1; else return 0;

}

41. 改错题:本程序中函数check检查给定的字符串s中左圆插号与右圆括号的个数是否匹

配,若两者个数匹配则函数返回值为0,若左括号数大于右括号数则返回两者差值的负值,否则返回两者差值的正值。 # include main ( )

{ char a[100]; int i;

a=”(((a+b)-c)*d)-e”; i=check(a);

printf(“a=%s i=%d\\n”, a, i ); }

int check(char *s) { int left, right; left=0, right=0; while (s=?\\0?)

{ if (*s= =?(?) left ++; if (*s= =?)?) right ++; s++; }

if (left>right) return(left-right); else if (left

42. 改错题:本程序中函数delete(s,i,L)的功能是从字符数组s中的指定位置i开始删

除指定的L个字符,结果仍放在字符数组s中。例如:字符数组中有“abcdefghijk”,调用delete(s,3,3)后,s中的字符串为“abfghijk”。

printf(\ putchar('\\n'); }

68. 编程题:程序功能是给定正整数n,求所有小于n的n的互质数。互质数是指两数没有

公约数;例如n=9,则2、4、5、7、8为9的互质数。编程要求:

(1) 编写函数int bi_prime(int m,int n)判断m,n是否为互质数,是则返回1,否则返回0。

(2) 编写主函数main。从键盘分别输入15、49、78作为n的值,生成各自的互质数并写入文件myf2.out中。

69. 改错题:在m行n列的二维数组中找出最大值的元素,然后将该元素所在行与最后一行

交换,将该元素所在列与最后一列交换。

输入程序2分,程序完全正确2分,一般每改正一个错给4分。 #define M 3 #define N 4 void main()

{int x,k,j,com,col,t;

int a[M][N]={12,4,56,-34,0,-2,-45,3,9,-7,4,-65}; for(k=0;k

{ for(j=0;j

putchar('\\n'); x=0;

com=0;col=0;

for(k=0;k

for(j=k+1;j

if(x

{ t=a[k][col];a[k][col]=a[k][N];a[k][N]=t;} for(k=0;k

{ t=a[com][k];a[com][k]=a[M][k];a[M][k]=t; } for(k=0;k

{ for(j=0;j

putchar('\\n'); }

70. 编程题:程序功能是编程计算 s=s1+s2+s3+s4 的值,其中:

s1=1+1/2+1/3+.. .. +1/m s2=1+1/22+1/32+.. .. +1/m2

s3=1+1/23+1/33+.. .. +1/m3 s4=1+1/24+1/34+.. .. +1/m4 (m=50) 编程要求:

(1)编写函数double sum ( int n),计算当m取值为n时上述算式的值并且返回该值。

(2)编写主函数main,接受从键盘输入的整数50,调用函数sum计算当m 取值50时上述算式的值s,将s的值写入到文件myf2.out中。

71. 任取一个十进制正整数,将其倒过来与原来的整数相加,得到的新数若不是回文数,则

对新数再作以上操作,如此重复,最终可得到一个回文数。以下程序在一定范围内验证该命题。(回文数是指从左到右或从右到左读,数字字符对称相同的正整数,如12321、949)。输入程序2分,程序完全正确2分,一般每改正一个错给4分。 long reverse(long a) {long u;

for(u=0;a>0;a/=10) u=u+a; return u; }

same(long j)

{if(j=reverse(j)) return 1; else return 0; }

void main() {long m,n; int step=0;

printf(\ scanf(\

while(!same(m=reverse(n)+n)) if(m+n<0)

{printf(\ else

{printf(\ printf(\}

72. 编程题:程序功能是生成并打印一个数列的前100项。该数列的第一、二项分别为2、

3,其后继项按下列规则生成:若前两项的乘积是一位数,则取该乘积为后继项;若前两项的乘积是二位数,则取该乘积的十位数字和个位数字依次作为数列的两个后继项。编程要求:

(1)编写一个函数void numlist(int a[],int n),生成符合上述要求的一个数列的前n项存储在a数组中。

(2)编写主函数main, 调用numlist函数生成该数列的前100项并保存在一个一维数组中,按每行10个数的格式将该数列的前100项输出到文件myf2.out中。

73. 改错题:以下程序从键盘输入一个较大的整数n(n>=6),然后验证6到n之间的所有偶

数都可以分解为两个素数之和。含有错误的源程序为:

输入程序2分,程序完全正确2分,一般每改正一个错给4分。 #include \void main()

{int k,j,n,limit; do

printf(\ scanf(\ while(limit<6);

for(n=6;n<=limit;n+=2) for(k=3;k<=n/2;k+=2) if(prime(k)) { j=n-k;

if(prime(j))

{ printf(\ continue; } } }

int prime(int m) {int g,h; h=sqrt(m);

for(g=2;g<=h;g++)

if(m%g==0)return 0; else return 1; }

74. 编程题:程序功能是还原被压缩的数据。编程要求:

(1)编写函数int restore(int a[],int b[]),a数组中保存待还原的压缩数据,将还原后的数据保存在b数组,将还原后全部数据的个数作为函数值返回。

(2) 编写主函数main,通过数组初始化将压缩数据放入一维数组x中,调用restore函数进行数据还原,将还原后的全部数据放入一维数组y中,将y数组中全部有效数据写入结果文件myf2.out中。

(3)测试用压缩数据:5 3 2 -5 0 1 2 3 4 5 1 5 0 -4 4 3 2 1 压缩数据格式说明:

a[0]用于保存从a[1]开始存储的压缩数据段的个数;

从a[1]开始顺序保存若干压缩数据段。当数据段的第一个数为正整数n时,表示该数据段只有两个数,还原操作是取该段的第二个数重复出现n次;若数据段的第一个数为负整数n时,表示该数据段有|n|+1个数,从第二个数开始的|n|个数不是连续相同的,还原操作是取该数据段的第二个数开始的|n|个数作为还原结果。例如,

压缩数据:5 3 2 -5 0 1 2 3 4 5 1 5 0 -4 4 3 2 1 还原后的数据:2 2 2 0 1 2 3 4 1 1 1 1 1 0 0 0 0 0 4 3 2 1

75. 以下程序输入若干本书的名称和单价,按照单价从低到高输出书的名称和单价。

输入数据为:computer architecture 56.5 english 23.5

programming in c 48.5

输入程序2分,程序完全正确2分,一般每改正一个错给4分。 #include \#define NUM 3 struct book {

char name[20];float price; };

void printbook(struct book *pbook)

{printf(\void insertbook(struct term,struct *pbook) {int k;

struct book *q,*pend=pbook;

for(k=0;pend->name!=NULL;k++,pend++); for(;pbook

if(pbook->price>term.price) break; for(q=pend-1;q>=pbook;q--)

*(q+1)=*q; *q=term; }

void main()

{static struct book term,books[NUM]; int k;

printf(\ for(k=0;k

{ printf(\ scanf(\

printf(\ scanf(\ insertbook(term,books); }

printf(\ for(k=0;k

76. 编程题:程序功能是读入一串字符(不超过80个,以“#”结束)并做以下变换:将其

中第1个单词与第2个单词交换次序,第3个单词与第4个单词交换次序……依此类推。串中其他字符原样输出,且相对次序不变。把连续的字母串看成单词,而不管它是否有意义,假定字母均小写,各字母串左右都有一个空格。例如:

输入: 11 aa 222 bbb 33 cccc 4444 dd 55 eee 66 ff 77# 变换后: 11 bbb 222 aa 33 dd 4444 cccc 55 ff 66 eee 77 编程要求:

(1)编写函数void swap(char a[],char b[],int n),将a数组中前n个字符按照上述程序功能的要求进行变换后保存在b数组中。

(2) 编写主函数,读入一串字符(不超过80个,以“#”结束)保存在一字符数组中,调用swap函数对读入的字符串进行变换后保存在另一字符数组中,将变换后的一串字符写到文件MYF2.OUT。

(3)测试数据: 11 aa 222 bbb 33 cccc 4444 dd 55 eee 66 ff 77# 77. 改错题:以下程序统计输入字符串中每行含有多少个定冠词“the”。假定仅使用小写英

文字母和空格,单词不跨行,每行不超过50个字符且以句点结束,空行输入‘#’表示全部结束。输入程序2分,程序完全正确2分,一般每改正一个错给4分。 #include \void main()

{ int k,j,n,line=0; char str[52],ch;

str[0]=' ';ch=getchar();j=0; while(ch!='#')

{ n=0;line++; while(ch!='.')

{ n++;str[n]=ch; ch=getchar(); }

str[n+1]=' ';k=0; while(k

if(!('a'<=str[k-1]<='z')&&!('a'<=str[k+3]<='z') &&(str[k]=='t'&&str[k+1]=='h'&&str[k+2]=='e'))

{j++;k+=4;} else k++;

printf(\ getchar();ch=getchar(); } }

78. 编程题:程序功能是找出1999到2030之间所有由两个素数乘积构成的正整数。

编程要求:

(1)编写函数int enumerate(int k1,int k2,int a[][3]),找出k1—k2之间所有由两个素数乘积构成的正整数。每找到的一个满足这一条件的数,便将该数和它的两个因子(素数)作为一组数据保存在a数组的一行中。函数返回在k1—k2之间满足这一条件的数的个数值。

(2)编写主函数,声明一个局部数组x[20][3],调用enumerate函数查找1999到2030之间所有满足上述条件的数及他们的因子并保存在x数组中,将x数组中全部有效数据写到文件MYF2.OUT中,每组数据占一行。形如:2005: 5 401

本文来源:https://www.bwwdw.com/article/9jop.html

Top