经典C语言程序100例_第1页
经典C语言程序100例_第2页
经典C语言程序100例_第3页
经典C语言程序100例_第4页
经典C语言程序100例_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

经典C语言程序100例说明:所有程序均遵循ANSIC标准,可直接在VC6.0、Dev-C++等编译器中运行,代码包含详细注释,兼顾初学者理解和实际应用,按“基础语法→循环判断→数组字符串→函数指针→进阶算法”的顺序排列,逐步提升难度。第一部分:基础入门(1-10例)——熟悉语法与输入输出例1:HelloWorld(最基础程序)题目:编写程序,在屏幕上输出“Hello,CLanguage!”。分析:C语言程序的入口是main()函数,printf()是标准输入输出库中的输出函数,需引入头文件stdio.h。c

#include<stdio.h>//引入标准输入输出头文件,用于printf函数

intmain(){//主函数,程序执行的起点

printf("Hello,CLanguage!\n");//输出字符串,\n表示换行

return0;//主函数返回0,表示程序正常结束

}运行结果:Hello,CLanguage!例2:输入输出整数题目:从键盘输入一个整数,将其输出到屏幕,并显示该整数的2倍值。分析:使用scanf()函数接收键盘输入,%d是整数的格式控制符,变量需先声明再使用。c

#include<stdio.h>

intmain(){

intnum;//声明一个整型变量num,用于存储输入的整数

printf("请输入一个整数:");//提示用户输入

scanf("%d",&num);//接收键盘输入,&num表示取num的地址,将输入值存入num

printf("你输入的整数是:%d\n",num);//输出输入的整数

printf("该整数的2倍是:%d\n",num*2);//输出整数的2倍

return0;

}运行结果:请输入一个整数:10

你输入的整数是:10

该整数的2倍是:20例3:计算两个整数的和、差、积、商题目:从键盘输入两个整数,计算并输出它们的和、差、积、商(忽略小数部分)。分析:使用算术运算符+、-、*、/,注意整数除法会自动舍弃小数部分,需确保除数不为0(本案例暂不处理异常,后续案例完善)。c

#include<stdio.h>

intmain(){

inta,b;//声明两个整型变量,存储输入的两个整数

intsum,sub,mul,div;//声明变量,存储和、差、积、商

printf("请输入两个整数(用空格分隔):");

scanf("%d%d",&a,&b);//一次输入两个整数

sum=a+b;//计算和

sub=a-b;//计算差

mul=a*b;//计算积

div=a/b;//计算商(整数除法)

printf("和:%d+%d=%d\n",a,b,sum);

printf("差:%d-%d=%d\n",a,b,sub);

printf("积:%d*%d=%d\n",a,b,mul);

printf("商:%d/%d=%d\n",a,b,div);

return0;

}运行结果:请输入两个整数(用空格分隔):154

和:15+4=19

差:15-4=11

积:15*4=60

商:15/4=3例4:判断奇偶数题目:从键盘输入一个整数,判断该数是奇数还是偶数。分析:利用取余运算符%,若一个数对2取余等于0,则为偶数,否则为奇数。c

#include<stdio.h>

intmain(){

intnum;

printf("请输入一个整数:");

scanf("%d",&num);

//if-else条件判断,判断余数是否为0

if(num%2==0){

printf("%d是偶数\n",num);

}else{

printf("%d是奇数\n",num);

}

return0;

}运行结果:请输入一个整数:28→28是偶数

请输入一个整数:17→17是奇数例5:求三个整数中的最大值题目:从键盘输入三个整数,找出其中的最大值并输出。分析:使用嵌套if-else语句,先比较前两个数,得到较大值,再与第三个数比较,最终得到最大值;也可使用三目运算符简化代码。c

#include<stdio.h>

intmain(){

inta,b,c,max;

printf("请输入三个整数(用空格分隔):");

scanf("%d%d%d",&a,&b,&c);

//方法1:嵌套if-else

if(a>b){

if(a>c){

max=a;

}else{

max=c;

}

}else{

if(b>c){

max=b;

}else{

max=c;

}

}

//方法2:三目运算符(简化写法)

//max=(a>b)?((a>c)?a:c):((b>c)?b:c);

printf("三个数中的最大值是:%d\n",max);

return0;

}运行结果:请输入三个整数(用空格分隔):123527→三个数中的最大值是:35例6:无重复数字组数题目:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?并求出个数。分析:可填在百位、十位、个位的数字都是1、2、3、4,通过三重循环遍历所有排列,再去掉数字重复的情况即可,用计数器统计符合条件的三位数总数。c

#include<stdio.h>

