C primer plus第12章(存储类、链接和内存管理)习题

1

#include <stdio.h>
void critic(int *ubits);
int main(void)
{
    int units;
    printf("How many?\n");
    scanf("%d",&units);
    while(units != 56)
        critic(&units);
    printf("You must have looked it up!\n");
    return 0;
}

void critic(int *units)
{
    printf("No luck,chummy.Try again.\n");
    scanf("%d",units);//此处不用再加&了,应为units本身就是一个指针地址

}

2

pe12-2a.c

//pe12-2a.c
#include <stdio.h>
#include <stdlib.h>
//模式
int mode;
//距离
double distance;
//消耗的燃料
double fuel;

void set_mode(int modes)
{
    //extern int mode = modes;//both `extern' and initializer 必须先声明再赋值
    extern int mode;
    mode = modes;
}

void get_info(void)
{

    extern int mode;
    extern double distance;
    if(mode != 1 && mode != 0)
    {
        printf("Invalid mode specified.");
        if(1-mode > 0-mode)
        {
            mode = 0;
            printf("Mode 0 (EN) used.\n");
        }
        else
        {
            mode = 1;
            printf("Mode 1 (EN) used.\n");
        }

    }

    if(mode == 0)
    {

        printf("Enter distance traveled in kilometers:");
    }
    else if (mode == 1)
    {

        printf("Enter distance traveled in miles:");
    }
    scanf("%lf",&distance);
    getchar();
    if(mode == 0)
    {

        printf("Enter fuel consumed in liters:");
    }
    else if (mode == 1)
    {

        printf("Enter fuel consumed in gallons:");
    }
    scanf("%lf",&fuel);
    getchar();
}

void show_info(void)
{
    extern double distance,fuel;
    if(mode == 0)
    {
        fuel = distance * 0.13;
        printf("Fuel consuption is %.2lf liters per 100 km.\n",fuel/distance*100);
    }
    else if(mode == 1)
    {
        fuel = distance * 0.029;
        printf("Fuel consuption is %.2lf liters per gallon.\n",fuel/distance*100);
    }

}

pe12-2b.c

//pe12-2b.c
#include <stdio.h>
//用引号代表让程序去本地寻找文件而不是去标准库
#include "pe12-2a.h"
extern set_mode(int);
extern get_info(void);
extern show_info(void);
int main()
{
    int mode;
    printf("Enter 0 for metric mode, 1 for US mode:");
    scanf("%d",&mode);
    while(mode >= 0)
    {
        set_mode(mode);
        get_info();
        show_info();
        printf("Enter 0 for metric mode, 1 for US mode");
        printf("(-1 to quit):");
        scanf("%d",&mode);
    }
    printf("Hello world!\n");
    return 0;
}
3.

//pe12-2a.c
#include <stdio.h>
#include <stdlib.h>


void get_info(int mode,double * distance,double *fuel)
{

    if(mode != 1 && mode != 0)
    {
        printf("Invalid mode specified.");
        if(1-mode > 0-mode)
        {
            mode = 0;
            printf("Mode 0 (EN) used.\n");
        }
        else
        {
            mode = 1;
            printf("Mode 1 (EN) used.\n");
        }

    }

    if(mode == 0)
    {

        printf("Enter distance traveled in kilometers:");
    }
    else if (mode == 1)
    {

        printf("Enter distance traveled in miles:");
    }
    scanf("%lf",distance);
    getchar();
    if(mode == 0)
    {

        printf("Enter fuel consumed in liters:");
    }
    else if (mode == 1)
    {

        printf("Enter fuel consumed in gallons:");
    }
    scanf("%lf",fuel);
    getchar();
}

void show_info(int mode,double distance,double fuel)
{
    if(mode == 0)
    {
        fuel = distance * 0.13;
        printf("Fuel consuption is %.2lf liters per 100 km.\n",fuel/distance*100);
    }
    else if(mode == 1)
    {
        fuel = distance * 0.029;
        printf("Fuel consuption is %.2lf liters per gallon.\n",fuel/distance*100);
    }

}

//pe12-2b.c
#include <stdio.h>
//用引号代表让程序去本地寻找文件而不是去标准库
#include "pe12-2a.h"
extern void get_info(int mode,double * distance,double *fuel);
extern void show_info(int mode,double distance,double fuel);
int main()
{
    //模式
    int mode;
    //距离
    double distance;
    //消耗的燃料
    double fuel;
    printf("Enter 0 for metric mode, 1 for US mode:");
    scanf("%d",&mode);
    while(mode >= 0)
    {
        get_info(mode,&distance,&fuel);
        show_info(mode,distance,fuel);
        printf("Enter 0 for metric mode, 1 for US mode");
        printf("(-1 to quit):");
        scanf("%d",&mode);
    }
    return 0;
}

