【C语言经典小程序(二)】

1.三个数从小到大输出

#include <stdio.h>
void main(){
    int a,b,c,t;
    printf("enter 3 int nums:\n");
    scanf("%d%d%d",&a,&b,&c);
    if (a>b) {
        t=a;
        a=b;
        b=t;
    }
    if (a>c) {
        t=a;
        a=c;
        c=t;
    }
    if (b>c) {
        t=b;
        b=c;
        c=t;
    }
    printf("排序后的序列:%d,%d,%d\n",a,b,c);
}

2.猴子吃桃问题

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10 天早上想再吃时,发现只剩下一个桃子了。求猴子第一天摘了多少个桃子。

#include <stdio.h>
void main(){
    int d,x1,x2;
    d=9;
    x2=1;
    while (d>0) {//d=9
        x1=(x2+1)*2;//x2=x1/2-1,第一轮循环得到的x1是第九天的桃子数
        x2=x1;
        d--;
    }
    printf("第一天摘了%d个桃子\n\n",x1);
    
}

3.百钱买百鸡问题

鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

#include <stdio.h>
void main(){
    int cock,hen,chick;//公鸡,母鸡,小鸡
    for (cock=0; cock<=20; cock++) {//0≤公鸡≤20
        for (hen=0; hen<=33; hen++) {//0≤母鸡≤33
            for (chick=3; chick<=99; chick++) {//3≤小鸡≤99,不能大于99是因为要买百鸡,而且必须是3的倍数
                if (5*cock+3*hen+chick/3==100) {//百钱
                    if (cock+hen+chick==100) {//百鸡
                        if (chick%3==0) {//小鸡是3的倍数
                            
                        printf("公鸡:%d,母鸡:%d,小鸡:%d\n",cock,hen,chick);
                    }
                 } 
                }
            }
        }
    }
}

4.渔夫打渔晒网问题

如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2011 1 月 1日以后的任意一天,输出该渔夫是在打渔还是在晒网。

#include <stdio.h>
int leap(int a){
    if (a%4==0&&a%100!=0||a%400==0) {//判断闰年
        return 1;//是闰年
    }
    else
        return 0;//不是闰年
}

int number(int year,int month,int day){
    int sum=0,i,j,k;
    int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
    int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年
    if (leap(year)==1) {//闰年
        for (i=0; i<month-1; i++) {
            sum+=b[i];
        }
    }
    else{//不是闰年
        for (i=0; i<month-1; i++) {
            sum+=a[i];
        }
    }
    for (j=2011; j<year; j++) {
        if (leap(j)==1) {//闰年366
            sum+=366;
        }
        else//平年365
            sum+=365;
    }
    sum+=day;
    return sum;
}

void main(){
    int year,month,day,n;
    printf("输入年月日:\n");
    scanf("%d%d%d",&year,&month,&day);
    n=number(year, month, day);
    if ((n%5)<4&&(n%5>0)) {//余数是1或2或3时说明在打渔,否则在晒网
        printf("%d:%d:%d\t打渔\n",year,month,day);
            }
    else
        printf("%d:%d:%d\t晒网\n",year,month,day);
}

5.希尔排序算法

希尔排序的思想是使数组中任意间隔为h的元素都是有序的。这样的数组被称为h有序数组。
说一下插入排序,有前插和后插之分,前插法是把第一个元素当作一个有序数列,然后依次扫描后面的元素,插入到前面的有序数列之中。
记录按下标的一定增量分组,对每一组进行插入排序,增量逐渐减少,最后增量减少至1,整个数组被分成一组,得到排列好的数组。
一开始,我们选择增量gap=length/2,然后缩小增量gap=gap/2…这里的增量序列是希尔建议的增量,但这个增量序列并不是最优的。
在这里插入图片描述
希尔排序的时间复杂度为O(n*logn);

#include <stdio.h>
void shell_sort(int a[],int length){
    int i,j,k;
    int gap;//分组步长
    int temp;//哨兵
    for (gap=length/2; gap>0; gap=gap/2) {
        for (i=0; i<gap; i++) {
            for (j=i+gap; j<length; j=j+gap) {
                if (a[j]<a[j-gap]) {
                    temp=a[j];
                    k=j-gap;
                    while (k>=0&&a[k]>temp) {
                        a[k+gap]=a[k];
                        k=k-gap;
                    }
                    a[k+gap]=temp;
                }
            }
        }
    }
}
void main(){
    int a[10]={49,38,65,97,76,13,27,49,55,4},i;
    shell_sort(a, sizeof(a)/sizeof(int));
    printf("排序后的序列:\n");
    for (i=0; i<10; i++) {
        printf("%4d",a[i]);
    }
    printf("\n");
}

**

6.冒泡排序

**

每一轮比较得出一个最大的数放在末尾。