intmain(){

inti,j,k;//分别代表百位、十位、个位的数字

intcount=0;//计数器,记录符合条件的三位数总数

printf("所有互不相同的三位数:\n");

//百位循环:i从1到4

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

//十位循环:j从1到4

for(j=1;j<=4;j++){

//个位循环:k从1到4

for(k=1;k<=4;k++){

//检查三个数字是否互不相同

if(i!=j&&i!=k&&j!=k){

//组合成三位数:例如i=1,j=2,k=3→123

intnumber=i*100+j*10+k;

printf("%d",number);

count++;//每找到一个符合条件的数,计数器加1

}

}

}

}

//输出总数

printf("\n总共有%d个符合条件的三位数。\n",count);

return0;

}运行结果:所有互不相同的三位数:123124132134142143213214231234241243312314321324341342412413421423431432

总共有24个符合条件的三位数。例7:区间利润提成计算题目:企业发放的奖金根据利润提成,规则如下:利润(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,求应发放奖金总数。分析:利用数轴分界定位利润区间,通过if-elseif-else语句分段计算奖金,需将奖金定义为双精度浮点型(double),保证计算精度。c

#include<stdio.h>

intmain(){

doubleprofit;//输入的利润(单位:万元)

doublebonus=0.0;//初始化奖金总额

printf("请从键盘输入当月利润(万元):");

scanf("%lf",&profit);//注意:输入双精度浮点数用%lf

//根据利润区间分段计算奖金

if(profit<=10){

bonus=profit*0.10;

}elseif(profit<=20){

bonus=10*0.10+(profit-10)*0.075;

}elseif(profit<=40){

bonus=10*0.10+10*0.075+(profit-20)*0.05;

}elseif(profit<=60){

bonus=10*0.10+10*0.075+20*0.05+(profit-40)*0.03;

}elseif(profit<=100){

bonus=10*0.10+10*0.075+20*0.05+20*0.03+(profit-60)*0.015;

}else{

bonus=10*0.10+10*0.075+20*0.05+20*0.03+40*0.015+(profit-100)*0.01;

}

printf("应发放奖金总额为:%.2f万元\n",bonus);//保留两位小数

return0;

}运行结果:请输入当月利润(万元):15→应发放奖金总额为:1.38万元

请输入当月利润(万元):30→应发放奖金总额为:2.00万元

请输入当月利润(万元):150→应发放奖金总额为:4.45万元例8:完全平方数求解题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?分析:假设该数为x,可得x+100=n²,x+268=m²,两式相减得m²-n²=168,因式分解为(m+n)(m-n)=168;m和n均为整数,因此m+n和m-n均为168的因数,且两者同奇同偶(因m和n为整数),结合168为偶数,可确定两者均为偶数,遍历所有符合条件的因数对即可求解。c

#include<stdio.h>

intmain(){

inti,j,m,n,x;

//遍历所有可能的i值(i和j均为偶数,且i*j=168)

for(i=2;i<=168;i+=2){

if(168%i==0){//检查i是否是168的因数

j=168/i;//计算对应的j

if(j%2==0&&j>=2){//检查j是否为偶数且≥2

//计算m和n

m=(i+j)/2;

n=(i-j)/2;

//计算x并验证条件(n需为正整数)

if(n>0){

x=n*n-100;

//输出结果并验证

printf("找到符合条件的数:x=%d\n",x);

printf("验证:x+100=%d(%d²),x+268=%d(%d²)\n\n",x+100,n,x+268,m);

}

}

}

}

return0;

}运行结果:找到符合条件的数:x=21

验证:x+100=121(11²),x+268=289(17²)

找到符合条件的数:x=261

验证:x+100=361(19²),x+268=529(23²)

找到符合条件的数:x=1581

验证:x+100=1681(41²),x+268=1849(43²)例9:输出指定范围的素数题目:编写程序,输出100~200之间的所有素数(素数:大于1的整数,除了1和它本身,不能被其他数整除)。分析:对于每个数n,判断其是否为素数,可通过遍历2到√n之间的数,若n能被其中任意一个数整除,则不是素数;否则是素数,√n可通过n的平方根简化遍历范围,提高效率。c

#include<stdio.h>

#include<math.h>//引入数学头文件,用于sqrt()函数

intmain(){

intn,i,flag;//flag为标志位,1表示素数,0表示非素数

printf("100~200之间的素数有:\n");

//遍历100到200之间的所有整数

for(n=100;n<=200;n++){

flag=1;//初始假设当前数是素数

//遍历2到sqrt(n),判断是否能整除n

for(i=2;i<=sqrt(n);i++){

if(n%i==0){//若能整除,说明不是素数

flag=0;

break;//跳出循环,无需继续判断

}

}

if(flag==1){//若flag为1,说明是素数,输出

printf("%d",n);

}

}

printf("\n");

return0;

}运行结果:100~200之间的素数有:101103107109113127131137139149151157163167173179181191193197199例10:计算n的阶乘题目:从键盘输入一个正整数n,计算n的阶乘(n!=n×(n-1)×(n-2)×...×1,0!=1)。分析:使用for循环,从1遍历到n,逐步累乘得到阶乘结果;注意阶乘增长较快,n较大时需使用longlong类型,避免溢出。c

#include<stdio.h>

intmain(){

intn,i;

longlongfactorial=1;//阶乘结果可能很大,用longlong类型

printf("请输入一个正整数:");

scanf("%d",&n);

//判断输入是否为正整数

if(n<0){

printf("错误:请输入正整数!\n");

}elseif(n==0){

printf("0!=1\n");

}else{

//循环累乘,计算n!

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

factorial*=i;//等价于factorial=factorial*i

}

printf("%d!=%lld\n",n,factorial);

}

return0;

}运行结果:请输入一个正整数:5→5!=120

