北理工C语言3.doc_第1页
北理工C语言3.doc_第2页
北理工C语言3.doc_第3页
北理工C语言3.doc_第4页
北理工C语言3.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

的3-1. 编程,任意输入10个整数,按从小到大的顺序输出。结果: 输入: 9、7、8、6、7、5,输出: 5、6、7、7、8、9。分析:用选择法排序。main()/* sj1-3-1 */ int j,k,e,t,a10; for(j=0;j10;j+) scanf(%d,&aj); for(j=0;j9;j+) t=j; for(k=j+1;kak) t=k; e=at;at=aj;aj=e; for(k=0;k10;k+) printf(%5d,ak); printf(n); 3-2. 编程,任意输入10个人的成绩,按从大到小的顺序排列。运行程序时,只要输入名次,计算机就能输出该名次对应的成绩。结果: 输入: 4、7、3、6、1、5,12,0,23,-1 输入: 4输出: The 4th is 6分析:用选择法排序。第n名是an-1。main()/* sj1-3-2 */ int j,k,e,t,n,a10;for(j=0;j10;j+) scanf(%d,&aj);printf(“nput a number:n”);scanf(“%d”,&n); for(j=0;j9;j+) t=j; for(k=j+1;kak) t=k; e=at;at=aj;aj=e; printf(“The %dth is %dn”,n,an-1); for(k=0;k10;k+) printf(%5d,ak); printf(n); 3-3. 编程,输入10个人的序号和成绩,对成绩从小到大排序,输出排序后的序号和成绩。结果: 输入: 1,10 2,9 3,8 4,7 5,6 6,7 7,8 8,9 9,12 10,0输出:10: 05: 64: 76: 73: 87: 82: 98: 91: 109: 12。分析:用选择法排序。aj0-序号,aj1-成绩。main()/* sj1-3-3 */ int j,k,e,t,a102; for(j=0;j10;j+) scanf(%d,%d,&aj0,&aj1); for(j=0;j9;j+) t=j; for(k=j+1;kak1) t=k; e=at0;at0=aj0;aj0=e; e=at1;at1=aj1;aj1=e; for(k=0;k10;k+) printf(%5d : %5dn ,ak0,ak1); printf(n); 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: 108: 92: 97: 83: 86: 74: 75: 610: 0分析:用选择法排序。aj0-序号,aj1-成绩。main()/* sj1-3-4 */ int j,k,e,t,a102; for(j=0;j10;j+) scanf(%d,%d,&aj0,&aj1); for(j=0;j9;j+) t=j; for(k=j+1;k10;k+) if(at1ak1) t=k; e=at0;at0=aj0;aj0=e; e=at1;at1=aj1;aj1=e; for(k=0;k10;k+) printf(%5d : %5dn ,ak0,ak1); printf(n); 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分析:用选择法排序。aj0-序号,aj1-成绩。交换时aj0、aj1一起交换。main()/* sj1-3-5 */ int j,k,e,t,a102; for(j=0;j10;j+) scanf(%d,%d,&aj0,&aj1); for(j=0;j9;j+) t=j; for(k=j+1;k10;k+) if(at1ak1) t=k; e=at0;at0=aj0;aj0=e; e=at1;at1=aj1;aj1=e; printf(%5d : %5d %5d : %5dn,a00,a01,a10,a11); printf(%5d : %5d %5d : %5dn,a90,a91,a80,a81); 3-6. 编程,输入10个整数,然后进行查找。输入要查找的整数,若找到,则输出该数在数组中的下标位置,否则输出“can not found!”。结果:输入:12 23 43 21 56 7 9 4 33 67(a数组的内容) 56(要找的数) 输出:56=a4 65(要找的数) 输出:65 can not found!分析:用数组存放10个整数,对10个整数循环,输出找到的整数及其在数组中的下标。main()/* sj1-3-6 */ int j,n,a10;for(j=0;j10;j+) scanf(%d,&aj);printf(“nput a number:n”);scanf(“%d”,&n); for(j=0;j=10) printf(“ %d can not found!n”,n); 3-7编程,输入一个字符串并删除其中的指定字符。例如,对于字符串abcdcf,指定删除c,则结果为:abdf。结果:输入:abcdcf和c 输出:abdf分析:输入一个字符串s和要删除的字符ch,从字符串首开始逐个字符检查,每遇ch则将后面的字符向前移动一个位置覆盖要删字符ch.#include string.h#include stdio.hmain()/* sj1-3-7 */ int j,k; char a80,ch; gets(a); printf(input a character:n); scanf(%c,&ch); j=0; while(aj!=0) if(ch=aj) for(k=j;ak!=0;k+) ak=ak+1; j+; puts(a); 3-8. 编程,输入一行字符,将其反序后再输出。结果:输入abcdefg, 输出:gfedcba分析:输入n个字符到a数组,aj与an-j-1互换(j=0,1,2,n/2-1)。#include string.h#include stdio.hmain()/* sj1-3-8 */ int j,k,n; char a80,ch; gets(a); n=strlen(a); for(j=0;jn/2;j+) ch=aj; aj=an-1-j; an-1-j=ch; puts(a); 3-9. 编程,输入一行字符,将其中的每个字符从小到大排列后输出。结果:输入:china 输出: achin分析:用选择法对字符数组进行排序。#include stdio.h#include string.hmain()/* sj1-3-9 */ int j,k,t,n; char a80,e; printf(nput a string:n); scanf(%s,a); n=strlen(a); for(j=0;jn-1;j+) t=j; for(k=j+1;kak) t=k; e=at;at=aj;aj=e; printf(%sn,a); 3-10. 编程,输入一行字符,将其中的每个字符从大到小排列后输出。结果:输入:china 输出: nihca分析:用选择法对字符数组进行排序。#include stdio.h#include string.hmain()/* sj1-3-10 */ int j,k,t,n; char a80,e; printf(input a string:n); scanf(%s,a); n=strlen(a); for(j=0;jn-1;j+) t=j; for(k=j+1;kn;k+) if(atak) t=k; e=at;at=aj;aj=e; printf(%sn,a); 3-11. 编程,找出一个二维数组中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。二维数组也可能没有鞍点。结果: 输入 n=4,m=4 1 2 3 4 5 5 5 5 5 5 5 5 5 5 5 5 输出: 鞍点为a03=4。 (2)输入 n=4,m=4 5 5 5 5 5 5 5 5 5 5 5 5 0 3 2 1 输出: 鞍点为a31=3。分析:找出i行最大值所在的列号k(i=0,1,n), 若aik是k列最小,则aik是鞍点。也可能没有鞍点。 main()/* sj1-3-11 */ int i,j,l,n,m,k,a2020; printf(Please enter n,m=); scanf(%d,%d,&n,&m); /* 输入数组的行数n和列数m */ for(i=0;in;i+) /* 输入a数组元素 */ for(j=0;jm;j+) printf(a%d%d=,i,j); scanf(%d,&aij); for(i=0;in;i+) /* 输出a数组各元素 */ for(j=0;jm;j+) printf(%6d,aij); printf(n); for(i=0;in;i+) /* 找鞍点 */ for(j=0,k=0;jaik) k=j; * 找出i行最大值所在的列号k */ for(l=0;ln;l+) /* 判断aik是否为该列最小 */if(alkaik) break; /* aik不是该列最小(l=n) /* 没有比aik小的数 */ printf(Point:a%d%d=%d,i,k,aik); 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分析:用选择法排序。aj0-序号,aj1名次。aj2- 成绩main()/* sj1-3-12 */ int j,k,e,t,a103; for(j=0;j10;j+)scanf(%d,&aj2); aj0=aj1=j+1; for(j=0;j9;j+) t=j; for(k=j+1;k10;k+) if(at2ak2) t=k; e=at0;at0=aj0;aj0=e; e=at2;at2=aj2;aj2=e; aj1=j+1; /* 置名次 */ t= a01; for(k=1;k10;k+) /* 相同成绩,名次也一样 */ if(ak-12= ak2) ak1=t; else ak1=+t; for(k=0;k10;k+) printf(%5d : %5d %5dn, ak1,ak0,ak2); 3-13. 编程,输出所有不超过(取n256)的、其平方具有对称性质的正整数(也称为回文数)。结果: 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=1255),将j*j的各位数字放入数组,输出具有对称性质的j. main()/* sj1-3-13 */ int e,f,c,t,n=0,a10; long j,k; for(j=1;j0) at+=k%10;k=k/10; for(c=0,e=t-1;c=e) printf(%d: %ld*%ld=%ldn,+n,j,j,j*j); 3-14. 编程,输入两个已经按从小到大顺序排列好的字符串,将两个字符串合并为一个新的从小到大排列字符串并输出。结果:输入:13579 24acf 输出:1234579acf分析1:先将两个字符串合并成一个字符串,然后按从小到大排序。 #include string.h #include stdio.h main( ) /* sj1-3-14 */ char a80,b80; int i,j=0,k,t; gets(a); gets(b); printf(“a=%s,b=%sn”a,b); while(aj!=0) j+; /* 找a串尾 */ i=0;while(bi!=0) aj+= bi+; /* b串接在a串尾 */ k=strlen(a); for(i=0;ik-1;i+) t=i; for(j=i+1;jaj) t=j; p=ai;ai=at;at=p; printf(“a=a+b=%sn”,a); 分析2:对b串的每个字符bi在a串中找插入位置j,将aj,aj+1,aj+2,均向后移动1个位置,然后将bi存入aj.直到b串的每个字符均插入完毕为止。 #include string.h #include stdio.h main( ) /* sj1-3-14 */ char a80,b80; int i,j,k; gets(a); gets(b); for(i=0;bi!=0;i+) /* a,b合并到a */ j=0; while(bi=aj&aj!=0) j+; /* 找bi在a中的插入位置j */ if(aj=0) aj=bi;aj+1=0; else for(k=strlen(a)+1;kj;k-) ak=ak-1; /* 将ak向后移1个位置 */ aj=bi; /* 将bi存入aj */ puts(a); 3-15. 编程,输入两个已经按从小到大顺序排列好的字符串,合并两个字符串,使合并后的字符串中字符从大到小排列并输出。结果:输入:13579 24acf 输出:fca9754321分析:先将两个字符串合并成一个字符串,然后按从大到小排序。 #include string.h #include stdio.h main( ) /* sj1-3-15 */ char a80,b80; int i,j,k,t,p; gets(a); gets(b); printf(a=%s,b=%sn,a,b); strcat(a,b); /* b串接在a串尾 */ k=strlen(a); for(i=0;ik-1;i+) t=i; for(j=i+1;jk;j+) if(ataj) t=j; p=ai;ai=at;at=p; printf(a=a+b=%sn,a); 3-16 编程,输入两个字符串s1和s2,在s1中删除任何s2中有的字符。例如,s1:“abc123ad”,s2:“a1”,则输出“bc23d”。结果:输入:abc123ad a1 输出:bc23d分析:对s2中每个字符s2i到s1中寻找它,将s1中出现的所有s2i均删除。若s1j应删除,则用s1j后面的字符向前移动的方法覆盖s1j,达到删除s1j的目的。#include string.h #include stdio.h main( ) /* sj1-3-16 */ char s180,s280; int i,j,k; gets(s1); gets(s2); for(i=0;s2i!=0;i+) /* 删除s1中的与s2i相同的字符 */ j=0; while(s1j!=0) /* 在s1中找s2i并删除 */ if(s2i=s1j) /* 找到s1j,用向前移动的方法覆盖s1j */ for(k=j;kstrlen(s1);k+) s1k=s1k+1; /* 将s1j+1s1尾(0)向前移1个位置,删除s1j */ 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,若si=sn-i-1(i=0,1,n/2),则为回文。#include stdio.h main()/* sj1-3-17 */ char s80; int p,n; gets(s); p=0; n=strlen(s); while(p=n/2) printf(%s YESn,s); 3-18. 编程,输入若干个字符串,当输入字符串的长度为0时停止输入。输出最长的字符串。结果:输入:chinaBeijingChongqingShanhai 输出:max=Chongqing分析:用循环输入各字符串并求其长度,找最大长度并输出相应字符串。输入空串(长度为0)时结束循环。#include stdio.h#include string.hmain( ) /* sj1-3-18 */int i,k,m; char s80,max80; i=1; gets(s); m=0; while(k=strlen(s)!=0) /* 输入空串时结束循环 */ if(km) m=k;strcpy(max,s); /* 比较并记录最长字符串 */ gets(s); printf(max=%sn,max);3-19. 编程,输入若干个字符串,当输入字符串的长度为0时停止输入,输出最大字符串。结果:输入:ChinaBeijingChongqingShanhai 输出:max= Shanhai分析:用循环输入各字符串并求其长度,找最大字符串并输出。输入空串(长度为0)时结束循环。#include stdio.h#include string.hmain( ) /* sj1-3-19 */int i,k,m; char s80,max80; i=1; gets(s); strcpy(max,s); while(k=strlen(s)!=0) /* 输入空串时结束循环 */ if(strcmp(max,s)0) strcpy(max,s); /* 比较并记录最大字符串 */ gets(s); printf(max=%sn,max);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=18982+2+4+2+。+4+2+10+12No。2:sum=18986+2+6+4+。+18+2+16+2No。3:sum=18988+4+2+4+。+2+22+6+8No。4:sum=18982+4+2+4+。+8+6+4+2分析:用循环求2004内的素数并将相邻两个素数之差记入a数组(设为k个元素),再用循环检测从ai开始的若干a数组元素之和是否为1898(i=0,1,2,k),若是,则输出这些素数。 #include main()/* sj1-3-20 */ int i,j,k=0,p,n,m=2,s,r=0,a2004; printf(%4d ,m); for(i=3;i=2004;i+ ) /* 找素数i,产生第二行的数i-m并存入a数组*/ for(j=2;j=i-1;j+) if(i%j=0) break; if(j=i) printf(%4d , i ); /* 当前素数i,m是上一个素数 */ ak+=i-m; /* 产生第二行的数i-m */ m=i; printf(n*results*n); for(i=0;ik;i+) s=0; for(j=i;j=1898) n=i;m=j;break; if(s=1898) /* anam的和为1898,输出*/ printf(No.%d:sum=%dn,+r,s); for(p=n;p=j;p-)/* 从串尾到sj的字符均向后移动一个位置 */ s1p+1=s1p; s1j=s2t; /* s1j初插入s2t */ j+; /* 下一个插入位置 */ t+; /* s2的下一个插入字符下标 */ printf(s1=%sn,s1); 3-23.任意输入一个4位自然数,输出该自然数的各位数字组成的最大数。例如,输入1593,则输出为9531。结果:输入:1593 输出:9531分析:将4位数的各位数字存入数组,然后对数组进行从大到小排序,再组成新的4位数: a0*1000+a1*100+a2*10+a3 main()/*sj1-3-23 */int n,i,j,k,t,a4;scanf(%d,&n); a0=n/1000;a1=n/100%10;a2=n/10%10;a3=n%10; for(i=0;i3;i+) /* 从大到小排序 */ k=i; for(j=i+1;jak) k=j; t=ai; ai =ak; ak=t; printf(max=%dn,a0*1000+a1*100+a2*10+a3);3-24. 编程,输入两个已经按从小到大顺序排列好的字符串,将两个字符串合并为一个新的从小到大排列字符串,并删除重复的字符,然后输出该字符串。结果:输入:134578 356789 输出:13456789分析:先合并字符串到s1,并对s1中字符排序。然后检测各字符,与前一字符不同者存入s2,相同者不存入s2。#include stdio.h#include string.hmain( ) /* sj1-3-24 */int i,j,k,n,t; char s180,s280; gets(s1); gets(s2); strcat(s1,s2); n=strlen(s1); for(i=0;in-1;i+) /* 从小到大排序 */ k=i; for(j=i+1;jn;j+) if(s1js1k) k=j; t=s1i; s1i =s1k; s1k=t; i=j=1; s20=s10; while(s1i!=0) if(s1i-1!=s1i) s2j+=s1i+; else i+; /* s1中互不相同的字符送入s2数组 */ printf(s=%sn,s2);3-25. 编程,输入五个字符串,请将它们按从小到大的顺序排列后输出。结果:输入:chinabeijingtianjingnanjingshanghai输出:beijing chinananjingshanghaitianjing分析:将5个字符串存入2维数组s,将各字符串所在行号存入一维数组a,用选择法排序,确定最小串时将最小串的行号ak与a0交换。故字符串按从大到小顺序将其行号排列在数组a中。然后按数组a依次输出各字符串。for(j=0;jn; j+) printf(%sn, saj);#include stdio.hmain( )/* sj1-3-25 5个字符串从小到大排序 */char s520; int i, j, k, m, n=5, a5; for(i=0;in;i+) gets(si);ai=i; /* 输入各串并在a中记录行号*/ for(i=0;in-1;i+) /* 选择法排序 */ k=i; /*设最小串行号为ai,用k记录其下标*/ for(j=i+1;j0) k=j; /*k记录最小串行号aj的下标*/ m=ak;ak=ai;ai=m; for(i=0;in;i+)/*按排序后的行号输出各字符串 */ printf(n%-sn, sai );3-26. 编程,输入五个字符串,请将它们按从大到小的顺序排列后输出。结果:输入:chinabeijingtianjingnanjingshanghai输出:tianjing shanghainanjingchinabeijing分析:将5个字符串存入2维数组s,将各字符串所在行号存入一维数组a,用选择法排序,确定最小串时将最小串的行号ak与a0交换。故字符串按从大到小顺序将其行号排列在数组a中。然后按数组a依次输出各字符串。for(j=0;jn; j+) printf(%sn, saj);#include stdio.hmain( )/* sj1-3-26 5个字符串从大到小排序 */char s520; int i, j, k, m, n=5, a5; for(i=0;in;i+) gets(si);ai=i; /* 输入各串并在a中记录行号*/ for(i=0;in-1;i+) /* 选择法排序 */ k=i; /*设最大串行号为ai,用k记录其下标*/ for(j=i+1;jn;j+) if(strcmp(sak,saj)0) k=j; /*k记录最大串行号aj的下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论