C Primer Plus 第6版 Chapter 9 课后编程练习

本文详细解析了C语言编程中的多个经典练习题,包括最小值计算、字符矩阵打印、谐波平均数计算、指针操作等,通过具体示例帮助读者深入理解C语言的函数调用和数据处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ex9.1

// ex_9.1
#include <stdio.h>
double min(double, double);

int main(void)
{
    double num1, num2 = 0;
    printf("Enter the first number: ");
    scanf("%lf", &num1);
    printf("Enter the second number: ");
    scanf("%lf", &num2);
    printf("The smaller of %lf and %lf is %lf", num1, num2, min(num1, num2));

    return 0;
}

double min(double a, double b)
{
    return (a < b? a: b);
}

ex9.2

// ex_9.2
#include <stdio.h>
void chline(char, int, int);
int main(void)
{
    chline('*',4,6);
    return 0;
}

void chline(char ch, int i, int j)
{
    int m,n;
    for (m = 0; m < j; m++)
    {
        for (n = 0; n < i; n++)
        {
            printf("%c", ch);
        }
        printf("\n");
    }
}

ex9.3 感觉和第2题是一样的,于是偷懒,复制了第二题的代码

// ex_9.3
#include <stdio.h>
void chline(char, int, int);
int main(void)
{
    chline('*',4,6);
    return 0;
}

void chline(char ch, int i, int j)
{
    int m,n;
    for (m = 0; m < j; m++)
    {
        for (n = 0; n < i; n++)
        {
            printf("%c", ch);
        }
        printf("\n");
    }
}

ex9.4

// ex_9.4
#include <stdio.h>
double harmonic_mean(double, double);
int main(void)
{
    double num1 = 0.0;
    double num2 = 0.0;
    double result = 0.0;

    printf("Ener the first number: ");
    scanf("%lf", &num1);
    printf("Ener the second number: ");
    scanf("%lf", &num2);
    result = harmonic_mean(num1, num2);
    printf("The harmonic mean of %lf and %lf is %lf\n", num1, num2, result);

    return 0;
}

double harmonic_mean(double a, double b)
{
    return (2 / (1 / a + 1 / b));
}

ex9.5

// ex_9.5
#include <stdio.h>
void larger_of(double*, double*);

int main(void)
{
    double num1 = 0;
    double num2 = 0;

    printf("Enter the first number: ");
    scanf("%lf", &num1);
    printf("Enter the second number: ");
    scanf("%lf", &num2);

    printf("The original two numbers are %lf and %lf\n", num1, num2);
    larger_of(&num1, &num2);
    printf("After larger_of, the two number are %lf and %lf\n", num1, num2);

    return 0;
}

void larger_of(double* x, double* y)
{
    if (*x > *y)
        *y = *x;
    else
        *x = *y;
}

ex9.6

// ex_9.6
#include <stdio.h>
void sort(double*, double*, double*);
int main(void)
{
    double num1, num2, num3 = 0;
    printf("Enter the first number: ");
    scanf("%lf", &num1);
    printf("Enter the second number: ");
    scanf("%lf", &num2);
    printf("Enter the third number: ");
    scanf("%lf", &num3);
    printf("Before sort, %lf %lf %lf\n", num1, num2, num3);
    sort(&num1, &num2, &num3);
    printf("After sort, %lf %lf %lf\n", num1, num2, num3);

    return 0;
}

void sort(double* a, double* b, double* c)
{
    double temp;
    if (*b < *a)
    {
        temp = *a;
        *a = *b;
        *b = temp;
    }

    if (*c < *b)
    {
        temp = *b;
        *b = *c;
        *c = temp;
    }

    if (*b < *a)
    {
        temp = *a;
        *a = *b;
        *b = temp;
    }
}

ex9.7

 


ex9.8

 


ex9.9

 


ex9.10

// ex_9.10
#include <stdio.h>
int main(void)
{
    unsigned long number;
    int base;
    printf("Enter an integer and base(q to quit):\n");
    while (scanf("%lu %d", &number, &base) == 2)
    {
        printf("Binary equivalent: ");
        to_base_n(number, base);
        putchar('\n');
        printf("Enter an integer and base(q to quit):\n");
    }
    printf("Done.\n");

    return 0;
}

void to_base_n(unsigned long n, int b)
{
    int r;
    r = n % b;
    if (n >= b)
        to_base_n(n / b, b);
    printf("%d",r);
    return;
}

ex9.11

// ex_9.11
#include <stdio.h>
unsigned long Fibonacci(unsigned n);
int main(void)
{
    unsigned long n;
    printf("Enter a number for n of Fibonacci(n): ");
    scanf("%d", &n);
    printf("Fibonacci(%lu) is %lu", n, Fibonacci(n));
    return 0;
}

unsigned long Fibonacci(unsigned n)
{
    int j = 0;
    unsigned long fib1 = 1;
    unsigned long fib2 = 1;
    if ((n > 2) && (n % 2 == 0))
    {
        j = n / 2;
        for (int i = 1; i < j; i++)
        {
            fib1 = fib1 + fib2;
            fib2 = fib1 + fib2;
        }
        return fib2;
    }
    else if (n > 2)
    {
        j = (n + 1) / 2;
        for (int i = 1; i < j; i++)
        {
            fib1 = fib1 + fib2;
            fib2 = fib1 + fib2;
        }
        return fib1;
    }
    else
        return 1;
}

读了SICP第一章后,用Iteration(迭代)的方式又重写了一遍Fibonacci函数,相比之前的版本,这个版本更简洁,运行效率也更高。难怪大家都推荐读这本书,果然是程序员修炼内功的葵花宝典。

// ex_9.11   利用迭代的方式求fib数列
#include <stdio.h>
int Fibonacci(int);
int fib_iter(int, int ,int);
int main(void)
{
    printf("%d", Fibonacci(10));
    return 0;
}

int fib_iter(int a, int b,int count)
{
    if (count == 0)
        return a;
    else
        fib_iter(b, a+b, count-1);
}

int Fibonacci(int n)
{
    fib_iter(0, 1, n);
}

本章完

内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值