请输入一个正整数:10→10!=3628800第二部分:循环与条件进阶(11-20例)——掌握循环嵌套与复杂判断例11:打印九九乘法表题目:编写程序,打印标准的九九乘法表(9行9列)。分析:使用双重for循环,外层循环控制行数(1~9),内层循环控制列数(1~当前行数),每一行输出完成后换行。c

#include<stdio.h>

intmain(){

inti,j;//i控制行数,j控制列数

//外层循环:行数从1到9

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

//内层循环:列数从1到当前行数i

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

//格式化输出,%2d保证对齐,避免排版混乱

printf("%d×%d=%2d",j,i,i*j);

}

printf("\n");//每一行结束后换行

}

return0;

}运行结果:1×1=1

1×2=22×2=4

1×3=32×3=63×3=9

...(省略中间行)

1×9=92×9=183×9=27...9×9=81例12:判断闰年题目:从键盘输入一个年份,判断该年份是否为闰年。分析:闰年判断规则:能被4整除但不能被100整除,或者能被400整除;两个条件满足一个即为闰年。c

#include<stdio.h>

intmain(){

intyear;

printf("请输入一个年份:");

scanf("%d",&year);

//闰年判断条件

if((year%4==0&&year%100!=0)||(year%400==0)){

printf("%d年是闰年\n",year);

}else{

printf("%d年不是闰年\n",year);

}

return0;

}运行结果:请输入一个年份:2024→2024年是闰年

请输入一个年份:2025→2025年不是闰年

请输入一个年份:2000→2000年是闰年

请输入一个年份:1900→1900年不是闰年例13:求斐波那契数列前n项题目:斐波那契数列:1,1,2,3,5,8,13...(从第3项开始,每一项等于前两项之和),输入n,输出前n项。分析:使用循环,定义三个变量a、b、c,分别存储前两项和当前项,逐步迭代计算,避免使用递归(递归效率低)。c

#include<stdio.h>

intmain(){

intn,i;

inta=1,b=1,c;//a和b初始化为前两项,c存储当前项

printf("请输入斐波那契数列的项数n:");

scanf("%d",&n);

//判断输入是否合法

if(n<=0){

printf("错误:请输入正整数!\n");

}elseif(n==1){

printf("斐波那契数列前1项:%d\n",a);

}elseif(n==2){

printf("斐波那契数列前2项:%d,%d\n",a,b);

}else{

printf("斐波那契数列前%d项:%d,%d",n,a,b);

//从第3项开始,循环计算到第n项

for(i=3;i<=n;i++){

c=a+b;//当前项=前两项之和

printf(",%d",c);

a=b;//更新前两项,a变为原来的b

b=c;//b变为原来的c

}

printf("\n");

}

return0;

}运行结果:请输入斐波那契数列的项数n:8→斐波那契数列前8项:1,1,2,3,5,8,13,21例14:水仙花数求解题目:输出100~999之间的所有水仙花数(水仙花数:一个三位数,其各位数字的立方和等于该数本身,如153=1³+5³+3³)。分析:遍历100~999之间的所有三位数,拆分出百位、十位、个位数字,计算三者的立方和,若等于原数,则为水仙花数。c

#include<stdio.h>

