C Primer Plus第六版第十六章编程题目与参考答案⭐

1.开发一个包含你需要的预处理器定义的头文件。
参考答案:

//Func.h
#ifndef FUNC_H
    #define FUNC_H

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

    #define QUIT    0
    #define SPACE    ' '
    #define END 'q'
    #define SIZE    20

#endif

2.两数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数的平均值,最后取计算结果的
倒数。使用#define指令定义一个宏“函数”,执行该运算。编写一个简单的程序测试该宏。

#include <stdio.h>
#define HMEAN(X, Y) (2.0 * (X) * (Y) / ((X) + (Y)))

int main(void)
{
    double x, y, ans;

    printf("请输入2个数(按q退出本程序):");
    while (scanf("%lf %lf", &x, &y) == 2)
    {
        ans = HMEAN(x, y);
        printf("%g和%g的调和平均数是:%g\n", x, y, ans);
        printf("您可以再次输入2个数(或按q退出):");
    }
    puts("本程序完成!");

    return 0;
}

3.极坐标用向量的模(即向量的长度)和向量相对×轴逆时针旋转的角度来描述该向量。直角坐标用
向量的x轴和y轴的坐标来描述该向量(见图16.3)。编写一个程序,读取向量的模和角度(单位:度),然后显示x轴和y轴的坐标。相关方程如下:

x = rcos A y = rsin A
需要一个函数来完成转换,该函数接受一个包含极坐标的结构,并返回一个包含直角坐标的结构(或返回指向该结构的指针)。
在这里插入图片描述

#include <stdio.h>
#include <math.h>
#define PI 3.1415926

typedef struct
{
    double length;
    double angle;
} polar;

typedef struct
{
    double x;
    double y;
} rect;

rect polar_to_rect(const polar *temp);

int main(void)
{
    polar input;
    rect answer;

    printf("请输入一个向量长度和一个旋转角度(按q退出本程序): ");
    while (scanf("%lf %lf", &input.length, &input.angle) == 2)
    {
        answer = polar_to_rect(&input);
        printf("斜边:%g\n角度:%g°\n", input.length, input.angle);
        printf("x轴坐标:%g\ny轴坐标:%g\n", answer.x, answer.y);
        printf("您可以再次输入(或按q退出): ");
    }
    puts("本程序完成!");

    return 0;
}

rect polar_to_rect(const polar *temp)
{
    rect res;
    static const double rad = PI / 180.0;
    double ang = rad * temp->angle;

    res.x = temp->length * sin(ang);
    res.y = temp->length * cos(ang);

    return res;
}

4.ANSI库这样描述clock ()函数的特性:
#include <time.h>
clock_t clock (void) ;
这里,clock_t是定义在time.h 中的类型。该函数返回处理器时间,其单位取决于实现(如果处理器时间不可用或无法表示,该函数将返回-1)。然而,CLOCKs_PER_SEC(也定义在time.h中)是每秒处理器时间单位的数量。因此,两个clock()返回值的差值除以CLOCKs_PER_SEC得到两次调用之间经过的秒数。在进行除法运算之前,把值的类型强制转换成double类型,可以将时间精确到小数点以后。编写一个函数,接受一个double类型的参数表示时间延迟数,然后在这段时间运行一个循环。编写一个简单的程序测试该函数。

#include <stdio.h>
#include <time.h>

void delay(const double second);

int main(void)
{
    double n;

    printf("请您输入一个正整数(按q退出本程序):");
    while (scanf("%lf", &n) == 1)
    {
        delay(n);
        printf("您可以再次输入一个正整数(或按q退出):");
    }
    puts("本程序完成!");

    return 0;
}

void delay(const double second)
{
    clock_t start = clock();
    clock_t end = clock();

    while (((double)(end - start) / CLOCKS_PER_SEC) < second)
    {
        end = clock();
    }
    printf("时间延迟了%g秒\n", (double)(end - start) / CLOCKS_PER_SEC);
    return;
}

5.编写一个函数接受这些参数:内含int类型元素的数组名、数组的大小和一个代表选取次数的值。
该函数从数组中随机选择指定数量的元素,并打印它们。每个元素只能选择一次(模拟抽奖数字或挑选陪审团成员)。另外,如果你的实现有time( )(第12章讨论过)或类似的函数,可在srand ()中使用这个函数的输出来初始化随机数生成器rand ()。编写一个简单的程序测试该函数。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define LEN 30

