视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C语言程序设计习题试题(编程题)
2025-09-29 09:00:51 责编:小OO
文档
C语言程序设计习题(编程类)

1、从键盘输入任意的字符,按下列规则进行分类计数。

     第一类 '0','1','2','3','4','5','6','7','8','9'

     第二类 '+','-','*','/','%','='

     第三类 其它字符

当输入字符'\\'时先计数,然后停止接收输入,打印计数的结果。

参:

#include

void main( )

{ int class1, class2, class3;

char ch;

class1=class2=class3=0; /* 初始化分类计数器 */

do

{ ch=getch( );

switch(ch)

{ case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9':

class1++; break; /* 对分类1计数 */

case '+': case '-': case '*': case '/': case '%': case '=':

class2++; break; /* 对分类2计数 */

default: class3++; break; /* 对分类3计数 */

}

}while (ch!= '\\\\'); /* 字符'\\'在C程序中要使用转义符'\\\\' */

printf("class1=%d, class2=%d, class3=%d\\n", class1, class2, class3);

}

2、从键盘输入十个整数,用插入法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。

参:

void main( )

{ int i,j,num,a[10];

for(i=0;i<10;i++)

{ printf("Enter No. %d:", i+1);

scanf("%d",&num);

for(j=i-1;j>=0&&a[j]>num;j--)

a[j+1]=a[j];

a[j+1]=num;

}

for(i=0;i<10;i++)

printf ("No.%d=%d\\n", i+1, a[i]);

}

3、输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321。

参:

void main()

{ int n;

printf("Please enter n:");

scanf("%d",&n);

while(n>0)

{ printf("%d",n%10);

n=n/10;

}

4、编写程序,读入一个整数N;若N为非负数,则计算N到2×N之间的整数和;若N为一个负数,则求2×N到N之间的整数和。分别利用for和while写出两个程序。

参:

void main()

{ int i,n;

long s1=0,s2=0;

printf("Please enter N:");

scanf("%d",&n);

if(n>=0)

for(i=n;i<=2*n;i++)

s1=s1+i;

else

for(i=n;i>=2*n;i--)

s1=s1+i;

i=n;

if(i>=0)

while(i<=2*n)

s2=s2+i++;

else

while(i>=2*n)

s2=s2+i--;

printf("Result1=%ld result2=%ld\\n",s1,s2);

}

5、一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。

参:

void main( )

{ int i,n,a;

for(i=0; ;i++)

{ if(i%8==1)

{ n=i/8;

if(n%8==1)

{ n=n/8;

if(n%8==7) a=n/8;

}

}

if(i%17==4)

{ n=i/17;

if(n%17==15) n=n/17;

}

if(2*a==n)

{ printf("result=%d\\n",i);

break;

}

}

}

6、编写程序,输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法。

参:

void main( )

{ int f1,f2,f5,count=0;

for(f5=0;f5<=20;f5++)

for(f2=0;f2<=(100-f5*5)/2;f2++)

{ f1=100-f5*5-f2*2;

if(f5*5+f2*2+f1==100)

printf("No.%2d >> 5: %4d 2: %2d 1: %2d\\n",++count,f5,f2,f1);

}

7、将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。

参:

void main()

{ int i,j,n,k,a[16]={0};

for(i=1;i<=1993;i++)

{ n=i;k=0;

while(n>0) /* 将十进制数转变为二进制数 */

{ a[k++]=n%2;

n=n/2;

}

for(j=0;jif(a[j]!=a[k-j-1]) break;

if(j>=k)

{ printf(" %d: ",i);

for(j=0;jprintf("%2d",a[j]);

printf("\\n");

}

}

8、十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14 块,第十个小孩20块。然后所有的小孩同时将自己手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次调整后大家手中的糖的块数都一样?每人各有多少块糖?

参:

void main()

{ int i,count=0,a[11]={0,10,2,8,22,16,4,10,6,14,20};

while(1)

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

a[i-1]=a[i-1]/2+a[i]/2;

a[10]=a[10]/2+a[0];

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

if(a[i]%2==1) a[i]++;

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

if(a[i]!=a[i+1]) break;

if(i==10) break;

else

{ a[0]=0;

count++;

}

}

printf("count=%d number=%d\\n",count,a[1]);

}

9、输入5×5的数组,编写程序实现:

(1)求出对角线上各元素的和;

(2)求出对角线上行、列下标均为偶数的各元素的积;

(3)找出对角线上其值最大的元素和它在数组中的位置。

参:

void main()

{ int i,j,s1=0,s2=1,a[5][5];

for(i=0;i<5;i++)

for(j=0;j<5;j++)

{ printf("%d %d: ",i,j);

scanf("%d",&a[i][j]);

}

for(i=0;i<5;i++)

{ for(j=0;j<5;j++)

printf("%5d",a[i][j]);

printf("\\n");

}

j=0;

for(i=0;i<5;i++)

{ s1=s1+a[i][i];

if(i%2==0) s2=s2*a[i][i];

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

}

printf("SUN=%d\\nACCOM=%d\\na[%d]=%d\\n",s1,s2,j,a[j][j]);

10、编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。

参:

#include "stdio.h"

void main()

{ int i,n=0,a[4]={0};

printf("Please enter a digit:");

for(i=0;i<4 && (a[i]=getchar())!='\\n';i++) ;

for(i=0;i<4;i++)

if(a[i]>=48&&a[i]<=57) a[i]=a[i]-48;

else if(a[i]>=65&&a[i]<=69) a[i]=a[i]-55;

else if(a[i]>=97&&a[i]<=102) a[i]=a[i]-87;

else printf("input Error!");

for(i=0;i<4;i++)

n=n*16+a[i];

printf("%d",n);

11、编写程序,输入一个十进制整数,将其变换为二进制后储存在一个字符数组中。

参:

void main()

{ int i,n,k=16,a[16]={0};

printf("Please enter a digit:");

scanf("%d",&n);

while(n>0) /* 将十进制数转变为二进制数 */

{ a[--k]=n%2;

n=n/2;

}

for(i=0;i<16;i++)

printf("%2d",a[i]);

12、对数组A中的N(0<N<100=个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号。例如数组是:A=(5,3,4,7,3,5,6) 则输出为: (3,1,2,5,1,3,4)

参:

void main()

{ int i,j,k,n,m=1,r=1,a[2][100]={0}; printf("Please enter n:");

scanf("%d",&n);

for(i=0;i{ printf("a[%d]= ",i);

scanf("%d",&a[0][i]);

}

while(m<=n) /* m记录已经登记过的数的个数 */

{ for(i=0;i{ if(a[1][i]!=0) /* 已登记过的数空过 */

continue;

k=i;

for(j=i;jif(a[1][j]==0 && a[0][j]a[1][k]=r++; /* 记录名次,r为名次 */

m++; /* 登记过的数增1 */

for(j=0;jif(a[1][j]==0 && a[0][j]==a[0][k])

{ a[1][j]=a[1][k];

m++;

}

break;

}

}

for(i=0;iprintf("a[%d]=%d, %d\\n",i,a[0][i],a[1][i]);

}

13、求这样一个三位数,该三位数等于其每位数字的阶乘之和。

        即: abc = a! + b! + c!

参:

void main()

{ int a[5],i,t,k;

for (i=100;i<1000;i++)

{ for(t=0,k=1000;k>=10;t++)

{ a[t]=(i%k)/(k/10);

k/=10;

}

if(f(a[0])+f(a[1])+f(a[2])==i)

printf("%d ",i);

}

}

f(m)

int m;

{ int i=0,t=1;

while(++i<=m) t*=i;

return(t);

14、编写一个函数实现将字符串str1和字符串str2合并,合并后的字符串按其ASCII码值从小到大进行排序,相同的字符在新字符串中只出现一次。

参:

#include "string.h"

strcmbn(a,b,c) /* 数组合并函数:将数组a、b合并到 */

char a[],b[],c[];

{ char tmp;

int i,j,k,m,n;

m=strlen(a);

n=strlen(b);

for(i=0;i{ for(j=i+1,k=i;jif(a[j]tmp=a[i]; a[i]=a[k]; a[k]=tmp;

}

for(i=0;i{ for(j=i+1,k=i;jif(b[j]tmp=b[i]; b[i]=b[k]; b[k]=tmp;

}

i=0;j=0;k=0;

while(iif(a[i]>b[j])

c[k++]=b[j++]; /* 将a[i]、b[j]中的小者存入c[k] */

else

{ c[k++]=a[i++]; 

if(a[i-1]==b[j]) j++; /* 如果a、b当前元素相等,删掉一个 */

}

while(iwhile(jc[k]='\\0';

}

15、编写函数,采用递归方法实现将输入的字符串按反序输出。

参:

#include "stdio.h"

strout(s)

char *s;

{ if(*s!='\\0')

{ strout(s+1); /* 递归调用strout函数,字符串首地址前移一个字符 */

putch(*s); /* 输出字符串首地址所指向的字符 */

}

else return; /* 遇到字符串结束标志结束递归调用 */

}

16、编写函数,采用递归方法将任一整数转换为二进制形式。

参:

turn(n,a,k)

int n,a[ ],k;

{ if(n>0)

{ a[k]=n%2;

turn(n/2,a,k-1);

}

else return;

}

void main()

{ int i,n,a[16]={0};

printf("\\nPlease enter n:");

scanf("%d",&n);

turn(n,a,15);

for(i=0;i<16;i++)

printf("%d",a[i]);

}

17、将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称它为对称数。编写程序,采用递归算法求不超过1993的最大的二进制的对称数。

参:

smmt ( char s[ ] ) /* 指针s指向字符串的第一个字符 */

{ char *p;

p=s;

while(*p!='\\0') p++;

p--; /* 指针p指向字符串的最后一个字符 */

if(p==s) return(1); /* 两个指针指向同一个字符表示字符串对称 */

else

{ if(*s!=*p) 

return(0); /* 两个指针指向字符不等表示字符串不对称 */

else

{ *p='\\0';

smmt(s+1); /* 取掉首尾比较过的字符继续比较 */

}

}

}

18、编写程序,读入一个以符号"."结束的长度小于20字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如: 

读入句子:MADAM I'M ADAM. 它是回文,所以输出:YES

读入句子:ABCDBA). 它不是回文,所以输出:NO

参:

#include "stdio.h"

void main( )

{ char s[21],*p,*q;

gets(s);

p=s;

q=s;

while(*q!='\\0') q++;

q-=2;

while(pif(*p++ != *q--) /* 指针p、q同时向中间移动,比较对称的两个字符 */

{ printf("NO\\n");

break;

}

if(p>=q)

printf("YES\\n");

}

19、编写程序,其中包括一个函数,此函数的功能是:对一个长度为N 的字符串从其第K个字符起,删去M个字符,组成长度为N-M的新字符串(其中N、M<=80,K<=N)。例如输入字符串"We are poor students.",利用此函数进行删除"poor"的处理,输出处理后的字符串是"We are students."。

参:

strcut(s,m,k)

char s[ ];

int m,k;

{ char *p;

int i;

p=s+m; /* 指针p指向要被删除的字符 */

while((*p=*(p+k))!='\\0') /* p+k指向要前移的字符 */

p++;

}

20、编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2。

参:

insert(s1,s2,ch)

char s1[],s2[],ch;

{ char *p,*q;

p=s1;

while(*p++!=ch) ;

while(*s2!='\\0')

{ q=p;

while(*q!='\\0') q++;

while(q>=p)

*(q+1)=*q--;

*++q=*s2++;

p++;

}

}

21、编写程序将输入的两行字符串连接后,将串中全部空格移到串首后输出。

参:

strcnb(s1,s2)

char s1[],s2[];

{ char *p;

int i=1;

p=s1;

while(*p!='\\0') p++;

while((*p++=*s2++)!='\\0') ; /* 将s2接于s1后面 */

p=s1;

while(*p!='\\0') /* 扫描整个字符串 */

{ if(*p==' ') /* 当前字符是空格进行移位 */

{ while(*(p+i)==' ') i++; /* 寻找当前字符后面的第一个非空格 */

if(*(p+i)!='\\0')

{ *p=*(p+i); /* 将非空格移于当前字符处 */

*(p+i)=' '; /* 被移字符处换为空格 */

}

else break; /* 寻找非空格时到字符串尾,移位过程结束 */

}

p++;

}

}

22、编写程序,输入字符串,分别统计字符串中所包含的各个不同的字符及其各自字符的数量。如:输入字符串: abcedabcdcd

则输出:a=2 b=2 c=3 d=3 e=1。

参:

#include "stdio.h"

struct strnum

{ int i;

char ch;

}

void main( )

{ char c;

int i=0,k=0;

struct strnum s[100]={0,NULL};

while((c=getchar())!='\\n')

{ for(i=0;s[i].i!=0;i++)

{ if(c==s[i].ch)

{ s[i].i++;

break;

}

}

if(s[i].i==0)

{ s[k].ch=c;

s[k++].i=1;

}

}

i=0;

while(s[i].i>0)

{ printf("%c=%d ",s[i].ch,s[i].i);

i++;

}

}

23、编写程序,读入磁盘上C语言源程序文件"test8.c",删去程序中的注释后显示。

参:

#include "stdio.h" FILE *fp;

void main( )

{ int c, d;

if((fp = fopen("d:\\\c\\\est8.c

exit(0);

while((c=fgetc(fp)) != EOF)

if( c=='/' ) /* 如果是字符注释的起始字符'/' */

if((d=fgetc(fp)) == '*') /* 则判断下一个字符是否为'*' */

in_comment(); /* 调用函数处理(删除)注释 */

else /* 否则原样输出读入的两个字符 */

{ putchar(c);

putchar(d);

}

else

if( c=='\\'' || c=='\\"') /* 判断是否是字符'或" */ echo_quote(c); /* 调用函数处理字符'或"包含的字符 */ else putchar(c); } in_comment()

{ int c, d;

c=fgetc(fp);

d=fgetc(fp);

while( c!='*' || d!='/' )

{ /* 连续的两个字符不是 * 和 / 则继续处理注释 */

c = d;

d = fgetc(fp);

}

}

echo_quote (c)

int c; /* c中存放的是定界符'或" */

{ int d;

putchar(c);

while(( d=fgetc(fp))!=c) /* 读入下一个字符判断是否是定界符c */

{ putchar(c); /* 当不是定界符c时继续循环 */

if(d=='\\\\') /* 若出现转义字符\\ */

putchar( fgetc(fp)); /* 则下一个字符不论是何均原样输出 */

}

putchar(d);

}下载本文

显示全文
专题