C语言练习测试考研复习题(共16页).doc
精选优质文档-倾情为你奉上1. 编写一个程序将用户输入的正整数转化为对应的二进制数。#include<stdio.h>#include<stdlib.h>intmain()intnum;printf("请输入一个正整数:");scanf("%d",&num);/异常输入直接结束if(num<0)printf("输入错误!");exit(0);/将num和2进行取余运算,存储在数组中inta20,i=0;while(num!=0)ai=num%2;num=num/2;i+;/遍历输出数组while(i>0)printf("%d",a-i);printf("n");return0;2. 请写出你所了解的linux系统中常用的命令并解释其功能。(1)pwd命令该命令的英文解释为printworkingdirectory(打印工作目录)。输入pwd命令,Linux会输出当前目录。(2)cd命令cd命令用来改变所在目录。cd/转到根目录中cd转到/home/user用户目录下cd/usr转到根目录下的usr目录中-绝对路径cdtest转到当前目录下的test子目录中-相对路径(3)ls命令ls命令用来查看目录的内容。选项含义-a列举目录中的全部文件,包括隐藏文件-l列举目录中的细节,包括权限、所有者、组群、大小、创建日期、文件是否是链接等-f列举的文件显示文件类型-r逆向,从后向前地列举目录中内容-R递归,该选项递归地列举当前目录下所有子目录内的内容-s大小,按文件大小排序-h以人类可读的方式显示文件的大小,如用K、M、G作单位ls-lexamples.doc列举文件examples.doc的所有信息(4)cat命令cat命令可以用来合并文件,也可以用来在屏幕上显示整个文件的内容。catsnow.txt该命令显示文件snow.txt的内容,ctrl+D退出cat。(5)grep命令grep命令的最大功能是在一堆文件中查找一个特定的字符串。grepmoneytest.txt以上命令在test.txt中查找money这个字符串,grep查找是区分大小写的。(6)touch命令touch命令用来创建新文件,他可以创建一个空白的文件,可以在其中添加文本和数据。touchnewfile该命令创建一个名为newfile的空白文件。(7)cp命令cp命令用来拷贝文件,要复制文件,输入命令:cp<sourcefilename><targetfilename>cpt.txtDocument/t该命令将把文件t.txt复制到Document目录下,并命名为t。3. 编写一个程序计算任一输入数字的各位数字之和。#include<stdio.h>#include<stdlib.h>intmain()intnum;printf("请输入一个正整数:");scanf("%d",&num);/异常输入直接结束if(num<0)printf("输入错误!");exit(0);intresult=0;while(num!=0)result+=num%10;num=num/10;printf("%dn",result);return0;4. 编写一个程序判断用户输入任一正整数是否为素数。#include<stdio.h>#include<stdlib.h>intmain()intnum;printf("请输入一个大于1正整数:");scanf("%d",&num);/异常输入直接结束if(num<0|num=1)printf("输入错误!");exit(0);if(num=2)printf("%d是素数。n",num);exit(0);boolflag=true;/默认判断是素数for(inti=2;i<num;i+)if(num%i=0)flag=false;/发现了其他因子,不是素数break;if(flag=true)printf("%d是素数。n",num);elseprintf("%d不是素数。n",num);return0;5. 编写一个程序求给定三个字符串的最长公共字串。(难)这里我只写了两个字符串的比较方法,三个字符串的意思是一样的。#include<stdio.h>#include<string.h>#include<stdlib.h>intlongest_common_substring(char*str1,char*str2)inti,k,len1,len2,len,s1_start,s2_start,idx,curmax,max;len1=strlen(str1);len2=strlen(str2);len=len1+len2;max=0;for(i=0;i<len;i+)s1_start=s2_start=0;if(i<len1)s1_start=len1-i;/每次开始匹配的起始位置elses2_start=i-len1;curmax=0;for(idx=0;(s1_start+idx<len1)&&(s2_start+idx<len2);idx+)if(str1s1_start+idx=str2s2_start+idx)curmax+;else/只要有一个不相等,就说明相等的公共字符断了,不连续了,/要保存curmax与max中的最大值,并将curmax重置为0/max=curmax>max?curmax:max;if(curmax>max)max=curmax;k=s1_start+idx-1;/保存连续子串长度增加时连续子串最后一个字符在str1字符串中的下标位置,/便于输出公共连续子串curmax=0;/max=curmax>max?curmax:max;if(curmax>max)max=curmax;k=s1_start+idx-1;/输出公共子串chars100;for(i=0;i<max;i+)si=str1k-max+1+i;/公共字串在str1中的下标起始位置为k-max+1,结束位置为ksi='0'printf("最长公共子串为:");puts(s);returnmax;intmain(void)charstr1100,str2100;printf("请输入第一个字符串:");gets(str1);printf("请输入第二个字符串:");gets(str2);intlen=longest_common_substring(str1,str2);printf("最长公共连续子串的长度为:%dn",len);return0;6. 编写一个程序计算用户输入的起始时间到终止时间的天数。#include<stdio.h>boolisLeapYear(intyear);intCalcDay(intyerar1,intmonth1,intday1,intyear2,intmonth2,intday2);intleapMonth12=31,29,31,30,31,30,31,31,30,31,30,31;intnormalMonth12=31,28,31,30,31,30,31,31,30,31,30,31;intmain()intyear1,year2,month1,month2,day1,day2;printf("请输入第一个日期(年月日):");scanf("%d%d%d",&year1,&month1,&day1);printf("请输入第二个日期(年月日):");scanf("%d%d%d",&year2,&month2,&day2);intsum=CalcDay(year1,month1,day1,year2,month2,day2);printf("%dn",sum);return0;/判断是否为闰年boolisLeapYear(intyear)if(year%4=0&&year%100!=0|year%400=0)returntrue;returnfalse;intCalcDay(intyerar1,intmonth1,intday1,intyear2,intmonth2,intday2)intresult=0;if(yerar1!=year2)for(inti=yerar1+1;i<year2;i+)/计算相差的整年if(isLeapYear(i)result+=366;elseresult+=365;if(isLeapYear(yerar1)for(inti=month1+1;i<=12;i+)result+=leapMonthi-1;result+=leapMonthmonth1-1-day1;if(isLeapYear(yerar1)=false)for(inti=month1+1;i<=12;i+)result+=normalMonthi-1;result+=normalMonthmonth1-1-day1;if(isLeapYear(year2)for(inti=1;i<month2;i+)result+=leapMonthi-1;result+=day2;if(isLeapYear(year2)=false)for(inti=1;i<month2;i+)result+=normalMonthi-1;result+=day2;elseif(isLeapYear(yerar1)if(month1!=month2)for(inti=month1;i<month2-1;i+)result+=normalMonthi;result+=day2+normalMonthmonth1-1-day1;elseresult+=day2-day1;elseif(month1!=month2)for(inti=month1;i<month2-1;i+)result+=normalMonthi;result+=day2+normalMonthmonth1-1-day1;elseresult+=day2-day1;returnresult;7. 编写一个程序从键盘输入圆锥体的半径r和高度h,并计算体积。#include<stdio.h>intmain()doubler,h;printf("请输入圆锥的半径:");scanf("%lf",&r);printf("请输入圆锥的高度:");scanf("%lf",&h);doublev=r*h/3;printf("该圆锥的体积为:%lfn",v);return0;8. 编写一个判定一个字符串是否为另一个字符串子字符串的程序。#include<stdio.h>#include<string.h>intcmpsubstr(chara50,charb50)inti,j,flag=-1;for(i=0;i<=(strlen(a)-strlen(b);i+)flag=i;for(j=0;j<strlen(b);j+)if(bj!=ai+j)break;if(j=strlen(b)returnflag;return-1;intmain()chara50,b50;intn;printf("输入字符串a:");gets(a);printf("输入字符串b:");gets(b);if(strlen(a)>=strlen(b)n=cmpsubstr(a,b);if(n!=-1)printf("b是a的子串,位置从a%d开始.n",n);elseprintf("b不是a的子串");elsen=cmpsubstr(b,a);if(n!=-1)printf("a是b的子串,位置从b%d开始.n",n);elseprintf("a不是b的子串");return0;9. 编写一个程序实现一个整数、长整数、浮点数和双精度浮点数除以2的计算,要求所有类型的数除以2只用一个函数。#include<stdio.h>#defineCalc(x)x/2intmain()inta;printf("请输入一个整数:");scanf("%d",&a);printf("%d运算后的结果是:%dn",a,Calc(a);printf("n");longb;printf("请输入一个长整数:");scanf("%ld",&b);printf("%ld运算后的结果是:%ldn",b,Calc(b);printf("n");floatc;printf("请输入一个浮点数:");scanf("%f",&c);printf("%f运算后的结果是:%fn",c,Calc(c);printf("n");doubled;printf("请输入一个浮点数:");scanf("%lf",&d);printf("%lf运算后的结果是:%lfn",d,Calc(d);printf("n");return0;10. 编写一个程序从键盘输入50个学生的成绩,并求出最高分、最低分、平均分。#include<stdio.h>intmain()doublescore50;for(inti=0;i<50;i+)scanf("%lf",&scorei);/求最高分和最低分doublemax=score0;doublemin=score0;for(inti=1;i<50;i+)if(max<scorei)max=scorei;if(min>scorei)min=scorei;/求平均分doubleaverage,sum=0;for(inti=0;i<50;i+)sum+=scorei;average=sum/50;printf("最高分:%lfn",max);printf("最低分:%lfn",min);printf("平均分:%lfn",average);return0;11. 一个素数,当它的数字位置对换后仍为素数,这样的数称为绝对素数,设计一个算法,求出所有的两位数的绝对素数。#include<stdio.h>boolisPrime(intnum);intExchange(intnum);intmain()for(inti=11;i<99;i+)if(isPrime(i)&&isPrime(Exchange(i)printf("%d",i);printf("n");return0;/判断一个数是否为质数boolisPrime(intnum)boolflag=true;/默认判断是素数for(inti=2;i<num;i+)if(num%i=0)flag=false;/发现了其他因子,不是素数break;returnflag;/求出对换后num的值intExchange(intnum)if(num%10!=0)/排除20,30,40.intgewei=num%10;/个位intshiwei=num/10;/十位num=gewei*10+shiwei;/个位和十位交换returnnum;12. 编写一个C程序实现两个字符串的前后连接和后前连接。#include<stdio.h>#include<string.h>#include<stdlib.h>char*Link(char*a,char*b);intmain()chara20,b20;gets_s(a);gets_s(b);char*c=Link(a,b);for(inti=0;i<strlen(c);i+)printf("%c",ci);return0;char*Link(char*a,char*b)unsignedi,j;char*c;c=(char*)malloc(strlen(a)+strlen(b)-1);/为指针c动态分配内存for(i=0;i<=strlen(a)-1;i+)ci=ai;for(j=0;j<=strlen(b);j+,i+)ci=bj;returnc;13. 编写一个复制字符串的程序。#include<stdio.h>#include<string.h>voidCopy(char*a,char*b);intmain()chara20,b20;gets_s(a);Copy(a,b);puts(b);return0;voidCopy(char*a,char*b)inti;for(i=0;i<strlen(a);i+)bi=ai;bi='0'14. 编写一个程序逆序(从大到小)重新放置数组a中的元素,a10=2,4,6,5,1,8,7,9,0,3.#include<stdio.h>intmain()inta10=2,4,6,5,1,8,7,9,0,3;inttemp,i,j;/选择排序,重要for(i=0;i<9;i+)for(j=i+1;j<10;j+)if(ai<aj)temp=ai;ai=aj;aj=temp;printf("降序:n");for(i=0;i<10;i+)printf("%d",ai);printf("n");return0;15. 写出计算机的结构并说出功能。(这道题不会,百度搜的)1.计算机由运算器、控制器、存储器、输入设备和输出设备等五大部件组成计算机硬件系统。(1)运算器:又称算术逻辑单元,用来进行算术或逻辑运算以及移位循环等操作。(2)控制器:又称控制单元,是全机的指挥控制中心。它负责把指令逐条从存储器中取出,经译码分析后向全机发出取数、执行、存数等控制命令,以保证正确完成程序所要求的功能。与运算器一起成为CPU。(3)存储器:(分为内存和外存)是计算机的存储和记忆装置,用来存放指令、原始数据、中间结果和最终结果。(4)输入、输出设备:是计算机和外界进行信息交换的桥梁。程序、数据及现场信息要通过输入设备输入给计算机;计算机的处理结果要通过输出设备输出,以便用户使用。常用的输入设备有:键盘、鼠标、扫描仪等;常用的输出设备有:显示器、打印机、绘图仪等。2.(1)计算机硬件系统:到目前为止,计算机仍沿用由冯.诺依曼首先提出的基于总线的计算机硬件系统。其基本设计思想为:a.以二进制形式表示指令和数据b.程序和数据事先存放在存储器中,计算机在工作时能够高速地从存储器中取出指令加以执行c.由运算器、控制器、存储器、输入设备和输出设备等五大部件组成计算机硬件系统。(2)计算机软件系统:所谓软件,就是为了管理、维护计算机以及为完成用户的某种特定任务而编写的各种程序的总和。计算机的工作就是运行程序,通过逐条的从存储器中取出程序中的指令并执行指令所规定的操作而实现某种特定的功能。微型计算机的软件包括系统软件和用户(应用)软件。16. 编写一个程序求出两个字符串:s="ThisisCprogrammingtext"t="ThisisatextforCprogramming"包含的最长的相同的单词。(区分大小写)说明:自左向右顺序扫描字符串s,逐个找出单词(单词开始位置和单词长度),当该单词的长度比已找到的单词更长时,就从头到尾扫描字符串t。在从t字符串中找出与该字符串长度相等、字符相同的单词后,记录下该单词的和的长度,并回到s,在其中找出下一个更长的单词。上述寻找过程直到字符串s扫描结束,最后输出找到的单词。#include<stdio.h>#include<string.h>voidmaxword(char*s,char*t);intmain()chars="ThisisCprogrammingtext"chart="ThisisatextforCprogramming"maxword(s,t);return0;voidmaxword(char*s,char*t)char*res,*temp,chs,cht;inti,j,found,maxlen=0;while(*s!='0')while(*s='')s+;for(i=0;si!=''&&si!='0'i+);if(i>maxlen)chs=si;si='0'temp=t;found=0;while(*temp!='0'&&!found)while(*temp='')temp+;for(j=0;tempj!=''&&tempj!='0'j+);if(j=i)cht=tempj;tempj='0'if(strcmp(s,temp)=0)maxlen=i;res=s;found=1;tempj=cht;temp=&tempj;si=chs;s=&si;if(maxlen=0)printf("没有相同的单词.n");elsechs=resmaxlen;resmaxlen='0'printf("%sn",res);resmaxlen=chs;17. 编写一个计算字符串长度的程序。#include<stdio.h>#include<string.h>intmain()chara100;gets_s(a);intlength;for(inti=0;ai!='0'i+)length=i+1;printf("%dn",length);return0;18. 编写求一个字符在字符串中位置的程序。#include<stdio.h>#include<string.h>intmain()chara100,b;intposition;boolflag=false;/是否查找到的标志printf("请输入字符串:");gets_s(a);printf("请输入要查找的字符:");scanf("%c",&b);for(inti=0;i<strlen(a);i+)if(ai=b)flag=true;/找到position=i+1;printf("%c是%s字符串的第%d个字符。n",b,a,position);if(flag=false)/没找到printf("未查找到该字符!n");return0;19. 编写一个程序将用户输入的由字符和非字符字符串中的数字提取出来,例如输入“asd123rt456fg789”,得到的数是123,456,789.#include<stdio.h>#include<string.h>intmain()chara100;gets(a);inti=0,j=0;for(i=0;i<strlen(a);i+)if(ai>=48&&ai<=57)/查找到一个数字for(j=i;aj>=48&&aj<=57;j+)/判断下一位是不是数字printf("%c",aj);i=j;/找到了这个数字,i要移到这个数后面的字符printf("");return0;20. 编写一个程序将用户输入的字符串进行加密和解密。说明:这里的加密方式是将字符对应的Ascll码后移五位。#include<stdio.h>#include<string.h>intmain()chara100;gets_s(a);printf("加密后:");for(inti=0;i<strlen(a);i+)ai+=5;printf("%c",ai);printf("n");printf("解密后:");for(inti=0;i<strlen(a);i+)ai-=5;printf("%c",ai);printf("n");return0;21. 你是否熟悉Unix或者Linux操作系统,指出它们与Windows系统的差异。(这个是百度的)最显着的区别是,Linux重视开源,所有系统可以是完全自行构建的系统,而Windows系统、UNIX系统是不开源的,有专门团队维护、升级。UNIX更侧重于客户端-服务器类型的大型远程连网应用,比如你要用UNIX,需要通过登录远方的服务器主机才能使用;Windows侧重单机运行,由于有微软的技术支持和服务,界面统一、操作也统一,缺点是要受强制升级的影响,开发无法自主,必须借助微软提供的开发包,对于系统是否安全无法控制,这也是政府机关不选用Win8的原因之一;Linux可以完全自主,自己可实现保证没有软件后门,免费,开源,充满活力,比前两个更适合嵌入式系统(比如手机)。专心-专注-专业