void random_pick(int ar[], int length, int picks);

int main(void)
{
    int i, pick;
    int choices[LEN];

    for (i = 0; i < LEN; i++)
    {
        choices[i] = i + 1;
    }
    printf("请您输入您想选择元素的个数(按q退出本程序): ");
    while (scanf("%d", &pick) == 1)
    {
        if (pick > LEN || pick <= 0)
        {
            printf("数据有误! 请重新输入: ");
            continue;
        }
        random_pick(choices, LEN, pick);
        printf("您可以再次输入(或按q退出): ");
    }
    puts("本程序完成!");

    return 0;
}

void random_pick(int ar[], int length, int picks)
{
    int count = 0;
    int i, br[length];

    memcpy(br, ar, length * sizeof(int));
    srand((unsigned int)time(0));
    printf("您挑选的%d个数字是:\n", picks);
    while (picks > 0)
    {
        i = rand() % length;
        if (0 == br[i])
        {
            continue;
        }
        else
        {
            printf("%-8d", br[i]);
            br[i] = 0;
            --picks;
        }
        if (++count % 10 == 0)
        {
            putchar('\n');
        }
    }
    putchar('\n');
    return;
}

6.修改程序清单16.17,使用struct names元素(在程序清单16.17后面的讨论中定义过),而不
是double类型的数组。使用较少的元素,并用选定的名字显式初始化数组。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 40
#define SLEN 5

struct names
{
    char first[LEN];
    char last[LEN];
};

int comp(const void *p1, const void *p2);
void show_names(const struct names *p, int n);

int main(void)
{
    struct names staff[SLEN] =
    {
        {"Francy, card"},
        {"Coffee, cancy"},
        {"Stephen, lory"},
        {"Jack, rosery"},
        {"Black, clover"}
    };
    puts("Random list:");
    show_names(staff, SLEN);
    qsort(staff, SLEN, sizeof(struct names), comp);
    puts("\nSorted list:");
    show_names(staff, SLEN);

    return 0;
}

int comp(const void *p1, const void *p2)
{
    const struct names *ps1 = (const struct names *)p1;
    const struct names *ps2 = (const struct names *)p2;
    int res;

    res = strcmp(ps1->last, ps2->last);
    if (res != 0)
    {
        return res;
    }
    else
    {
        return strcmp(ps1->first, ps2->first);
    }
}

void show_names(const struct names *p, int n)
{
    int i = 0;

    while (i < n)
    {
        i++;
        printf("%s %s\n", p->first, p->last);
        p++;
    }
    return;
}

7.下面是使用变参函数的一个程序段:

#include <stdio.h>
#include <stdlib.h>#include <stdarg.h>
void show_array (const double ar [], int n);
double * new_d_array (int n, ... );

int main ()
{
	double * pl;double * p2;
	p1 = new_d_array (51.22.33.4,4.5,5.6);
	p2 = new_d_array(4100.020.008.08-1890.o) ;
	show_array(p1,5);show_array(p2,4);free(pl) ;
	free(p2) ;
	return 0;
}

new_d_array()函数接受一个int类型的参数和double类型的参数。该函数返回一个指针,指向由malloc()分配的内存块。int类型的参数指定了动态数组中的元素个数,double类型的值用于初始化元素(第1个值赋给第1个元素,以此类推)。编写show_array()和new_d_array()函数的代码,完成这个程序。

参考答案:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void show_array(const double ar[], int n);
double *new_d_array(int n, ...);

int main()
{
    double *p1;
    double *p2;

    p1 = new_d_array(5, 1.2, 2.3, 3.4, 4.5, 5.6);
    p2 = new_d_array(4, 100.0, 20.00, 8.08, -1890.0);
    show_array(p1, 5);
    show_array(p2, 4);
    free(p1);
    free(p2);

    return 0;
}

void show_array(const double ar[], int n)
{
    int i;

    printf("%d个元素是:\n", n);
    for (i = 0; i < n; i++)
    {
        printf("%-8g", ar[i]);
    }
    putchar('\n');
    return;
}

double *new_d_array(int n, ...)
{
    int i;
    va_list ap;
    double *pt;

    va_start(ap, n);
    pt = (double *)malloc(n * sizeof(double));
    for (i = 0; i < n; i++)
    {
        pt[i] = va_arg(ap, double);
    }
    va_end(ap);
    return pt;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值