北理工C语言3

更新时间:2024-05-26 04:35:01 阅读量: 综合文库 文档下载

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

3-1. 编程,任意输入10个整数,按从小到大的顺序输出。 结果:

输入: 9、7、8、6、7、5,

输出: 5、6、7、7、8、9。 分析:用选择法排序。 main()/* sj1-3-1 */ {int j,k,e,t,a[10];

for(j=0;j<10;j++) scanf(\ for(j=0;j<9;j++) {t=j;

for(k=j+1;k<10;k++) if(a[t]>a[k]) t=k; e=a[t];a[t]=a[j];a[j]=e; } for(k=0;k<10;k++) printf(\ printf(\ }

3-2. 编程,任意输入10个人的成绩,按从大到小的顺序排列。运行程序时,只要输入名次,

计算机就能输出该名次对应的成绩。 结果:

输入: 4、7、3、6、1、5,12,0,23,-1 输入: 4

输出: The 4th is 6

分析:用选择法排序。第n名是a[n-1]。 main()/* sj1-3-2 */ {int j,k,e,t,n,a[10];

for(j=0;j<10;j++) scanf(\printf(“nput a number:\\n”); scanf(“%d”,&n); for(j=0;j<9;j++) {t=j;

for(k=j+1;k<10;k++) if(a[t]>a[k]) t=k; e=a[t];a[t]=a[j];a[j]=e; }

printf(“The %dth is %d\\n”,n,a[n-1]); for(k=0;k<10;k++) printf(\ printf(\ }

3-3. 编程,输入10个人的序号和成绩,对成绩从小到大排序,输出排序后的序号和成绩。 结果:

输入: 1,10 2,9 3,8 4,7 5,6 6,7 7,8 8,9 9,12 10,0

输出:10: 0

5: 6 4: 7 6: 7 3: 8 7: 8

2: 9 8: 9 1: 10 9: 12。

分析:用选择法排序。a[j][0]--序号,a[j][1]--成绩。 main()/* sj1-3-3 */

{int j,k,e,t,a[10][2];

for(j=0;j<10;j++) scanf(\ for(j=0;j<9;j++) {t=j;

for(k=j+1;k<10;k++) if(a[t][1]>a[k][1]) t=k; e=a[t][0];a[t][0]=a[j][0];a[j][0]=e; e=a[t][1];a[t][1]=a[j][1];a[j][1]=e;

}

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

printf(\ printf(\ }

3-4. 编程,输入10个人的序号和成绩,对成绩从从大到小进行排序,输出排序后的序号和

成绩。 结果:

输入: 1,10 2,9 3,8 4,7 5,6 6,7 7,8 8,9 9,12 10,0

输出:9: 12。

1: 10 8: 9 2: 9 7: 8 3: 8 6: 7 4: 7 5: 6 10: 0

分析:用选择法排序。a[j][0]--序号,a[j][1]--成绩。 main()/* sj1-3-4 */

{int j,k,e,t,a[10][2];

for(j=0;j<10;j++) scanf(\ for(j=0;j<9;j++) {t=j;

for(k=j+1;k<10;k++) if(a[t][1]

}

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

printf(\ printf(\ }

3-5. 编程,输入10个整数及其序号,求出10个整数的最大值、次大值、最小值和次小值,

并输出它们原来输入时的序号。

结果:输入:1,15 2.11 3,0 4,7 5,1 6,5 7,7 8,40 9,2 10,23

输出:8: 40 10: 23 3: 0 5: 1

分析:用选择法排序。a[j][0]--序号,a[j][1]--成绩。交换时a[j][0]、a[j][1]一起交换。 main()/* sj1-3-5 */

{int j,k,e,t,a[10][2];

for(j=0;j<10;j++) scanf(\ for(j=0;j<9;j++) {t=j;

for(k=j+1;k<10;k++) if(a[t][1]

}

printf(\ printf(\ }

3-6. 编程,输入10个整数,然后进行查找。输入要查找的整数,若找到,则输出该数在数组

中的下标位置,否则输出“can not found!”。

结果:输入:12 23 43 21 56 7 9 4 33 67(a数组的内容) 56(要找的数) 输出:56=a[4]

65(要找的数) 输出:65 can not found!

分析:用数组存放10个整数,对10个整数循环,输出找到的整数及其在数组中的下标。 main()/* sj1-3-6 */ {int j,n,a[10];

for(j=0;j<10;j++) scanf(\printf(“nput a number:\\n”); scanf(“%d”,&n); for(j=0;j<10;j++)

if(n==a[j]) {printf(“%d=a[%d]\\n”,n,j);break;} if(j>=10) printf(“ %d can not found!\\n”,n);

} 3-7.编程,输入一个字符串并删除其中的指定字符。例如,对于字符串abcdcf,指定删除c,

则结果为:abdf。 结果:输入:abcdcf和c 输出:abdf

分析:输入一个字符串s和要删除的字符ch,从字符串首开始逐个字符检查,每遇ch则将

后面的字符向前移动一个位置覆盖要删字符ch. #include \#include \main()/* sj1-3-7 */ {int j,k;

char a[80],ch; gets(a);

printf(\ scanf(\ j=0;

while(a[j]!='\\0') {if(ch==a[j])

for(k=j;a[k]!='\\0';k++) a[k]=a[k+1]; j++; }

puts(a); }

3-8. 编程,输入一行字符,将其反序后再输出。 结果:输入abcdefg, 输出:gfedcba

分析:输入n个字符到a数组,a[j]与a[n-j-1]互换(j=0,1,2,…,n/2-1)。 #include \#include \main()/* sj1-3-8 */ {int j,k,n; char a[80],ch; gets(a); n=strlen(a);

for(j=0;j

a[j]=a[n-1-j]; a[n-1-j]=ch; }

puts(a); }

3-9. 编程,输入一行字符,将其中的每个字符从小到大排列后输出。 结果:输入:china 输出: achin 分析:用选择法对字符数组进行排序。 #include \#include \main()/* sj1-3-9 */

{int j,k,t,n; char a[80],e;

printf(\ n=strlen(a);

for(j=0;j

for(k=j+1;ka[k]) t=k; e=a[t];a[t]=a[j];a[j]=e; } printf(\ }

3-10. 编程,输入一行字符,将其中的每个字符从大到小排列后输出。 结果:输入:china 输出: nihca 分析:用选择法对字符数组进行排序。

#include \#include \main()/* sj1-3-10 */

{int j,k,t,n; char a[80],e;

printf(\ n=strlen(a);

for(j=0;j

for(k=j+1;k3-11. 编程,找出一个二维数组中的鞍点,即该位置上的元素是该行上的最大值,是该列上

的最小值。二维数组也可能没有鞍点。 结果:⑴ 输入 n=4,m=4 1 2 3 4 5 5 5 5 5 5 5 5

5 5 5 5

输出: 鞍点为a[0][3]=4。 (2)输入 n=4,m=4 5 5 5 5 5 5 5 5

5 5 5 5 0 3 2 1

输出: 鞍点为a[3][1]=3。

分析:找出i行最大值所在的列号k(i=0,1,…,n), 若a[i][k]是k列最小,则a[i][k]是

鞍点。也可能没有鞍点。 main()/* sj1-3-11 */

{ int i,j,l,n,m,k,a[20][20]; printf(\ scanf(\输入数组的行数n和列数m */ for(i=0;ia[i][k]) k=j; * 找出i行最大值所在的列号k */ for(l=0;l

printf(\ } }

3-12. 编程,按学生的序号输入10名学生的成绩,按照分数由高到低的顺序输出学生的名次、

序号和成绩,要求成绩相同的学生具有相同的名次。 结果:输入:2 4 6 8 9 23 43 21 9 4 输出: 1: 7 43 2: 6 23 3: 8 21 4: 5 9 4: 9 9 5: 4 8 6: 3 6 7: 2 4 7: 10 4 8: 1 2

分析:用选择法排序。a[j][0]--序号,a[j][1]—名次。a[j][2]-- 成绩 main()/* sj1-3-12 */ {int j,k,e,t,a[10][3]; for(j=0;j<10;j++) {scanf(\ for(j=0;j<9;j++) {t=j;

for(k=j+1;k<10;k++) if(a[t][2]

t= a[0][1];

for(k=1;k<10;k++) /* 相同成绩,名次也一样 */ if(a[k-1][2]== a[k][2]) a[k][1]=t; else a[k][1]=++t; for(k=0;k<10;k++)

printf(\ }

3-13. 编程,输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文

数)。 结果: 1*1=1 2*2=4 3*3=9 11*11=121 22*22=484 26*26=676 101*101=10201 111*111=12321 121*121=14641

202*202=40804 212*212=44944

分析:对j循环(j=1~255),将j*j的各位数字放入数组,输出具有对称性质的j. main()/* sj1-3-13 */

{int e,f,c,t,n=0,a[10]; long j,k;

for(j=1;j<256;j++) { k=j*j; t=0;

while(k>0) {a[t++]=k;k=k/10;} for(c=0,e=t-1;c=e) {printf(\ } }

3-14. 编程,输入两个已经按从小到大顺序排列好的字符串,将两个字符串合并为一个新的

从小到大排列字符串并输出。 结果:输入:13579 24acf

输出:1234579acf

分析1:先将两个字符串合并成一个字符串,然后按从小到大排序。 #include \ #include \ main( ) /* sj1-3-14 */ { char a[80],b[80]; int i,j=0,k,t; gets(a); gets(b); printf(“a=%s,b=%s\\n”a,b);

while(a[j]!=’\\0’) j++; /* 找a串尾 */ i=0;

while(b[i]!=’\\0’) a[j++]= b[i++]; /* b串接在a串尾 */

k=strlen(a); for(i=0;i

for(j=i+1;j

if(a[t]>a[j]) t=j; p=a[i];a[i]=a[t];a[t]=p; }

printf(“a=a+b=%s\\n”,a); }

分析2:对b串的每个字符b[i]在a串中找插入位置j,将a[j],a[j+1],a[j+2],…均向后移

动1个位置,然后将b[i]存入a[j].直到b串的每个字符均插入完毕为止。 #include \ #include \

main( ) /* sj1-3-14 */ { char a[80],b[80]; int i,j,k; gets(a); gets(b);

for(i=0;b[i]!='\\0';i++) /* a,b合并到a */ {j=0;

while(b[i]>=a[j]&&a[j]!='\\0') j++; /* 找b[i]在a中的插入位置j */ if(a[j]=='\\0') {a[j]=b[i];a[j+1]='\\0';} else {for(k=strlen(a)+1;k>j;k--)

a[k]=a[k-1]; /* 将a[k]向后移1个位置 */ a[j]=b[i]; /* 将b[i]存入a[j] */ }

} puts(a);

}

3-15. 编程,输入两个已经按从小到大顺序排列好的字符串,合并两个字符串,使合并后的

字符串中字符从大到小排列并输出。 结果:输入:13579 24acf

输出:fca9754321

分析:先将两个字符串合并成一个字符串,然后按从大到小排序。 #include \ #include \ main( ) /* sj1-3-15 */ { char a[80],b[80]; int i,j,k,t,p; gets(a); gets(b); printf(\ strcat(a,b); /* b串接在a串尾 */ k=strlen(a);

for(i=0;i

for(j=i+1;j p=a[i];a[i]=a[t];a[t]=p; }

printf(\ }

3-16. 编程,输入两个字符串s1和s2,在s1中删除任何s2中有的字符。例如,s1:“abc123ad”,

s2:“a1”,则输出“bc23d”。 结果:输入:abc123ad a1 输出:bc23d

分析:对s2中每个字符s2[i]到s1中寻找它,将s1中出现的所有s2[i]均删除。若s1[j]

应删除,则用s1[j]后面的字符向前移动的方法覆盖s1[j],达到删除s1[j]的目的。

#include \ #include \ main( ) /* sj1-3-16 */ { char s1[80],s2[80]; int i,j,k;

gets(s1); gets(s2);

for(i=0;s2[i]!='\\0';i++) /* 删除s1中的与s2[i]相同的字符 */ {j=0;

while(s1[j]!='\\0') /* 在s1中找s2[i]并删除 */

{if(s2[i]==s1[j]) /* 找到s1[j],用向前移动的方法覆盖s1[j] */

for(k=j;k

s1[k]=s1[k+1]; /* 将s1[j+1]~s1尾('\\0')向前移1个位置,删除s1[j] */

j++;

} } puts(s1);

}

3-17. 编程,输入一行文字,判断该行文字是否是回文。 例如,读入:MA DAM I MAD AM 输出:YES

读入:ABCDBA. 输出:NO

结果:输入:MA DAM I MAD AM

输出:MA DAM I MAD AM YES 输入:ABCDBA 输出:ABCDBA NO

分析:对字符串S,若s[i]==s[n-i-1](i=0,1,…,n/2)),则为回文。

#include \ main()/* sj1-3-17 */ { char s[80]; int p,n; gets(s); p=0;

n=strlen(s); while(p

if(s[p]!=s[n-p-1]) /*比较对称的两个字符 */ { printf(\ else p++; if(p>=n/2)

printf(\ }

3-18. 编程,输入若干个字符串,当输入字符串的长度为0时停止输入。输出最长的字符串。 结果:输入:china

Beijing

Chongqing Shanhai

输出:max=Chongqing

分析:用循环输入各字符串并求其长度,找最大长度并输出相应字符串。输入空串(长度为0)时结束循环。

#include \#include \main( ) /* sj1-3-18 */ {int i,k,m;

char s[80],max[80]; i=1; gets(s); m=0;

while((k=strlen(s))!=0) /* 输入空串时结束循环 */

{ if(k>m) {m=k;strcpy(max,s);} /* 比较并记录最长字符串 */ gets(s); }

printf(\}

3-19. 编程,输入若干个字符串,当输入字符串的长度为0时停止输入,输出最大字符串。 结果:输入:China

Beijing Chongqing Shanhai

输出:max= Shanhai

分析:用循环输入各字符串并求其长度,找最大字符串并输出。输入空串(长度为0)时结束循环。

#include \#include \main( ) /* sj1-3-19 */ {int i,k,m;

char s[80],max[80];

i=1; gets(s); strcpy(max,s);

while((k=strlen(s))!=0) /* 输入空串时结束循环 */

{ if(strcmp(max,s)<0) strcpy(max,s); /* 比较并记录最大字符串 */ gets(s); }

printf(\}

3-20.“1898─要发就发”。将不超过2004的所有素数从小到大排成第一行,第二行上的每个

数都等于它“右肩”上的素数与“左肩”上的素数之差。编程,输出第二行数中满足下列条件的整数:第二行数中若干个连续整数的和恰好是1898。

第一行:2 3 5 7 11 13 17 ..... 1997 1999 2003 第二行: 1 2 2 4 2 4 ..... 2 4 结果:输出:2,3,。。。,1987,1997,1999,2003 *******results*************

No。1:sum=1898

printf(\}

3-28.编程,输入两个字符串s1、s2,将s1复制到s2并输出s1和s2。复制时,若字符串s1

中存在缩写形式 (如: a – z ) 应转换为字符串s2中的完整形式(abcd??xyz)。“-”号之前的字符必须小于“-”号之后的字符才是合法的缩写形式。例如,s1=abc-fg,则s2=abcdefg,如果s1=abc-af,则 s2=abc-af。应能够处理任意可显示的ASCII字符。 结果:输入:asd-fge-ak1-5sj abc

输出:asdefge-ak12345sj

分析:考察s1[i-1]、s1[i]和s1[i+1],若s1[i]==?-?且s1[i-1]< s1[i+1], 则展开s1[i-1]- s1[i+1]:

复制s1[i-1]+k(k=1,2,..)到s2.,否则只复制s1[i]到s2。

#include \main()/* sj1-3-28 */ {char s1[80],s2[80]; int i=1,k,j=1;

gets(s1); gets(s2); s2[0]=s1[0];

while(s1[i]!='\\0')

{if(s1[i]=='-'&&s1[i+1]>s1[i-1]) /* 出现s1[i-1]- s1[i+1]现象 */

for(k=1;s1[i-1]+k

else s2[j++]=s1[i]; /* 未出现s1[i-1]- s1[i+1]现象,则将s1[i]复制到s2*/ ++i; /*考察下一字符 */ }

s2[j]='\\0';

printf(\}

3-29. 编程,输入字符串,输出字符串中每个字符所出现的次数。如: 输入字符串: abcedabcdcd

则输出: a=2 b=2 c=3 d=3 e=1 结果:输入:abcedabcdcd

输出:a=2 b=2 c=3 e=1 d=3 分析:s1存放字符串,s2[k]存放字符s1[k]的个数,扫描s1[i](i=0,1,…),若s1[i]==s1[k](k=0,1,..i-1),则s2[k]加1。 #include \main()/* sj1-3-29 */

{char s1[80];int s2[80]={0},i=1,k; gets(s1);s2[0]++; while(s1[i]!='\\0')

{for(k=0;k

if(s1[i]==s1[k]) {s2[k]++; break;}/* 出现相同字符,该字符数加1 */ if(k>=i) s2[i]=1;/* 出现不同字符, 该字符数为1 */ ++i; }

for(k=0;k<80;k++) /*输出字符数非0的字符s1[k]及其个数s2[k]*/

if(s2[k]!=0) printf(\printf(\}

?????????????3-30. 编程,输入一个长度不超过100的字符串,删除串中的重复字符后输出。如:

输入字符串: abacaeedabcdcd 则输出: abced 结果:输入:abacaeedabcdcd 输出:abced 分析:

#include \main()/* sj1-3-30 */ {char s1[80]; int i=1,n,k,t; gets(s1); n=strlen(s1);

while(s1[i]!='\\0')

{for(k=0;k

i++; /* 考察下一字符 */ }

printf(\}

3-31. 编程,输入一行字符串,请将其中的字符按照单词进行分割,输出该行中包含的全部

单词。(单词是用空格、\\t或\\n分割的字符串。) 结果:输入:china 123 beijing abc 输出:1: china 2: 123 3: Beijing 4: abc

分析:输入一行字符,其中含空格、跳格和换行。用inword(初值为0) 表示单词的开始或

结束(=1,开始,=0,结束)。

读入空格、跳格或换行时,表示单词结束,令inword=0,输出该单词及其序号,若遇换行,表示输出了最后一个单词,退出。 读入非空格、跳格或换行时,

若inword=0,则该字符是单词的起始字符,令inword=1,单词计数器加1(nw++;)将该字符存入s数组(以便判断输出它)。

若inword不为0,则该字符是单词的一个字符,继续将该字符存入s数组。

#include \

#define YES 1 #define NO 0

main()/* sj1-3-31 */ {int nw,k,inword; char c,s[50];

inword=NO; /* inword=NO 已处理的最后一个字符是空格或\\n */ /* inword=YES 已处理的最后一个字符不是空格或\\n */ nw=0; /* 单词计数器置0 */ while(c=getchar())

{ if(c==' '||c=='\\t'||c=='\\n')

{inword = NO; /* 如果读入空格、跳格或换行,则一个单词结束 */ printf(\输出该单词及其序号 */

if(c=='\\n') break; /* 遇换行,表示输出了最后一个单词,退出*/ }

else /* 读入的字符不是空格、跳格或换行 */ if(inword==NO) /* 如果前一个字符是空格*/

{ inword=YES; /* 则c为单词的首字符, 置inword为YES */ k=0;

s[k++]=c; /*将c记入数组s */ ++nw; /*进行单词计数 */ } else

{s[k++]=c; s[k]='\\0';} /*非单词首字符记入数组s并在串尾加\\0*/ } }

?3-32. 编程,将任一正整数转换为二进制形式。 结果:输入:144

输出:n(10)=144

n(2)=1 0 0 1 0 0 0 0

分析:用除2取余数的方法化2进制,用数组存放2进制各位数字(从高位到低位存放)。输出时从高位的第一个非0数字开始输出。

main()/* sj1-3-32 */

{ int j,n,k,a[16]={0}; scanf(\

k=15; j=n;

while(j>0) /* 将十进制数转变为二进制数 */ { a[k--]=j%2; /* 二进制数低位放后面 */ j=j/2; }

printf(\ for(k=0;a[k]==0;k++);

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

printf(\

printf(\ }

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

Top