#include <stdio.h>
void main(){
    int a[]={9,8,7,6,2,3,5,0,1};
    int n;
    int i;
    int j;
    int t;
    n=sizeof(a)/sizeof(a[0]);
    for (i=0; i<n-1; i++) {//外层循环控制循环n-1轮
        for (j=0; j<n-1-i; j++) {//每轮比较n-1-i次
            if (a[j]>a[j+1]) {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    for (i=0; i<n; i++) {
        printf("%4d",a[i]);
    }
    printf("\n");  
}

**

7.直接插入排序算法

**

插入排序:把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。
直接插入排序:将待插入的记录与有序区中的各记录自右向左依次比较其关键字的大小。

#include <stdio.h>
void sort(int s[],int n){
    int i,j;
    for (i=2; i<=n; i++) {
        s[0]=s[i];
        j=i-1;
        while (s[0]<s[j]) {
            s[j+1]=s[j];
            j--;
        }
        s[j+1]=s[0];
    }
}
void main(){
    int a[11],i;
    printf("enter 10 nums:\n");
    for (i=1; i<=10; i++) {
        scanf("%d",&a[i]);
    }
    sort(a, 10);
    printf("sorted nums:\n");
    for (i=1; i<=10; i++) {
        printf("%4d",a[i]);
    }
    printf("\n");
}

**

8.快速排序算法

**

1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的。

#include <stdio.h>
void  qusort(int s[],int start,int end)    //自定义函数 qusort()
{
    int i,j;    //定义变量为基本整型
    i=start;    //将每组首个元素赋给i
    j = end;    //将每组末尾元素赋给j
    s[0]=s[start];    //设置基准值
    while(i<j)//直到让基准值左边的都比他小,右边的都比他大
    {
        while(i<j&&s[0]<s[j]){
        j--;    //位置左移,一直找,直到遇到比s[0]小(或者相等)的数
        }
        //遇到比s[0]小(或者相等d)的数
        if(i<j)
        {
            s[i]=s[j]; //将s[j]放到s[i]的位置上
            i++;    //位置右移
        }
        while(i<j&&s[i]<=s[0])
            i++;    //位置左移
        if(i<j)
        {
            s[j]=s[i];    //将大于基准值的s[j]放到s[i]位置
            j--;    //位置左移
        }
    }
    s[i]=s[0];    //将基准值放入指定位置,是i还是j都可以,因为这时i=j
    if (start<i)
        qusort(s,start,i-1);    //对分割出的部分递归调用qusort()函数
    if (i<end)
        qusort(s,i+1,end);
}

void  main()
{
    int a[11], i;    //定义数组及变量为基本整型
    printf("请输入10个数:\n");
    for(i=1;i<=10;i++)
        scanf("%d",&a[i]);    //从键盘中输入10个要进行排序的数
    qusort(a,1,10);    //调用qusort()函数进行排序
    printf("排序后的顺序是:\n");
    for(i=1;i<=10;i++)
        printf("%5d",a[i]);    //输出排好序的数组
    printf("\n");
}

**

9.选择排序法

**

在每一次的排序中选出最小(或最大)的数,将其放在数组最前端,然后在后面的数中重复此步骤,最终达到排序的目的.

#include <stdio.h>
void main(){
    int i,j,t,a[11];
    printf("enter 10 nums:\n");
    for (i=1; i<11; i++) {
        scanf("%d",&a[i]);
    }
    for (i=1; i<=9; i++) {
        for (j=i+1; j<=10; j++) {
            if (a[i]>a[j]) {//把a[i]跟每个a[j]比
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
    for (i=1; i<11; i++) {
        printf("%4d",a[i]);
    }
    printf("\n");
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种非常有趣和强大的编程语言,可以用来开发各种小程序。通过编写C语言小程序,我们可以更好地理解计算机的工作原理,提高编程能力并增强逻辑思维能力。 通过C语言,我们可以实现许多有趣的小程序。例如,我们可以编写一个简单的游戏,让玩家通过键盘操作控制角色移动,并在屏幕上显示精美的图形。这样的小程序不仅能够娱乐我们,还可以提升我们的编程技能和解决问题的能力。 另外,我们还可以用C语言编写一个简单的多功能计算器。这个小程序可以实现加减乘除等基本运算,还可以添加其他高级功能,如求平方根、求绝对值等等。通过编写这样的小程序,我们可以更好地理解算法和数学运算,并将其应用到解决实际问题中。 除了游戏和计算器,我们还可以用C语言编写其他有趣的小程序,如日历应用、文件管理器和简单的绘图工具等。这些小程序可以帮助我们更好地理解编程语言和操作系统的原理,并提升我们的编程能力。 总之,C语言是一种非常有趣和强大的编程语言,通过编写C语言小程序,我们可以锻炼自己的编程能力,增强对计算机原理的理解,同时也可以体验到编程带来的乐趣。无论是初学者还是有一定编程基础的人,都可以通过编写C语言小程序来提高自己的编程水平,并享受编程带来的乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值