intmain(){

intn,hundreds,tens,units;//hundreds百位,tens十位,units个位

printf("100~999之间的水仙花数有:\n");

for(n=100;n<=999;n++){

hundreds=n/100;//取百位数字(如153/100=1)

tens=(n/10)%10;//取十位数字(如153/10=15,15%10=5)

units=n%10;//取个位数字(如153%10=3)

//判断是否为水仙花数

if(hundreds*hundreds*hundreds+tens*tens*tens+units*units*units==n){

printf("%d",n);

}

}

printf("\n");

return0;

}运行结果:100~999之间的水仙花数有:153370371407例15:求1~n的累加和(循环实现)题目:输入一个正整数n,用循环计算1+2+3+...+n的和。分析:使用for循环,从1遍历到n,将每个数累加到sum变量中,最终输出sum。c

#include<stdio.h>

intmain(){

intn,i,sum=0;//sum初始化为0,用于存储累加和

printf("请输入一个正整数n:");

scanf("%d",&n);

if(n<=0){

printf("错误:请输入正整数!\n");

}else{

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

sum+=i;//等价于sum=sum+i

}

printf("1+2+...+%d=%d\n",n,sum);

}

return0;

}运行结果:请输入一个正整数n:100→1+2+...+100=5050例16:判断一个数是否为回文数题目:输入一个整数,判断该数是否为回文数(回文数:正读和反读都相同的数,如121、12321)。分析:将输入的数反转,若反转后的数与原数相等,则为回文数;注意处理负数(负数一定不是回文数)和末尾为0的数(如120,反转后为21,不相等)。c

#include<stdio.h>

intmain(){

intnum,original,reverse=0,remainder;

printf("请输入一个整数:");

scanf("%d",&num);

original=num;//保存原数,用于后续比较

//处理负数(负数不是回文数)

if(num<0){

printf("%d不是回文数\n",num);

return0;

}

//反转数字

while(num!=0){

remainder=num%10;//取末尾数字

reverse=reverse*10+remainder;//构建反转后的数

num=num/10;//去掉末尾数字

}

//比较原数和反转后的数

if(original==reverse){

printf("%d是回文数\n",original);

}else{

printf("%d不是回文数\n",original);

}

return0;

}运行结果:请输入一个整数:121→121是回文数

请输入一个整数:123→123不是回文数

请输入一个整数:-121→-121不是回文数

请输入一个整数:12321→12321是回文数例17:打印菱形图案题目:编写程序,打印一个由星号(*)组成的菱形,行数为7(上半部分4行,下半部分3行)。分析:使用双重for循环,外层循环控制行数,内层循环控制空格和星号的数量;上半部分,空格数递减,星号数递增;下半部分,空格数递增,星号数递减。c

#include<stdio.h>

intmain(){

inti,j,k;//i控制行数,j控制空格,k控制星号

//上半部分:4行,星号数1、3、5、7

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

//打印空格(4-i个),用于居中

for(j=1;j<=4-i;j++){

printf("");

}

//打印星号(2i-1个)

for(k=1;k<=2*i-1;k++){

printf("*");

}

printf("\n");//换行

}

//下半部分:3行,星号数5、3、1

for(i=3;i>=1;i--){

//打印空格(4-i个)

for(j=1;j<=4-i;j++){

printf("");

}

//打印星号(2i-1个)

for(k=1;k<=2*i-1;k++){

printf("*");

}

printf("\n");//换行

}

return0;

}运行结果:*

***

*****

*******

*****

***

*例18:计算两个数的最大公约数(GCD)题目:输入两个正整数,计算它们的最大公约数(最大公约数:能同时整除两个数的最大整数)。分析:使用辗转相除法(欧几里得算法):用较大数除以较小数,得到余数,再用除数除以余数,重复此过程,直到余数为0,此时的除数即为最大公约数。c

#include<stdio.h>

intmain(){

inta,b,temp;

printf("请输入两个正整数(用空格分隔):");

scanf("%d%d",&a,&b);

//确保a>=b,若不是则交换

if(a<b){

temp=a;

a=b;

b=temp;

}

//辗转相除法

while(b!=0){

temp=a%b;//求余数

a=b;//更新a为原来的b

b=temp;//更新b为余数

}

printf("两个数的最大公约数是:%d\n",a);

return0;

}运行结果:请输入两个正整数(用空格分隔):1824→两个数的最大公约数是:6

请输入两个正整数(用空格分隔):1525→两个数的最大公约数是:5例19:计算两个数的最小公倍数(LCM)题目:输入两个正整数,计算它们的最小公倍数(最小公倍数:能同时被两个数整除的最小正整数)。分析:最小公倍数与最大公约数的关系:LCM(a,b)=(a×b)/GCD(a,b),因此先计算最大公约数,再代入公式

温馨提示

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

评论

0/150

提交评论