4

#include <stdio.h>
#include <stdlib.h>
#define N 20
int times = 0;
int main()
{
    int i;
    for(i = 0 ;i< N; i++) {
        printf("%d\n",call_times());
    }
    return 0;
}

int call_times() {
    return ++times;
}

5

#include <stdio.h>
#include <stdlib.h>
#define N 100
int main()
{
    int i,j,temp;
    int arr[N];
    //随机
    for(i = 0 ; i< N; i++)
    {
        arr[i] = rand()%10+1;
    }
    //排序
    for(i=0; i<N-1; i++)
    {
        for(j=i+1; j<N; j++)
        {
            if(arr[i] < arr[j])
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

    }
    //打印
    for(i = 0 ; i< N; i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

6

#include <stdio.h>
#include <stdlib.h>
#define N 1000
#define T 11
int main()
{
    int i,temp;
    int arr[T] = {0,0,0,0,0,0,0,0,0,0,0};
    //随机
    for(i = 0 ; i< N; i++)
    {
        arr[rand()%10+1]++;
    }
    //打印
    for(i = 1 ; i< T; i++)
    {
        printf("%d has %d times\n",i,arr[i]);
    }
    return 0;
}

7.

//manydice.c -- 多次掷筛子模拟
//与diceroll.c一起编译
#include <stdio.h>
#include <stdlib.h>//为srand函数提供原型
#include <time.h>//为time()提供原型
#include "diceroll.h"

int main(void)
{
    int dice,roll,i;
    int sets,sides;
    srand((unsigned int)time(0));//随机化种子
    printf("Enter the number of sets,enter q to stop.\n");
    while(scanf("%d",&sets)==1)
    {
        printf("How many sides and dice?\n");
        scanf("%d %d",&sides,&dice);
        printf("Here are %d sets of %d %d-sided throws.\n",sets,dice,sides);
        for(i=0;i<sets;i++) {
            printf("%d ",roll_n_dice(dice,sides));
            if((i+1)%15==0)
                putchar('\n');
        }
        printf("\nHow many sides? Enter q to stop.\n");
    }
    printf("The rollem() function was called %d times.\n",roll_count);//使用外部变量
    printf("GOOD FORTURE TO YOU!\n");
    return 0;
}

#ifndef DICEROLL_H_INCLUDED
#define DICEROLL_H_INCLUDED
extern int roll_count;
int roll_n_dice(int dice,int sides);



#endif // DICEROLL_H_INCLUDED

/*diceroll.c -- 掷筛子模拟*/
#include "diceroll.h"
#include <stdio.h>
#include <stdlib.h>//为rand函数提供类库

int roll_count = 0;//外部链接
//这个文件的私有函数
static int rollem(int sides)
{
    int roll;
    roll = rand() % sides + 1;
    ++roll_count;//计数函数调用
    return roll;
}

int roll_n_dice(int dice, int sides)
{
    int d;
    int total =0;
    if(sides < 2)
    {
        printf("Need at least 2 sides.\n");
        return -2;
    }
    if(dice < 1)
    {
        printf("Need at least 1 die.\n");
               return -1;
           }
               for(d = 0;d<dice;d++) {
               total += rollem(sides);
           }
               return total;
           }

8
#include <stdio.h>
#include <stdlib.h>
int * make_array(int elem,int val);
void show_array(const int ar[],int n);
int main(void)
{
    int *pa;
    int size;
    int value;
    printf("Enter the number if elements:");
    scanf("%d",&size);
    while(size>0)
    {
        printf("Enter the initialization value:");
        scanf("%d",&value);
        pa = make_array(size,value);
        if(pa)
        {
            show_array(pa,size);
            free(pa);
        }
        printf("Enter the number of elements (<1 to quit>):");
    }
    printf("Done.\n");
    return 0;
}
int * make_array(int elem,int val)
{
    int i;
    int *p = (int *)malloc(elem * sizeof(int));
    for(i = 0; i < elem; i++)
    {
        p[i] = val;
    }
    return p;
}

void show_array(const int ar[],int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        printf("%d ",ar[i]);
        if((i+1)%8 ==0)
        {
            putchar('\n');
        }

    }
    putchar('\n');
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值