文章目录
- C语言简介
- 八层灯塔数量问题
- 百元买鸡问题
- 比较字符串大小
- 打印九九乘法表
- 打渔晒网问题
本篇主要简单介绍一下C语言。因为本人最近有C语言的相关考试,在漫长的复习过程,总得有点乐趣吧,就顺便总结出一些有趣的C语言经典实例。
C语言简介
C语言是面向过程的一们编程语言,属于结构化语言,与目前较流行Python、C++、Java等不同,这几种是面向对象的高级语言。
但是,由于C语言是底层语言,所以占用内存少;编译快;兼容性极强,C语言程序能在大部分平台运行;非常稳定,我们用的操作系统都是C语言写的。
另外,还是因为C语言是底层的结构化语言,所以结构性非常强,像线性链表、指针、结构体等,都是C语言的特色,它们对逻辑和结构化思维的要求是相当高的。
也正是因为如此,相对于Python、C++、Java等,C语言被一些人认为是非常难学的编程语言。
下面就是我分享复习过程中的一些C语言实例……
八层灯塔数量问题
1、题:
有一个八层灯塔,每层的灯数都是上一层的2倍,共有756盏灯,求最上层与最下层的灯数。
2、分析:
(1)这个实例需要用到穷举法,假设第一层的灯数是n,第二层的灯数就是2×n,第三层就是2×2×n,以此类推。
(2)然后我们需要使用两层循环,外层循环属于穷举法,从第一层(n=1)开始,内层循环用于计算八层灯数之和。
(3)如果八层灯数之和>756则无解;<756则进入下一轮n值的循环;==756则设的n值是正确的
3、测试代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
main()
{
int n= 1, m, sum, i;
//n第一层的假设值,m每一层的灯数,sum所有灯数,i遍历八层楼以求得总灯数
while(1)
{
m= n;
sum= m;
for(i=1; i<8; i++) //遍历7次,求总灯数sum
{
m *= 2;
sum+= m;
}
if(sum>=765) //题中总灯数为765个
{
break;
}
n++;
}
if(sum== 765)
{
printf("第一层有%d盏灯,最后一层有%d盏灯。",n,m);
}else
{
printf("此题无解!");
}
}
4、测试结果:
百元买鸡问题
1、题:
100个铜钱买了100只鸡,其中公鸡一只5钱,母鸡一只3钱,小鸡一钱3只,问100只鸡中公鸡、母鸡、小鸡各多少只?
2、分析:
(1)设100只鸡中公鸡、母鸡、小鸡分别有x、y、z只;
(2)根据题意,总共不能超过100只鸡,所以公鸡x不可能超过20只,母鸡y的取值则是0—33,小鸡z的取值则是0—99
(3)然后我们用穷举的方法,遍历x、y、z所有可能的组合,得出满足条件的那几组
3、测试代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
main()
{
int x, y, z, i=0; //x是公鸡,y是母鸡,z是小鸡
for(x=0; x<20; x++)
{
for(y=0; y<33; y++)
{
for(z=0; z<99; z+=3) //小鸡一钱3只,所以小鸡的数量一定是3的倍数 ,所以每次加3
{
if((5*x+3*y+z/3 == 100) && (x+y+z)==100) //钱的总数不超过100,鸡的总数不超过100
{
i++;
printf("%d:公鸡有%d只,母鸡有%d只,小鸡有%d只。\n",i,x,y,z);
}
}
}
}
}
4、测试结果:
比较字符串大小
1、题:
在C语言中,有一个字符串比较大小函数的,叫做strcmp(串1,串2)在string.h库里面,所以使用前需要导入
2、分析:
(1)不过要注意strcmp不是比较字符串的长短,C语言中的字符串比较是一个一个字符进行比较的,比较两个字符串大小,则从第一个字符开始比较的;
(2)如果第一个字符不同,则ASCII码较大的字符所在的字符串为大,如果相同则比较下一个字符,总之比较的就是ASCII码
3、测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
//比较两个字符串大小,则从第一个字符开始比较,如果第一个字符不同
//则ASCII码较大的字符所在的字符串为大
char s1[20]; //要比较的字符串是s1和s2,另一个字符串s3是用来当中间变量的
char s2[20];
char s3[20];
puts("请输入两个字符串:");
gets(s1);
gets(s2);
if(strcmp(s1,s2)<0) //比较s1与s2的长度,若s1小于s2则返回值小于0
{ //s3用于交换s1于s2的值
strcpy(s3,s1); //将s1写到s3里面
strcpy(s1,s2);
strcpy(s2,s3);
}
printf("大的字符串:");
puts(s1); //puts函数用来输出字符串
printf("小的字符串:");
puts(s2);
}
4、测试结果:
打印九九乘法表
1、题:
这是一个比较基础的问题,用到了两个循环分别遍历1~9的数字,然就进行乘法运算
2、测试代码:
#include <stdio.h>
int main()
{
int i, j;
for(i=1; i<=9; i++)
{
for(j=1; j<=i; j++)
{
printf("%1d×%1d=%2d ",j,i,j*i);
}
printf("\n");
}
}
3、测试结果:
打渔晒网问题
1、题:
一渔夫从2020年1月1日开始,打渔三天,然后晒网两天,一直这样循环作业。现用户随意输入一天,要求得出当天是打渔还是晒网。
2、分析:
(1)首先计算输入的那天是2020年的第几天,然后求该数除以5的余数;
(2)如果余数是1、2、3,肯定就是打渔,余数是4、0就晒网,因为三天打渔两天晒网嘛;
(3)由于2020年是闰年,2月份有29天
3、测试代码:
#include <stdio.h>
#include <stdlib.h>
main()
{
int month, day, days, i; //days是总天数,day是用户输入的天数,month是用户输入端月份
printf("请输入月 日:");
scanf("%d%d",&month,&day);
days = day;
//计算总天数
for(i=1; i<month; i++) //i用来记录月份,不能超过用户输入的那个month
{
if((i<=7 && i%2!=0) || (i>=8 && i%2==0)) //表示 1、3、5、7、8、10、12这几个月(小于等于7的奇数,大于等于8的偶数)
{
days += 31;
}else if(i==2)
{
days += 29;
}else
{
days += 30;
}
}
if((days%5)<=3 && (days%5!=0))
{
printf("2020-%d-%d 渔夫应该打渔!",month,day);
}else
{
printf("2020-%d-%d 渔夫应该晒网!",month,day);
}
}
4、测试结果: