← 返回首页
C语言基础部分编程练习题
发表时间:2024-05-21 06:31:18
编程练习题

编程习题

1.猴子摘桃子问题

猴子第一天摘下若干个桃子,当即吃了一半,还没有解馋,又多吃了一个
,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半多一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?

程序分析(逆向思维): 猴子从第一天摘下桃子后,第一天到第九天都是吃了原有桃子的一半然后又吃一个,然后第十天剩余一个桃子,那样第九天剩的桃子就等于低十天剩余的桃子加一后乘以二,然后循环九次便得到第一天摘得桃子。

#include <stdio.h>
int main()
{
    int i=9,sum=1;//i表示天数,sum表示桃子数,第十天桃子剩余一个
    for(i=9;i>0;i--)
    {
        sum=(sum+1)*2;
     } 
     printf("猴子一共采摘了%d个桃子",sum);
    return 0;
}

2.圣诞树问题

题目要求:从控制台输入圣诞树的高度,打印输出该圣诞树图形。

/*
   *
  ***
 *****
*******


 从控制台输入树高度,打印对应圣诞树。
 发现规律如下:
 每行的星星数量 = (行号*2)-1
 每行前面的空格数量 = 树的高度-行号。
**/
#include <stdio.h>

int main(void)
{

    int high = 0;
    printf("请输入圣诞树的高度:");
    scanf("%d", &high);

    for (int i = 0; i <= high; i++)
    {
        // 输出每行前面的空格
        for (int j = 0; j < high - i; j++)
        {
            printf(" ");
        }

        // 输出每行的星星。
        for (int k = 0; k < (2 * i - 1); k++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

3.百元钱买百只鸡问题

百钱百鸡问题。用100钱买100只鸡,公鸡一只五元,母鸡一只三元,小鸡三只一元,编程计算共有几种买法。

#include <stdio.h>

int main(void)
{
    int gjNum; // 公鸡的数量
    int mjNum; // 母鸡的数量
    int xjNum; // 小鸡的数量
    int iCount = 0;
    for (gjNum = 0; gjNum <= 20; gjNum++)
    {
        for (mjNum = 0; mjNum <= 33; mjNum++)
        {
            for (xjNum = 0; xjNum <= 100; xjNum++)
            {
                // 小鸡必须是3的倍数
                if (xjNum % 3 == 0)
                {
                    if (gjNum * 5 + mjNum * 3 + xjNum / 3 == 100 && gjNum + mjNum + xjNum == 100)
                    {
                        iCount++;
                        printf("公鸡买%d只,母鸡买%d只,小鸡买%d只.\n",gjNum,mjNum,xjNum);
                    }
                }
            }
        }
    }
}

4.出租车计费问题

西安出租车的起步价为9元,其中起步价包括了3公里,之后每公里收费是2.5元,晚上22:00至次日凌晨6点加收1元钱。编写程序实现输入打车的时间和距离,计算本次打车的费用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{

    int hour;//打车的时间,取整数即可。
    int distance;//打车的距离公里数
    double startPrice = 10.0; //默认起步价是10元
    double totalPrice = 0.0; //总费用
    printf("请输入打车的时间(0-23):");
    scanf("%d", &hour);
    printf("请输入打车的距离:");
    scanf("%d", &distance);

    printf("您本次打车是时间是:%d,打车的距离是:%d", hour, distance);

    if (hour >= 7 && hour <= 21)
    {
        startPrice = 9.0;
    }

    if (distance <= 3)
    {
        totalPrice = startPrice;
    }
    else
    {
        totalPrice = startPrice + (distance - 3) * 2.5;
    }

    printf("您本次打车的总费用是:%.2lf", totalPrice);
    return 0;
}

5.万年历程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 判断是否是闰年
int isRun(int year)
{
    // 年份能被4整除,并且不能被100整除,或者能被400整除的年份,称为闰年。
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        return 1;
    }
    return 0;
}

// 计算当月的总天数
int getMonthDays(int year, int month)
{
    // 默认每个月都是31天。
    int days = 31;
    // 单独判断是否是小月即可。
    switch (month)
    {
    case 2:
        // 对于二月份要特殊对待。
        if (isRun(year))
        {
            days = 29;
        }
        else
        {
            days = 28;
        }
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days = 30;
        break;
    }

    return days;
}

// 假设1900-1-1是星期一,算出这个月的第一天距离1900-1-1过了多少天
int getTotalDays(int year, int month)
{
    int totalDays = 0;
    // 循环年份
    for (int i = 1900; i < year; i++)
    {
        if (isRun(i))
        {
            totalDays += 366;
        }
        else
        {
            totalDays += 365;
        }
    }
    // 循环月份
    for (int i = 1; i < month; i++)
    {
        totalDays += getMonthDays(year, i);
    }
    totalDays++;
    return totalDays; // 这个月的第一天距离1900-1-1过了多少天。
}

void printCalendar(int week, int days)
{

    // 打印日历的表头
    printf("星期一\t\t星期二\t\t星期三\t\t星期四\t\t星期五\t\t星期六\t\t星期日\t\t\n");
    int iCount = 0; // 计数器实现遇到7就换行。
    // 循环前面的空格
    for (int i = 1; i < week; i++)
    {
        iCount++;
        printf("\t\t");
    }
    // 循环打印日历
    for (int i = 1; i <= days; i++)
    {
        printf("%d\t\t", i);
        iCount++;
        if (iCount % 7 == 0)
        {
            printf("\n");
        }
    }
}

int main(int argc, char *argv[])
{

    int year;          // 输入的年份
    int month;         // 输入的月份
    int days = 0;      // 当月的总天数。
    int totalDays = 0; // 该月的第一天距离1900-1-1过了多少天。
    int week;          // 表示这个月的第一天是星期几。
    printf("请输入年份:");
    scanf("%d", &year);
    printf("请输入月份:");
    scanf("%d", &month);
    // 计算这个月的总天数
    days = getMonthDays(year, month);
    // 计算这个月的第一天,距离1900-1-1过了多少天
    totalDays = getTotalDays(year, month);
    // 计算这个月的第一天是星期几
    week = totalDays % 7;
    // 打印日历
    printCalendar(week, days);
    return 0;
}

运行效果:

请输入年份:2024
请输入月份:5
星期一          星期二          星期三          星期四          星期五          星期六          星期日
                                1               2               3               4               5
6               7               8               9               10              11              12
13              14              15              16              17              18              19
20              21              22              23              24              25              26
27              28              29              30              31