多人点赞　2018-12-08　12:12:31　　本篇文章是对　C语言程序设计　的50　个　小案例进行了详细的分析介绍,需要的朋友参考下　【程序1】　题目:有1、2、3、4　个　数字,能组成多少　个　互不相同且无重复数字的三位数?都是多少?　1.程序分析:可填在百位、十位、　个...　C语言程序设计50例(经典收藏)　本篇文章是对C语言程序设计的50个小案例进行了详细的分析介绍,需要的朋友参考下　【程序1】　题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?　1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去　掉不满足条件的排列。　2.程序源代码:　代码如下:　#include　int　main(){　int　i,j,k;　printf("\n");　for(i=1;i<5;i++)　/*以下为三重循环*/　for(j=1;j<5;j++)　for　(k=1;k<5;k++)　{　if　(i!=k&&i!=j&&j!=k)　/*确保i、j、k三位互不相同*/　printf("%d,%d,%d\n",i,j,k);　}　return　0;程序2】　题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高　于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提　成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于　40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于　100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?　1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。　2.程序源代码:　代码如下:　#include　int　main(){　long　int　i;　int　bonus1,bonus2,bonus4,bonus6,bonus10,bonus;　scanf("%ld",&i);　bonus1=100000*0.1;　bonus2=bonus1+100000*0.75;　bonus4=bonus2+200000*0.5;　bonus6=bonus4+200000*0.3;　bonus10=bonus6+400000*0.15;　if(i<=100000)　bonus=i*0.1;　else　if(i<=200000)　bonus=bonus1+(i-100000)*0.075;　else　if(i<=400000)　bonus=bonus2+(i-200000)*0.05;　else　if(i<=600000)　bonus=bonus4+(i-400000)*0.03;　else　if(i<=1000000)　bonus=bonus6+(i-600000)*0.015;　else　bonus=bonus10+(i-1000000)*0.01;　printf("bonus=%d",bonus);　return　0;程序3】　题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?　1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后　的结果满足如下条件,即是结果。请看具体分析:　2.程序源代码:　代码如下:　#include　#include　int　main(){　long　int　i,x,y,z;　for　(i=1;i<100000;i++)　{　x=sqrt(i+100);　/*x为加上100后开方后的结果*/　y=sqrt(i+268);　/*y为再加上168后开方后的结果*/　if(x*x==i+100&&y*y==i+268)　/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/　printf("\n%ld\n",i);　}　return　0;程序4】　题目:输入某年某月某日,判断这一天是这一年的第几天?　1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊　情况,闰年且输入月份大于3时需考虑多加一天。　2.程序源代码:　代码如下:　#include　int　main(){　int　day,month,year,sum,leap;　printf("please　input　year,month,day\n");　scanf("%d,%d,%d",&year,&month,&day);　switch(month)　/*先计算某月以前月份的总天数*/　{　case　1:sum=0;break;　case　2:sum=31;break;　case　3:sum=59;break;　case　4:sum=90;break;　case　5:sum=120;break;　case　6:sum=151;break;　case　7:sum=181;break;　case　8:sum=212;break;　case　9:sum=243;break;　case　10:sum=273;break;　case　11:sum=304;break;　case　12:sum=334;break;　default:printf("data　error");break;　}　sum=sum+day;　/*再加上某天的天数*/　if(year%400==0||(year%4==0&&year%100!=0))　/*判断是不是闰年*/　leap=1;　else　leap=0;　if(leap==1&&month>2)　/*如果是闰年且月份大于2,总天数应该加一天*/　sum++;　printf("It　is　the　%dth　day.",sum);　return　0;程序5】　题目:输入三个整数x,y,z,请把这三个数由小到大输出。　1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,　然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。　2.程序源代码:　代码如下:　#include　int　main(){　int　x,y,z,t;　scanf("%d%d%d",&x,&y,&z);　if　(x>y)　{t=x;x=y;y=t;}　/*交换x,y的值*/　if(x>z)　{t=z;z=x;x=t;}　/*交换x,z的值*/　if(y>z)　{t=y;y=z;z=t;}　/*交换z,y的值*/　printf("small　to　big:　%d　%d　%d\n",x,y,z);　return　0;程序6】　题目:用　号输出字母C的图案。　1.程序分析:可先用’　'号在纸上写出字母C,再分行输出。　2.程序源代码:　代码如下:　#include　int　main(){　printf("Hello　C-world!\n");　printf("　****\n");　printf("　*\n");　printf("　*　\n");　printf("　****\n");　return　0;程序7】　题目:输出特殊图案,请在c环境中运行,看一看,Very　Beautiful!　1.程序分析:字符共有256个。不同字符,图形不一样。　2.程序源代码:　代码如下:　#include　int　main(){　char　a=176,b=219;　printf("%c%c%c%c%c\n",b,a,a,a,b);　printf("%c%c%c%c%c\n",a,b,a,b,a);　printf("%c%c%c%c%c\n",a,a,b,a,a);　printf("%c%c%c%c%c\n",a,b,a,b,a);　printf("%c%c%c%c%c\n",b,a,a,a,b);　return　0;程序8】　题目:输出9*9口诀。　1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。　2.程序源代码:　代码如下:　#include　int　main(){　int　i,j,result;　printf("\n");　for　(i=1;i<10;i++)　{　for(j=1;j<10;j++)　{　result=i*j;　printf("%d*%d=%-3d",i,j,result);　/*-3d表示左对齐,占3位*/　}　printf("\n");　/*每一行后换行*/　}　return　0;程序9】　题目:要求输出国际象棋棋盘。　1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。　2.程序源代码:　代码如下:　#include　int　main(){　int　i,j;　for(i=0;i<8;i++)　{　for(j=0;j<8;j++)　if((i+j)%2==0)　printf("%c%c",219,219);　else　printf("　");　printf("\n");　}　return　0;程序10】　题目:打印楼梯,同时在楼梯上方打印两个笑脸。　1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。　2.程序源代码:　代码如下:　#include　int　main(){　int　i,j;　printf("\1\1\n");　/*输出两个笑脸*/　for(i=1;i<11;i++)　{　for(j=1;j<=i;j++)　printf("%c%c",219,219);　printf("\n");　}　return　0;}　【程序11】　题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月　后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?　1.程序分析:　兔子的规律为数列1,1,2,3,5,8,13,21…　2.程序源代码:　代码如下:　#include　int　main(){　long　f1,f2;　int　i;　f1=f2=1;　for(i=1;i<=20;i++)　{　printf("%12ld　%12ld",f1,f2);　if(i%2==0)　printf("\n");　/*控制输出,每行四个*/　f1=f1+f2;　/*前两个月加起来赋值给第三个月*/　f2=f1+f2;　/*前两个月加起来赋值给第三个月*/　}　return　0;程序12】　题目:判断101-200之间有多少个素数,并输出所有素数。　1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,　则表明此数不是素数,反之是素数。2.程序源代码:　代码如下:　#include#includeint　main(){　int　m,i,k,h=0,leap=1;　for(m=101;m<=200;m++)　{　k=sqrt(m+1);　for(i=2;i<=k;i++)　if(m%i==0)　{　leap=0;　break;　}　if(leap)　{　printf("%-4d",m);　h++;　if(h%10==0)　printf("\n");　}　leap=1;　}　printf("\nThe　total　is　%d",h);　return　0;程序13】　题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数　本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。　1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。　2.程序源代码:　代码如下:　#includeint　main(){　int　i,j,k,n;　printf("'water　flower'number　is:");　for(n=100;n<1000;n++)　{　i=n/100;/*分解出百位*/　j=n/10%10;/*分解出十位*/　k=n%10;/*分解出个位*/　if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)　printf("%-5d",n);　}　return　0;程序14】　题目:将一个正整数分解质因数。例如:输入90,打印出90=2　3　3*5。　程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:　(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。　(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,　重复执行第一步。　(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。　2.程序源代码:　代码如下:　#includeint　main(){　int　n,i;　printf("\nplease　input　a　number:\n");　scanf("%d",&n);　printf("%d=",n);　for(i=2;i<=n;i++)　while(n!=i)　{　if(n%i==0)　{　printf("%d*",i);　n=n/i;　}　else　break;　}　printf("%d",n);　return　0;程序15】　题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,　60分以下的用C表示。　1.程序分析:(a>b)?a:b这是条件运算符的基本例子。　2.程序源代码:　代码如下:　#includeint　main(){　int　score;　char　grade;　printf("please　input　a　score\n");　scanf("%d",&score);　grade=score>=90?'A':(score>=60?'B':'C');　printf("%d　belongs　to　%c",score,grade);　return　0;程序16】　题目:输入两个正整数m和n,求其最大公约数和最小公倍数。　1.程序分析:利用辗除法。　2.程序源代码:　代码如下:　#includeint　main(){　int　a,b,num1,num2,temp;　printf("please　input　two　numbers:\n");　scanf("%d　%d",&num1,&num2);　if(num1int　main(){　char　c;　int　letters=0,space=0,digit=0,others=0;　printf("please　input　some　characters\n");　while((c=getchar())!='\n')　{　if(c>='a'&&c<='z'||c>='A'&&c<='Z')　letters++;　else　if(c=='　')　space++;　else　if(c>='0'&&c<='9')　digit++;　else　others++;　}　printf("all　in　all:char=%d　space=%d　digit=%d　others=%d\n",letters,space,digit,others);　return　0;程序18】　题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时　共有5个数相加),几个数相加有键盘控制。　1.程序分析:关键是计算出每一项的值。　2.程序源代码:　代码如下:　#includeint　main(){　int　a,n,count=1;　long　int　sn=0,tn=0;　printf("please　input　a　and　n\n");　scanf("%d　%d",&a,&n);　printf("a=%d,n=%d\n",a,n);　while(count<=n)　{　tn=tn+a;　sn=sn+tn;　a=a*10;　++count;　}　printf("a+aa+...=%ld\n",sn);　return　0;程序19】　题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程　找出1000以内的所有完数。　程序分析:请参照程序<–上页程序14.　2.程序源代码:　代码如下:　#includeint　main(){　static　int　k[10];　int　i,j,n,s;　for(j=2;j<1000;j++)　{　n=-1;　s=j;　for(i=1;iint　main(){　float　sn=100.0,hn=sn/2;　int　n;　for(n=2;n<=10;n++)　{　sn=sn+2*hn;/*第n次落地时共经过的米数*/　hn=hn/2;　/*第n次反跳高度*/　}　printf("the　total　of　road　is　%f\n",sn);　printf("the　tenth　is　%f　meter\n",hn);　return　0;}　【程序21】　题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个　第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下　的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。　1.程序分析:采取逆向思维的方法,从后往前推断。　2.程序源代码:　代码如下:　#includeint　main(){　int　day,x1,x2;　day=9;　x2=1;　while(day>0)　{　x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/　x2=x1;　day--;　}　printf("the　total　is　%d\n",x1);　return　0;程序22】　题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定　比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出　三队赛手的名单。　1.程序源代码:　代码如下:　#includeint　main(){　char　i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/　for(i='x';i<='z';i++)　for(j='x';j<='z';j++)　{　if(i!=j)　for(k='x';k<='z';k++)　{　if(i!=k&&j!=k)　{　if(i!='x'&&k!='x'&&k!='z')　printf("order　is　a--%c\tb--%c\tc--%c\n",i,j,k)return　0;程序23】　题目:打印出如下图案(菱形)　1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重　for循环,第一层控制行,第二层控制列。　2.程序源代码:　代码如下:　#includeint　main(){　int　i,j,k;　for(i=0;i<=3;i++)　{　for(j=0;j<=2-i;j++)　printf("　");　for(k=0;k<=2*i;k++)　printf("*");　printf("\n");　}　for(i=0;i<=2;i++)　{　for(j=0;j<=i;j++)　printf("　");　for(k=0;k<=4-2*i;k++)　printf("*");　printf("\n");　}　return　0;程序24】　题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。　1.程序分析:请抓住分子与分母的变化规律。　2.程序源代码:　代码如下:　#includeint　main(){　int　n,t,number=20;　float　a=2,b=1,s=0;　for(n=1;n<=number;n++)　{　s=s+a/b;　t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/　}　printf("sum　is　%9.6f\n",s);　return　0;程序25】　题目:求1+2!+3!+…+19!的和　1.程序分析:此程序只是把累加变成了累乘。　2.程序源代码:　代码如下:　#includeint　main(){　long　long　s=0,n,t=1;　for(n=1;n<=19;n++)　{　t*=n;　s+=t;　}　printf("1+2!+3!...+19!=%lld\n",s);　return　0;程序26】　题目:利用递归方法求5!。　1.程序分析:递归公式:fn=fn_1*4!　2.程序源代码:　代码如下:　#includeint　main(){　int　i;　int　fact(int　j);　for(i=1;i<=5;i++)　printf("%d!=%d\n",i,fact(i));　return　0;}int　fact(int　j){　int　sum;　if(j==0)　sum=1;　else　sum=j*fact(j-1);　return　sum;程序27】　题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。　1.程序分析:　2.程序源代码:　代码如下:　#includeint　main(){　int　i=5;　void　palin(int　n);　palin(i);　printf("\n");　return　0;}void　palin(int　n){　char　next;　if(n<=1)　{　next=getchar();　printf("\n\0:");　putchar(next);　}　else　{　next=getchar();　palin(n-1);　putchar(next)程序28】　题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第　3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后　问第一个人,他说是10岁。请问第五个人多大?　1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道　第四人的岁数,依次类推,推到第一人(10岁),再往回推。　2.程序源代码:　代码如下:　#includeage(int　n){　int　c;　if(n==1)　c=10;　else　c=age(n-1)+2;　return(c);}int　main(){　printf("%d",age(5));　return　0;程序29】　题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。　程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法,师专数002班赵鑫提供)　2.程序源代码:　代码如下:　#includeint　main(){　long　a,b,c,d,e,x;　scanf("%ld",&x);　a=x/10000;/*分解出万位*/　b=x%10000/1000;/*分解出千位*/　c=x%1000/100;/*分解出百位*/　d=x%100/10;/*分解出十位*/　e=x%10;/*分解出个位*/　if　(a!=0)　printf("there　are　5,　%ld　%ld　%ld　%ld　%ld\n",e,d,c,b,a);　else　if　(b!=0)　printf("there　are　4,　%ld　%ld　%ld　%ld\n",e,d,c,b);　else　if　(c!=0)　printf("　there　are　3,%ld　%ld　%ld\n",e,d,c);　else　if　(d!=0)　printf("there　are　2,　%ld　%ld\n",e,d);　else　if　(e!=0)　printf("　there　are　1,%ld\n",e);　return　0;程序30】　题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。　1.程序分析:同29例2.程序源代码:　代码如下:　#includeint　main(){　long　ge,shi,qian,wan,x;　scanf("%ld",&x);　wan=x/10000;　qian=x%10000/1000;　shi=x%100/10;　ge=x%10;　if(ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/　printf("this　number　is　a　huiwen\n");　else　printf("this　number　is　not　a　huiwen\n");　return　0;}　【程序31】　题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续　判断第二个字母。　1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。　2.程序源代码:　代码如下:　#includeint　main(){　char　letter;　printf("please　input　the　first　letter　of　someday\n");　while((letter=getchar())!='Y')/*当所按字母为Y时才结束*/　{　switch　(letter)　{　case　'S':printf("please　input　second　letter\n");　if((letter=getchar())=='a')　printf("saturday\n");　else　if　((letter=getchar())=='u')　printf("sunday\n");　else　printf("data　error\n");　break;　case　'F':printf("friday\n");break;　case　'M':printf("monday\n");break;　case　'T':printf("please　input　second　letter\n");　if((letter=getchar())=='u')　printf("tuesday\n");　else　if　((letter=getchar())=='h')　printf("thursday\n");　else　printf("data　error\n");　break;　case　'W':printf("wednesday\n");break;　default:　printf("data　error\n");　}　}　return　0;程序32】　题目:Press　any　key　to　change　color,　do　you　want　to　try　it.　Please　hurry　up!　1.程序分析:2.程序源代码:　代码如下:　#include　"conio.h"#include　"stdio.h"void　main(void){　int　color;　for　(color　=　0;　color　<　8;　color++)　{　textbackground(color);/*设置文本的背景颜色*/　cprintf("This　is　color　%d\r\n",　color);　cprintf("Press　any　key　to　continue\r\n");　getch();/*输入字符看不见*程序33】　题目:学习gotoxy()与clrscr()函数　1.程序分析:　2.程序源代码:　代码如下:　#include　"conio.h"#include　"stdio.h"void　main(void){　clrscr();/*清屏函数*/　textbackground(2);　gotoxy(1,　5);/*定位函数*/　cprintf("Output　at　row　5　column　1\n");　textbackground(3);　gotoxy(20,　10);　cprintf("Output　at　row　10　column　20\n");　getch(程序34】　题目:练习函数调用　程序分析:　2.程序源代码:　代码如下:　#includevoid　hello_world(void){　printf("Hello,　world!\n");}void　three_hellos(void){　int　counter;　for　(counter　=　1;　counter　<=　3;　counter++)　hello_world();/*调用此函数*/}int　main(){　three_hellos();/*调用此函数*/　return　0;程序35】　题目:文本颜色设置　1.程序分析:　2.程序源代码:　代码如下:　#include　"stdio.h"#include　"conio.h"void　main(void){　int　color;　for　(color　=　1;　color　<　16;　color++)　{　textcolor(color);/*设置文本颜色*/　cprintf("This　is　color　%d\r\n",　color);　}　textcolor(128　+　15);　cprintf("This　is　blinking\r\n");　getch(程序36】　题目:求100之内的素数　1.程序分析:　2.程序源代码:　代码如下:　#include#include#define　N　101int　main(){　int　i,j,line,a[N],k;　for(k=2;kint　main(){　int　a[10],i,j,t;　printf("请输入10个数:");　for(i=0;i<10;i++)　scanf("%d",&a[i]);　for(i=0;i<9;i++)　for(j=0;j<9-i;j++)　if(a[j]>a[j+1])　{　t=a[j];　a[j]=a[j+1];　a[j+1]=t;　}　for(i=0;i<10;i++)　printf("%d　",a[i]);　return　0;程序38】　题目:求一个3*3矩阵对角线元素之和　1.程序分析:利用双重for循环控制输入二维数组,再将a累加后输出。　2.程序源代码:　代码如下:　#include　"stdio.h"#include　"conio.h"/*　如果使用的是TC系列编译器则可能需要添加下句　*/static　void　dummyfloat(float　*x){　float　y;　dummyfloat(&y);}main(){　float　a[3][3],sum=0;　int　i,j;　printf("please　input　rectangle　element:\n");　for(i=0;i<3;i++)　for(j=0;j<3;j++)　scanf("%f",&a[j]);　for(i=0;i<3;i++)　sum=sum+a;　printf("duijiaoxian　he　is　%6.2f",sum);　getch(程序39】　题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。　程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后　此元素之后的数,依次后移一个位置。　2.程序源代码:　代码如下:　#includeint　main(){　int　a[11]={1,4,6,9,13,16,19,28,40,100},i,j,t,d;　scanf("%d",&a[10]);　if(a[0]>a[9])　d=1;　else　d=0;　for(i=0;i<10;i++)　for(j=0;j<10-i;j++)　if(a[j]>a[j+1])　{　t=a[j];　a[j]=a[j+1];　a[j+1]=t;　}　if(d==0)　for(i=0;i<11;i++)　printf("%d　",a[i]);　else　for(i=10;i>=0;i--)　printf("%d　",a[i]);　return　0;程序40】　题目:将一个数组逆序输出。　1.程序分析:用第一个与最后一个交换。　2.程序源代码:　代码如下:　#include　"stdio.h"#include　"conio.h"#define　N　5main(){　int　a[N]={9,6,5,4,1},i,temp;　printf("\n　original　array:\n");　for(i=0;i");　scanf("%d",&num);　printf("\40:The　square　for　this　number　is　%d　\n",SQ(num));　if(num>=50)　again=TRUE;　else　again=FALSE;　}　getch(程序47】　题目:宏#define命令练习(2)　1.程序分析:2.程序源代码:　代码如下:　#include　"stdio.h"#include　"conio.h"/*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"\"*/#define　exchange(a,b)　{　\　int　t;\　t=a;\　a=b;\　b=t;\　}void　main(void){　int　x=10;　int　y=20;　printf("x=%d;　y=%d\n",x,y);　exchange(x,y);　printf("x=%d;　y=%d\n",x,y);　getch(程序48】　题目:宏#define命令练习(3)　1.程序分析:　2.程序源代码:　代码如下:　#define　LAG　>#define　SMA　<#define　EQ　==#include　"stdio.h"#include　"conio.h"void　main(){　int　i=10;　int　j=20;　if(i　LAG　j)　printf("\40:　%d　larger　than　%d　\n",i,j);　else　if(i　EQ　j)　printf("\40:　%d　equal　to　%d　\n",i,j);　else　if(i　SMA　j)　printf("\40:%d　smaller　than　%d　\n",i,j);　else　printf("\40:　No　such　value.\n");　getch(程序49】　题目:#if　#ifdef和#ifndef的综合应用。　程序分析:　2.程序源代码:　代码如下:　#include　"stdio.h"　#include　"conio.h"　#define　MAX　#define　MAXIMUM(x,y)　(x>y)?x:y　#define　MINIMUM(x,y)　(x>y)?y:x　void　main()　{　int　a=10,b=20;　#ifdef　MAX　printf("\40:　The　larger　one　is　%d\n",MAXIMUM(a,b));　#else　printf("\40:　The　lower　one　is　%d\n",MINIMUM(a,b));　#endif　#ifndef　MIN　printf("\40:　The　lower　one　is　%d\n",MINIMUM(a,b));　#else　printf("\40:　The　larger　one　is　%d\n",MAXIMUM(a,b));　#endif　#undef　MAX　#ifdef　MAX　printf("\40:　The　larger　one　is　%d\n",MAXIMUM(a,b));　#else　printf("\40:　The　lower　one　is　%d\n",MINIMUM(a,b));　#endif　#define　MIN　#ifndef　MIN　printf("\40:　The　lower　one　is　%d\n",MINIMUM(a,b));　#else　printf("\40:　The　larger　one　is　%d\n",MAXIMUM(a,b));　#endif　getch();　}　很快就　编写　程序　,定义一个书店购书的结构体类型,包括书名、单价、数量和金额　四个　元素。运行　程序　,输入一个人的购书情况:书名,单价和数量存入数组中。通过自定义sum函数计算每种书的总金额,和购书总额。根据购书总额...　qq1975728171　编写程序,定义一个书店购书的结构体类型,包括书名、单价、数量和金额四个元素。运行程序,输入一个人的购书情况:书名,单价和数量存入数组中。通过自定义sum函数计算每种书的总金额,和购书总额。根据购书总额打折,折扣规则如下:　总额≥500,折扣率为0.8　100≤总额<500,折扣率为0.9　总额<100,折扣为0。　输出书名、单价、数量、金额和购书总额,折扣后应付金额。　2.编写一个练习计算的小程序,要求:　编写加减乘除4个自定义函数add,　sub,　mul,div,在主函数中调用这4个函数去完成以下功能:　(1)系统随机生成20以内的5道四则运算题,题目的类型由系统自加,减,乘,除中任意地混合出题(即5道题目中有各种类型的题目),并把题目显示在屏幕上,用户输入答案。　(2)程序判断用户输入的答案是否正确,统计答题的正确率。运行结束时,询问是否继续练习,如果回答“Y”则继续进行练习,如果回答“N”则退出练习。　(3)把每次所做的题目和答题的准确率输出在屏幕上,同时也把每次的运行结果保存到result.txt文本文件中。　编写程序进行公民身份证信息验证,运行程序输入身份证号码,对所输入的身份证号码进行验证,验证身份证号码的校验位是否正确。如果正确,则输出该身份证的出生年月日。　身份证号码是由　18位数字及字符　X　组成的,他们分别表示:　(1)前1、2　位数字对应:所在省份的代码;　(2)第3、4　位数字对应:所在城市的代码;　(3)第5、6　位数字对应:所在区县的代码;　(4)第7~14　位数字对应:出生年、月、日;　(5)第15、16　位数字对应:所在地的派出所的代码;　(6)第17　位数字对应性别:奇数表示男性,偶数表示女性;　(7)第18　位数字是校检码:校检码可以是　0~9　的数字,也可以是罗马数字　X。　如果已经知道一个人的身份证前17位,可以通过如下步骤得到第18位:　(1)将前面的身份证号码17位数分别乘以不同的系数,从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。　(2)将这17位数字和系数相乘的结果相加。　(3)用相加结果除以11,得出余数。　(4)余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2,这就是身份证号码的校验位。　4.编写程序,从txt文件中读取7个车牌号码保存在数组中,然后从键盘再输入一个车牌号放到该数组中,从这8个车牌号中找出所有后四位是一个完全平方数的车牌号并输出。说明:一个汉字相当于二个西文字符,占用二个字节存储空间。　我可以代做,私聊我。需要某一个程序也行。　第一章　C语言程序设计　概述　c程序基本结构特点　函数与主函数　程序由一　个　或多　个　函数组成,函数由函数头和函数体构成。程序的基本组成模块是函数。　必须有且只能有一　个　主函数main()　程序执行从main开始,在...　【章节知识点概括】　第一章 　C语言程序设计概述　c程序基本结构特点　函数与主函数　程序由一个或多个函数组成,函数由函数头和函数体构成。程序的基本组成模块是函数。　必须有且只能有一个主函数main()　程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。　main函数在程序中的位置任意,可以在程序的开头、中间或者尾部。　程序语句　C程序由语句组成,用“　;　”作为语句终止符　或 　/　/后的内容 　作为注释,不能嵌套,不产生编译代码　 编译预处理不是C语言的一部分　C程序的运行步骤　运行一个C程序,从输入源程序开始,要经过编辑源程序文件(•C)、编译生成目标文件(•obj)、连接生成可执行文件(•exe)和执行四个步骤　第三章 　数据类型、运算符和表达式　标识符命名原则:　合法的要求是由字母,数字,下划线组成,并且第一个必须为字母或则是下划线。关键字不可以作为用户标识符号。　main 　define 　scanf 　printf　及其他库函数的函数名都不是关键字可以用作标识符。　If与if不同,If是可以做为用户标识符,因为C区分大小写。　基本数据类型:　基本数据类型有哪些?所占空间大小及说明符。　整型、实型、字符型常量的合法表示形式,字符串的表示形式。　a)实型数据的合法形式:小数形式和指数形式-----　尤其要注意指数形式的格式　e　前必有数,　e　后必为整数。　2.333e-1　是合法的,1e.111是非法的。　b)　字符数据的合法形式:以单引号括起来的一个字符,注意转义字符P48表3-3。　如‘\x6d’是合法的字符,ASCII码为十六进制的6d,‘\141’也合法,ASCII码为八进制141,‘\108’不合法。　c)　字符常量和字符串的区别:'a'　是字符占一个字节,　"a"是字符串占两个字节(含有一个结束符号)。　常量和变量　符号常量的定义格式:eg　#define 　PI 　3.14159 　(注意宏定义后无分号结尾)　变量的定义格式:　变量赋初值的方式。 　int　a=b=c=3;不合法　数据混合计算时数据类型的转换:P54图3-10。　强制类型转换:一定是(int)a　不是 　int(a),注意类型上一定有括号的。　注意(int)(a+b)和(int)a+b　的区别。　前是把a+b转型,后是把a转型再加b。　运算符　1.　运算符的优先级别和结合方向:　单目运算>双目运算　算术>　关系运算>逻辑运算>条件运算>赋值运算>逗号运算　2.　算术运算符:　%要求左右两边都是整型数,运算结果为余数。　/运算若左右两边都是整型数,结果为整数。　自增自减运算符,前置先自增减,再运算;后置先运算,再自增减。　自增自减运算符只能作用于变量,不能作用于常量和表达式。　如:#define　A 　3　A++;是错误写法。　3.　关系运算符:　 　a)注意赋值=与关系=　=的区别。　 　b) 　c语言中没有逻辑类型,逻辑“真”用非0表示,逻辑“假”用0表示,　 　c)　x在[a,b]间的关系表达式为x>=a　&&　x<=b,不能写为a>=x>=b。但该表达式语法成立,有运算结果。如3>=1>=5运算时从左向右依次运算,即3>=1为真,值为1,此时,表达式为1>=5,运算结果为假,值为0。所以整个1>=3>=5的值为0.　4.　逻辑运算符:　 a) 　!为单目运算符优先级别比较高　。　 b)　&&和||运算时注意　短路原则　。　5.　赋值运算符:自右向左的结合方向　 a)复合赋值运算符的使用。如a=12,则a+=a-=a*=a;运算后a的值　6.　条件运算符:(表达式1?表达式2:表达式3)　 a)结合方向从右向左。　7.　逗号运算符:优先级别最低;也叫顺序执行运算符,表达式的数值逗号最右边的那个表达式的数值。(2,3,4)的表达式的数值就是4　表达式　1.　能将数学表达式写成c表达式　2.　计算表达式的值,注意优先级别和结合方向。　第四章 　顺序程序设计　输入输出函数　printf函数的格式考查:　a)格式:printf(“格式控制串”,输出表)　 　b)输出表:要输出的数据(可以没有,多个时以“,”分隔)　格式控制串:包含两种信息　格式说明: 　%[修饰符]格式字符 　,用于指定输出格式　普通字符或转义序列:原样输出　c)修饰符m、n、l的功能:　修饰符　功能　m　输出数据域宽,数据长度b) 　常用函数:strlen 　strcat 　strcmp 　strcpy　第八章 　函数　函数定义的一般形式　1. 　类型说明符　函数名(参数类型说明 　形式参数[　,参数类型说明 　形式参数]　)　{　类型说明　 　语句　}　2.　有返回值函数中至少应有一个return语句。　3.　函数无返回值,指定它的返回为“空类型”,　空类型的说明符为“void”,此时,函数体内无return语句。　4.　在C程序中,一个函数的定义可以放在任意位置　函数说明:　1. 　格式:　 (a)类型说明符　被调函数名(类型　形参,类型　形参…);　(b)类型说明符　被调函数名(类型,类型…);　 (c)类型说明符　被调函数名();　2.　如果被调函数的返回值是整型或字符型时,　可以不对被调函数作说明,而直接调用。　3.　当被调函数的函数定义出现在主调函数之前时,可以不对被调函数作说明。　4.　对库函数的调用不需要再作说明,　但必须把该函数的头文件用include命令包含在源文件前部　函数调用:　格式:　函数名　(　实际参数表　)　。对无参函数调用时则无实际参数表。　实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。　各实参之间用逗号分隔。　函数调用时的求值顺序,各系统不同,TC环境从右向左求值。　 　void　main()　{　int　i=8;　printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i-8,7,7,8　}　函数的参数和函数的值:　 1.　函数的参数:形参和实参　a)形参变量是局部变量,只在函数内部有效,在被调用时才分配内存单元　b)实参可以是常量、变量、表达式、函数等.　(c)　实参和形参在数量上,类型上,顺序上应严格一致,否则会　“类型不匹配”　(d)　参数传递采用“单向传值”方式。形参的改变不影响实参。2.　函数的值:a)函数返回值类型和函数定义中的类型应保持一致。不一致,以函数类型为准　b)函数值为整型,在函数定义时可以省去类型说明　数组名作为函数参数:　 　1.　例:　void　nzp(int　a[],int　n)　,a后必须有[　]符合说明a是数组　2.　数组名作为函数参数时还应注意以下几点:　(a)　形参数组和实参数组的类型必须一致,否则将引起错误。　(b)　形参数组和实参数组的长度可以不相同,　3.　实参只需给出数组名即可。　函数的嵌套调用和递归调用　变量的作用域和生存周期　1.全局变量定义在所有函数外部,作用范围从变量定义位置起到文件介绍　2.静态变量　+static说明。程序运行期间空间都不释放。　第九章 　指针　指针概念:　指针变量:　1.　定义格式:类型说明符　*变量名;　2.　初始化和赋值:不允许把一个数赋予指针变量,　int　*p;p=1000;-----错误!　&运算和*运算　int　a=5,*p=&a;　p是指针,*p是p所指向的目标变量,即a　必须有且只能有一个主函数main()　程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。　指针与一维数组(常考!!)　int　a[5],*pa=a;则pa指针保存数组a的首地址,pa指向a的第一个元素。　p++,p-　-相当于p指向下一个或上一个数组元素。　加减运算　对指向数组,字符串的指针变量可以进行加减运算,如p+n,p-n,p++,p--等。对指向同一数组的两个指针变量可以相减。对指向其它类型的指针变量作加减运算是无意义的。　关系运算:　指向同一数组的两个指针变量之间可以进行大于、小于、　等于比较运算。指针可与0比较,p==0表示p为空指针。　多维数组的地址表示方法:注意区别行地址和列地址　数组名和数组指针变量都可做函数参数　相关概念:　int　*p;　p为指向整型量的指针变量　int　*p[n];　p为指针数组,由n个指向整型量的指针元素组成。　int　(*p)[n];　p为指向整型二维数组的指针变量,二维数组的列数为n　int　*p()　p为返回指针值的函数,该指针指向整型量　int　(*p)()　p为指向函数的指针,该函数返回整型量　int　**p　p为一个指向另一指针的指针变量,该指针指向一个整型量。　第十章 　结构体和共用体　结构体类型的定义　定义一个结构的一般形式为:　struct　结构名　{　成员表列　};　结构体变量的定义:一般有三种形式,常用在定义结构类型的同时说明结构变量。　例如:　struct　stu　{　int　num;　 　char　name[20];　 　char　sex;　}boy1,boy2;　 boy1,boy2就是该结构体类型的两个变量。　结构体变量的引用:　结构变量成员的一般形式　是:　结构变量名.　成员名　结构数组　数组的元素也可以是结构类型的。　因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。　在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。　结构指针变量　1.　说明的一般形式为:　struct　结构名*结构指针变量名　2.　访问的一般形式为:　(a) 　(*结构指针变量).成员名 　(b) 　结构指针变量->成员名　链表:　 　1.　概念　 建立链表的方法　第十一章　预处理命令　 宏定义　在C语言源程序中允许用一个标识符来表示一个字符串,　称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,　这称为“宏代换”或“宏展开”。　带参宏定义　1.　带参宏定义的一般形式为:　#define 　宏名(形参表)　字符串　在字符串中含有各个形参。带参宏调用的一般形式为:　宏名(实参表);　2.　在宏定义中的参数称为形式参数,　在宏调用中的参数称为实际参数。对带参数的宏,在调用中,先进行宏展开,　再用实参去代换形参。(常考,容易出错)　文件包含　1.　一般形式为:　#include"文件名"　例如:　#include"stdio.h"include"math.h"　【知识点练习】　一、选择题　1.　以下不能定义为用户标识符的是:　(A) 　INT 　 　(B)int　C) 　2int　D) 　int25　2.以下说法中正确的是　A) 　C语言程序总是从第一个定义的函数开始执行　(B) 　在C语言程序中,要调用的函数必须在main函数中定义　(C) 　C语言程序总是从main函数开始执行　(D) 　C语言程序中,main函数必须放在程序的开始部分　3.　在一个C语言程序中 A)　main函数必须出现在所有函数之前 　B)　main函数可以在任何地方出现　C)　main函数必须出现在所有函数之后 　D)　main函数必须出现在固定位置　4.以下程序运行后,输出结果是。　main(　)　{　char 　*p="123456"　;　printf("%s\n",p+2)A)123456 B)456　(C)23456 D)3456 5.以下程序运行后,输出结果是。　#define 　N 　3　#define　S(x)　 x+N　main(　)　{　printf("%d\n",S(2)　*　S(2)A)4 B)9　(C)25 D)11　6.下列程序的输出结果是　main(　)　{　int　a[10]={1　,3　,5　,　7,　9　,11　,13　,　15　,　17,　19},　*p;　p=a+4; 　printf("%d",*(p+A)5 B)7　(C)9 D)11 7.下面程序段的运行结果是。　struct　 student　{　int　 a; 　float 　b; 　char 　c;};　printf(“%d\n”,　sizeof　(struct 　student　A)7 B)4　(C)2 D)8 8.判断字符串s1是否大于字符串s2,应当使用。A)if(s1>s2)B)if(a==b)　(C)if(strcpy(s2,s1)>0)D)if(stcmp(s1,s2)>0)9.以下程序的输出结果是。　main(　)　{　int 　a=15　;　printf　(　"%d　%d\n　"　,　a　, 　a+A)16 　15 B)15　 15　(C)17　 16 D)16 　16 10.若x、i、j和k都是int型变量,计算x=(x=4,x=16,k=32)表达式后,x的值为。 　(A)4 B)　16　(C)　32　D)　52 11.执行以下语句后,a,b的值分别为。　int　 a　,b　,c　;　a=b=c=1　;　++a||++b&&++c;　(A)2　,2 B)1　,1　(C)2　,1 D)1　,2 12.下面程序段的运行结果是:　union　stu　{　int 　num;　 char　name[10]; 　float　scrose　;　};　 printf(“%d\n”,　sizeof　(union 　stu　A)18 B)16　(C)10 D)2 13.数组定义为:int　a[4][5];　引用“a[1]+3”表示的是。　(A)a数组第2行第4列元素的地址　(B)a数组第2行第4列元素的值 C)a数组第4行的首地址 　(D)a数组第1行第3个元素的地址 14.下面函数　f(double　x)　{printf(“%6d”,x);}的类型为 A.　实型 　B.　void　类型 　C.　int　类型　 　D.　均不正确　15.C语言中,简单变量做实参时,它和对应的形参之间的数据传递方式是。　(A)地址传递 B)单向值传递　(C)由实参传给形参,再由形参传递给实参　(D)同用户指定传递方式　16.若使用一维数组名作函数实参,　则以下正确的说法是 A.　必须在主调函数中说明此数组的大小　B.　实参数组类型与形参数组类型可以不匹配　C.　在被调用函数中,　不需要考虑形参数组的大小　D.　实参数组名与形参数组名必须一致　17.关于指针概念说法不正确的是 A.　一个指针变量只能指向同一类型变量　B.　一个变量的地址称为该变量的指针　C.　只有同一类型变量的地址才能放到指向该类型变量的指针变量之中　D.　指针变量可以由整数赋,　不能用浮点赋　18.在C语言中,以下说法中正确的是 A.　实参与其对应的形参各占用独立的存储单元　B.　实参与其对应的形参占用同一个存储单元　C.　只有当实参与形参同名时才占用同一个存储单元　D.　实参占用存储单元,但形参是虚拟的,不占用存储单元　19.执行语句:for(i=1;i<=9;　i++);后;　变量i的值是。A.　10 B.　9 　C.　不定 D.　11 20.以下程序的输出结果是。main()　printf　(　"%s\n"　,　ch[0]　)　;　}　A.　1111 B.　222 C.　111122233 D.　33 　21.以下程序运行后,输出结果是。define　S(x) 　x*x　main(　)　{　printf("%d\n",S(1+2))　; 　}　A.　9 B.　7 C.　5 D)6 　22.下列程序的输出结果是 main()　{　int　x,　y,　z　;　 　x=y=z=1　;　 　++x&&++y||++z　;　 　printf("%d%d%d\n",　x,　y,　z)A.1　1　1　 　B.　2　2　2 　C.　2　2　1 　D.　2　1　1 23.设int　*p[4];　则以下叙述中正确的是。A.　p是指向包含4整型元素的一维数组的指针;　B.　p是指向int型数据的指针变量;　C.　p是指向函数的指针,　该函数返回一个int型数据;D.　p是一个指针数组　24.若有说明语句:int　a,b,c,*d=&c;,则能正确从键盘读入三个整数分别赋给变量　a、b、c的语句是 A)　scanf("%d%d%d",&a,&b,d); 　 B)　scanf("%d%d%d",&a,&b,&d);　C)　scanf("%d%d%d",a,b,d)D)　scanf("%d%d%d",a,b,*d);　25.　以下定义语句中正确的是 A)char　a='A'b='B'; 　 B)float　a=b=10.0; 　C)int　a=10,*b=&a; 　D)float　*a,b=&a;　26.　设a=6,b=4,则表达式b*=a+3的值为 A)3 　B)18 　C)27 　D)36　27.有数组定义:char　array[]=”Computer”;则数组array所占的存储空间为　A)7个字节 B)　8个字节 　C)9个字节 　D)10个字节　28.已知int　a[2][3]={{1,3,5},{2,4,6}};则*(*(a+1)+2)的值是 A)6 B)3 　C)5 D)4　29.有如下程序段,其输出结果是:int　a=3;　float　b=15.6,f=1.5;　printf(“%d”,a+(int)b/2+(int)f%3);　A)10 B)11 　C)12 D)13　30.　已知int　a=5,b=7,c=3;则逻辑表达式a>1);　}　A)26 B)27) 　C)15 D)31　32.有以下程序　#include　　int　f(int　x,int　y)　{return　((y-x)*x);}　main()　{int　a=3,b=4,c=5,d;　 　d=f(f(a,b),f(a,c));　 　printf("%d",d);　}　程序运行后的输出结果是 A.　10　 B.　9　 C.　8　 D.　7 33.以下运算符中,优先级最高的运算符是 A.B.　!=　C.　*(乘号)　 D.34.经过以下语句定义后,　表达式z+=x>y?++x:++y　的值为.int　x=1,y=2,z=3;　A.　2　 B.　3　 C.　6　 D.　5 35.下列选项中正确的语句组是　A.　char　s[8];　s={"Beijing"};　B.　char　*s;　s={"Beijing"};　C.　char　s[8];　s="Beijing";　D.　char　*s;　s="Beijing";　36.以下　不正确　的叙述是 A.　在C　程序中所用的变量必须先定义后使用　B.　程序中,APH　和aph　是两个不同的变量　C.　若a　和b　类型相同,　在执行了赋值语句a=b;　后b　中的值将放入a　中,b　中的值不变　D:　当输入数值数据时,　对于整型变量只能输入整型值;　对于实型变量只能输入实型值　37.以下程序的输出结果是 main( 　)　{ 　int 　x=10,y=10,i;　for(i=0;x>8;y=++i)　printf("%d,%d 　",x-　-,y);　}　A.　10 　1 　9 　2 　 B.　9 　8 　7 　6 　C.　10 　9 　9 　0 　 D.　10 　10 　9 　1　38.若定义:int　a=511,*b=&a;,　则printf("%d\n",*b);的输出结果为　A.　确定值　 B)　a的地址　 C)　512 　 D)　511　39.能正确表示逻辑关系:"a≥　10或a≤　0"　的C　语言表达式是 A.　a>=10　or　a<=0　 B.a>=0|a<=10　 C.　a>=10&&a<=0　 D.　a>=10||a<=0　40.变量p　为指针变量,若p=&a,下列说法　不正确　的是 A.　&*p==&a　 B.　*&a==a　 C.　(*p)++==a++　 D.　*(p++)==a++　41.以下程序的输出结果是 main()　{　int　a=5,b=4,c=6,d;　printf("%d\n",d=a>b?(a>c?a:c):(b));　}　A.　5 　 B.　4 　 C.　6 　 D.　不确定　42.设有语句scanf(“%d,%d”,&m,&n);要使m、n的值依次为2,3,正确的输入是　( 　)　A.　2⊔3↙ 　B.　2,3↙ 　C.　2;3 　D.　2↙　43.C标准库函数中,字符串处理函数的原形在　 　头文件中 A.　stdio.h 　B.　math.h 　C.　string.h 　D.　ctype.h　44.以下一维数组a的正确定义是 A.　int　a(10)B.　int　n=10,a[n]; 　C.　int　n;D.　#define　N　10　scanf(“%d”,&n)int　a[N];　int　a[n];　45.已知赋值语句wang.year=2017合法;则wang的变量类型是　A.　字符或文件 　B.　整型或实型 　C.　共用或结构 　D.　实型或指针　二、程序填空题　1、下面程序的功能是:将二维数组a的行和列元素互换后存到另一个二维数组b中。请完善程序:　main()　{　int　i,j,b[3][2],a[2][3]={{1,2,3},{4,5,6}};　 　printf("array　a　:\n");　 　for(i=0;i<2;i+for(j=0;j+printf("%5d",a[i][j]b[j][i]printf("\n"printf("array　a　:\n");　 　for(i=0;i++)　 　{for(j=0;j<=1;j+printf("%5d",b[i][j]printf("\n");}　}　2、　以下程序从输入终端读入数据到数组中,统计其中正数的个数,并计算正数之和及平均值。　main()　{　int　i,a[20],count;float　ave,sum;　sum=0.0;count=0;ave=0;　for(i=0;i<20;i++)　scanf("%d"for(i=0;i<20;i++)　{　if(count++;　sum+ave=printf("sum=%f,count=%d,ave=%.2f\n",sum,count,ave);　　}　3、下列程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环。　 　int 　n=0,　ch;　 　ch=getchar(　);　 　while(if　n+c=getchar(4、　#include　　 　void　main(fp1=fopen(“file1.dat”,　“r”fp2=fopen(“file2.dat”,　“w”while(putchar(getchar(fp1)putchar(10);　 　while(!feof(fp1)fclose(fp1);　fclose(fp2);　 　}　5、　下列程序段是输出100到200之间的能被3整除的数。　 　int 　i;　 　for　(i=100;　i<201;　i++)　 　{if　printf(“%5d”,　i)6　、　用数组来处理求Fibonacci数列问题。　main( 　)　{　int 　i;for(i=2;　i<20;　i+for(i=0;　i<20;　i++)　{　if(i%3=　=0)　printf(“\n”);　printf(“%10d”　,　f[i]);　}　}　三、看程序,写结果。　1　、　下列程序的输出结果是:　main(　)　{ 　int　x=1,　y=2;　switch(x)case　0　:　 case　1　:　switch(y)case　1:　case　2:　y+=2;case　2　:　x+printf(“　%d,　%d\n”　,　x,　y)　;　}　2、下列程序的输出结果是:　main()　{　 　int　age(int 　n　);　 int　 i,　j,　k;for(i=1; 　i<=10; 　i+for(j=1; 　j<=31-i; 　j++)printf(for(k=1; 　k<=2*i-1　;　k++)printf(printf("\n"int　age(int 　n　int　c;　if(n=　=1)　c=20;　else 　c=age(n-1)+2;return(c)main(　)　{int 　x=5;　printf("%d"　,age(x)　)　;　}　3、下列程序的输出结果是:　struct　atudent　{ 　int　num;　char 　name[10];　int 　age;};　main(　)　{　struct　atudent　 a[2]={{2,”Li”,20},　{2,”zhang”,21}},*p;　 　p=a+1;printf(“%s\n”,　p->name)4、下列程序的输出结果是:　#include　void　mIn(void)　{int　i,　a[10];　int　*p;　p=a;　for　(i=0;i<10;i++)　scanf("%d",　p+if(*p%2)　printf("%3d",　*p);}　5、下列程序的输出结果是:　#include　　main()　{　 　int　i,a[10];　 　for(i=0;i<=9;i++)　 　a[i]=i;　 　for(i=10;i>=1;i--)　 　printf("%5d",a[i-1]printf("\n");　}　6、 　下列程序的输出结果是:　main()　{　char　*s="12134211";　int　v1=0,v2=0,v3=0,v4=0,k;　for(k=0;s[k];k++)　switch(s[k])　{　case　'1':　v1++;　case　'3':　v3++;break;　case　'2':　v2++;　default:　v4++;　}　printf("v1=%d,　v2=%d,　v3=%d,　v4=%d\n",v1,v2,v3,v4);　 结果:　}　7、源程序如下,运行时假定键盘输入字符串为“2017”后回车,则运行的结果为:include　void　main(void)int　n=0;char　c;while(　(c=getchar(n`　)　/*字符型数字*if　(c>=`0`&&c<=`9`n　=　n*10　+　c-　`0`　;　/*数字*printf(“value=%d\n”　,n)8、下列程序的输出结果是:　#include　main()　{　int　a=2,b=7,c=5;　switch(a>0)　{case　1:　switch(b<0)case　1:　printf("@");　break;case　2:　printf("!");　break;case　0:　switch(c=5)　{case　0:　printf("*");　break;　case　1:　printf("#");　break;　case　2:　printf("$");　break;　}　default:　printf(printf(9、下列程序的输出结果是:int 　f　(int　b[　]　,　int　m　,　int　n)　{　int 　i,　s=0;　for(i=m;　i<=n;　i++)　s=s+b[i];　return 　 s　; 　}　main()　x=f　(a　,　3　,5　);　printf("%d\n　"　,　x)　; 　}　10、若有以下程序段,执行后输出结果是　int　m=32767,n=0327,k=28,j=-32768;　printf("%d,%o,%x,%d\n",m+1,n,k,--j);　11、有以下程序执行后输出结果是　main()　{　int　p[7]={11,13,14,15,16,17,18},i=0,k=0;　while(　i<7　&&　p[i]%2　)　{　k=k+p[i];　 i++;　}　printf("%d\n",k);　}　12.　有以下程序,执行后输出的结果是:　void　f(int　x,int　y)　{　int　t;　if(x0　0 x=0x+1x2+2 x　<0　9、试编写程序求100~300间的全部素数。一行打印5个,输出格式为%6d　10、分别使用冒泡排序法和选择排序法写一个排序的函数(要求升序)。　函数首部均为:void　popSort(　int　a[],　int　n) 　11、写程序,使用下面的公式求出e的近似值。　e≈1+　1　1!　+　1　2!　+　1　3!　+　……　1　n!　+　……　(精确要求　12、编写程序,比较两个字符串的大小,不要用库函数(strcmp)。　 　若两个字符串相等,输出0,若大于输出1,小于输出-1。　13、打印100~999(包括100和999)之间的水仙花数,一行打印3个,输出格式为%6d　14、打印杨辉三角。(前10行)输出格式为%7d　15、输出1~10的阶乘　输出格式为:　1!=1　2!=2　3!=6　@[TOC]　C语言程序设计　案例式教程　欢迎指出文中错误及不足!　新的改变　我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:　全新...　C语言程序设计案例式教程　数据类型与运算符　变量的数据类型　:整形变量,实型变量,字符型变量,枚举类型变量;　(单引号内只可以存放转义字符、一个字符)　数据类型　所占字符数　char　1个字节　int　4个字节　short　2个字节　枚举类型变量:eg:enum　枚举名{标识符1=整型常量1,标识符2=整型常量　2,…}　printf()函数与scanf()函数　(1)　常用printf()函数格式字符　用格式字符　含义　注意　%s　输出一个字符串　%c　输出一个字符　ACSLL码大写字母=小写字母+32　%d　以十进制输出一个有符号整型　%u　以十进制输出一个无符号整型　eg:3为整数,3.为小数　%f　以十进制输出一个浮点数　小数类型输出默认小数点后六位　sizeof运算符可以获取数据字节数　:　sizeof(数据类型名称或变量名称)　eg:printf(“int:　%d字节\n”,sizeof(int));　格式字符串一般形式:[标志][输出最小宽度][.精度][长度]类型　(2)　scanf()函数　功能:接收用户输入,也可以通过格式控制字符控制用户输入　接收的是变量的地址　scanf("%d,%d",&a,&b)　输入数据用逗号隔开　scanf("%d%d",&a,&b)　输入数据用空格隔开　(3)算数运算符优先级　(4)位运算符　(5)关系运算符　(6)三目运算符　表达式1?表达式2:表达式3(若1为真,则为2,否则为3)　条件运算符方向:自右向左　eg:a>b?a:c>d?c:d应理解为a>b?a:(c>d?c:d),这也是三目运算符的嵌套　结构化设计程序　if语句　单分支结构:if…　双分支结构:if…else…　多分支结构:if…else　if…else…　switch条件语句(条件语句)　-　switch(表达式)-　{-　case　目标1:-　执行语句　1;-　break;-　case　目标2:-　执行语句　2;-　break;-　case　目标n:-　执行语句　n;-　break;-　default:-　执行语句　n+1;-　break;-　}　break语句(跳转语句)　终止当前循环,执行　循环体外的第一条语句　continue语句(跳转语句)　中止本次循环,并　继续执行下一次循环　;　break语句可以用于switch语句,而continnue不可以;　goto语句(跳转语句)　break语句出现在嵌套循环中的内层循环,只能跳出内层循环;如果想跳出外部循环则需要对外层循环添加标记,然后使用goto语句。　while循环语句与　do…while循环语句　循环条件的值非0,循环体就会被执行;循环体执行完毕时会继续判断循环条件,知道循环条件的值为0时,整个循环过程才会结束。　do…while循环语句与之类似。　不同的是,　do…while循环体先执行后判断(while先判断后执行)　...while(1){　scanf("%d",&choice);　switch(choice)　{　case　1:　...　break;　case　2:　...　break;　case　3:　exit(0);　break;　}}　for循环结构语句　-　for(初始化表达式;循环条件;操作表达式)随机数(rand()函数,srand()函数)　(1)rand()函数(　一次性的　)　生成一个无范围限制的随机数,只需使用rand()即可,rand()会返回一个随机数0~RAND_MAX(2147483647)。　生成某个范围的随机数:　范围　写法　0~10　rand()%10(利用函数对10取余)　5~25　rand()%20+5(利用函数对25-5=20取余再加上5)　(2)srand()　称为随机数生成的初始化器　函数原型:void　srand(unsigned　int　seed);　#include　#include　#include　int　main(){　srand((unsigned　int)time(NULL));　int　b1,　b2,　i;　b1=b2=0;　for(i=0;i<4;i++)　{　b1=b1+rand()%6+1;　b2=b2+rand()%6+1;　}　if(b1>b2)　printf("b2　go\n");　else　if(b1int　getnum(int　n){　if(n==1||n==2)　return　1;　return　getnum(n-2)+getnum(n-1);}int　main(){　printf("f(1)=%d\n",getnum(1));　printf("f(1)=%d\n",getnum(1));　printf("f(1)=%d\n",getnum(1));　printf("f(1)=%d\n",getnum(1));　printf("f(1)=%d\n",getnum(1));　printf("f(1)=%d\n",getnum(1));　return　0;}　数组　一维数组　(1)定义:数据类型　数组名[常量表达式];　eg:int　array[5];　(占据内存大小为:5*sizefo(int))　(2)初始化常见方式:　方式　举例　直接对数组中所有元素赋值　int　s[4]={1,2,3,4};　只对数组中一部分元素赋值　int　s[5]={1,2}　;　(其他元素的值会被默认设置为零)　对数组全部元素赋值　int[]={1,2,3}　(系统会根据赋值号右边初始值列表给出的初值个数自动设置数组的长度)　(3)引用方式:数组名[下标];　(4)　数组的非法操作　不能用已经初始化的数组为另一个数组赋值　eg:　int　a[3]={1,2,3};　int　b[3];　y=x;　不能对数组进行整体的输入输出,必须以元素为单位进行操作　printf()和scanf()只支持字符数组整体的输入输出　数组和数组之间不能进行比较,也不能进行运算　二维数组　(1)语法格式:类型说明符号　数组名　{常量表达式1}{常量表达式2};　(2)初始化　方式　举例　按行给二位数组赋初值　int　a[2][3]={{1,2,3},{4,5,6}};　将所有的数组元素按顺序写在一个大括号里　int　a[2][3]={1,2,3,4,5,6};　对部分数组元素赋初值　int　a[3][3]={{1},{2,3,4},{5,6}};(对没有赋值的元素,系统会自动赋值为0)　二维数组的第一个下标可省略,第二个下标不可省略　(3)引用(同一维数组一样)　数组作为函数参数　func(int　arr[3]);func(int　arr[],int　n);　必须保证形参和实参的数组类型是相同的　冒泡排序法　冒泡排序法便是最经典的排序算法之一,作为入门级排序算法,最适合编程新手学习。　对于从小到大的冒泡排序,通俗来讲;不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似。　以从小到大排序为例,分步骤讲解冒泡排序的整个过程,具体如下:　(1)从第一个元素开始,依次将相邻的两个元素进行比较,直到最后两个元素完成比较。如果前一个元素比后一个元素大,则交换位置。整个过程完成后,数组中最后一个元素就是最大值,这样便完成了第一轮的比较;　(2)除了最后一个元素,将剩余的元素继续进行两两比较,过程与第(1)步相似,这样便可以将数组中第二大的数放在倒数第二个位置;　(3)以此类推,重复上面的步骤,直到全部元素从小到大排列为止。　eg:　...void　bubblesort(int　s[],int　n){　int　i,j,temp;　for(i=0;is[j+1])　{　temp=s[j];　s[j]=s[j+1];　s[j+1]=temp;