C语言程序设计:现代设计方法习题笔记《chapter6》下篇

时间:2024-10-29 07:25:40

第七题

square3.c代码

#include<stdio.h>

int main()
{	
	int i, n, odd, square;
	printf("This program prints a table of squares.\n");
	printf("Enter number of entries in table: ");
	scanf_s("%d", &n);

	i = 1;
	odd = 3;
	for (square = 1;  i <= n; odd+=2)
	{
		printf("%10d%10d\n", i, square);
		++i;
		square += odd;
	}
	return 0;
}

示例代码

#include<stdio.h>  

int main()
{
    int i, n;
    int currentSquare = 1;  // 当前平方数  
    int oddIncrement = 3;   // 每次增加的奇数  

    printf("This program prints a table of squares.\n");
    printf("Enter number of entries in table: ");
    scanf_s("%d", &n);

    for (i = 1; i <= n; ++i)
    {
        printf("%10d%10d\n", i, currentSquare);
        currentSquare += oddIncrement;
        oddIncrement += 2;  // 下一个奇数  
    }
    return 0;
}

输出

                         

第八题

代码示例

#include <stdio.h>  

int main() {
    int daysInMonth, startDay;
    int i, day = 1;

    // 获取用户输入  
    printf("Enter the number of days in month: ");
    scanf_s("%d", &daysInMonth);
    printf("Enter starting day of the week: ");
    scanf_s("%d", &startDay);

    // 输出日历标题  
    printf("Sun Mon Tue Wed Thu Fri Sat\n");

    // 输出日历前的空格  
    for (i = 1; i < startDay; i++) {
        printf("    ");
    }

    // 输出日历  
    while (day <= daysInMonth) {
        printf("%3d ", day);
        if ((day + startDay - 1) % 7 == 0) {
            printf("\n");
        }
        day++;
    }
    // 如果最后一行没有填满,则换行  
    if ((day + startDay - 2) % 7 != 0) {
        printf("\n");
    }

    return 0;
}

输出 

                ​​​​​​​         

第九题

代码示例

#include <stdio.h>  

float calculate_remaining_balance(float balance, float rate, float payment);

int main()
{
    float loan = 0.0f;
    float payment = 0.0f;
    float rate = 0.0f;
    int numberOfPayments = 0;

    // 获取用户输入  
    printf("Enter amount of loan: ");
    scanf_s("%f", &loan);
    printf("Enter interest rate (as a percentage): ");
    scanf_s("%f", &rate);
    printf("Enter monthly payment: ");
    scanf_s("%f", &payment);
    printf("Enter number of payments: ");
    scanf_s("%d", &numberOfPayments);

    // 初始化当前余额为贷款金额  
    float currentBalance = loan;

    // 输出标题  
    printf("\nPayment\tRemaining Balance\n");
    printf("---------------------------\n");

    // 循环计算每次还贷后的剩余金额  
    for (int i = 1; i <= numberOfPayments; i++)
    {
        currentBalance = calculate_remaining_balance(currentBalance, rate, payment);
        printf("%d\t\t%.2f\n", i, currentBalance);
    }

    return 0;
}

// 计算剩余金额的函数  
float calculate_remaining_balance(float balance, float rate, float payment)
{
    // 先计算一个月的利息,然后从余额中减去支付金额  
    float interestForMonth = balance * ((rate / 100.0f) / 12.0f);
    float newBalance = balance - payment + interestForMonth;
    return newBalance;
}

输出

        ​​​​​​​        ​​​​​​​         

第十题

示例代码

#include <stdio.h>  
#include <stdlib.h>  
#include <limits.h> // 用于INT_MAX  

#define MAX_DATES 100 // 定义最大日期数量  

// 日期结构体  
typedef struct {
    int month;
    int day;
    int year;
} Date;

// 函数声明  
Date findEarliestDate(Date dates[], int count);

int main() {
    Date dates[MAX_DATES];
    int count = 0;

    while (1) {
        int month, day, year;
        printf("Enter date (mm/dd/yy) (0/0/0 to end): ");
        if (scanf_s("%d/%d/%d", &month, &day, &year) != 3) {
            printf("输入错误,请重新输入。\n");
            continue;
        }

        // 检查是否为结束输入的信号  
        if (month == 0 && day == 0 && year == 0) {
            break;
        }

        // 存储日期  
        dates[count].month = month;
        dates[count].day = day;
        dates[count].year = year;
        count++;

        // 检查是否达到最大日期数量  
        if (count >= MAX_DATES) {
            printf("已达到最大日期数量限制。\n");
            break;
        }
    }

    // 如果没有输入任何日期,则不执行后续操作  
    if (count == 0) {
        printf("没有输入任何日期。\n");
        return 0;
    }

    // 找出并打印最早的日期  
    Date earliestDate = findEarliestDate(dates, count);
    printf("最早的日期是:%02d/%02d/%02d\n", earliestDate.month, earliestDate.day, earliestDate.year);

    return 0;
}

// 找出最早日期的函数  
Date findEarliestDate(Date dates[], int count) {
    Date earliest = { INT_MAX, INT_MAX, INT_MAX }; // 初始化为一个非常大的日期  

    for (int i = 0; i < count; i++) {
        if (dates[i].year < earliest.year ||
            (dates[i].year == earliest.year && dates[i].month < earliest.month) ||
            (dates[i].year == earliest.year && dates[i].month == earliest.month && dates[i].day < earliest.day)) {
            earliest = dates[i];
        }
    }

    return earliest;
}

输出

        ​​​​​​​        ​​​​​​​         

第十一题

示例代码

#include <stdio.h>  

int main() {
    int N;
    printf("请输入N的值:");
    scanf_s("%d", &N);

    // 初始化e的近似值和当前项的倒数  
    double e_approx = 1.0; // 第一项是1/0! = 1  
    double term = 1.0; // 当前项的倒数,初始化为1/1!  

    // 计算e的近似值  
    for (int n = 1; n <= N; n++) {
        term /= n; // 计算下一项的倒数  
        e_approx += term; // 累加到e的近似值中  
    }

    printf("e的近似值(使用%d项)是:%.15f\n", N, e_approx);

    return 0;
}

输出

        ​​​​​​​        

第十二题

示例代码

#include <stdio.h>  

int main() {
    int n = 0; // 初始化项数计数器  
    double epsilon; // 定义epsilon变量  
    double e_approx = 1.0; // e的近似值初始化为1.0(即第一项1/0!)  
    double term = 1.0; // 当前项的倒数,从1/1!开始  

    // 询问用户输入epsilon值  
    printf("请输入一个较小的浮点数epsilon:");
    scanf_s("%lf", &epsilon);

    // 验证输入的epsilon是否大于0  
    if (epsilon <= 0) {
        printf("输入的epsilon必须大于0。\n");
        return 1;
    }

    // 持续执行加法运算,直到当前项小于epsilon  
    while (term >= epsilon) {
        n++; // 项数计数器加1  
        term /= n; // 计算下一项的倒数(即1/n!)  
        e_approx += term; // 将当前项累加到e的近似值中  
    }

    // 输出e的近似值和达到该近似值所需的项数  
    printf("为达到小于%.15f的精度,使用了%d项。\n", epsilon, n);
    printf("e的近似值是:%.15f\n", e_approx);

    return 0;
}

输出

        ​​​​​​​        ​​​​​​​        ​​​​​​​