C primer plus 编程练习 10.12

1.

/* Programming Exercise 10-1 */
#include <stdio.h>
#define MONTHS 12 // number of months in a year
#define YRS 5 // number of years of data
int main(void)
{
    // initializing rainfall data for 2010 - 2014
    const float rain[YRS][MONTHS] = 
    {
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
        {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
        {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
        {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
    };
    int year, month;
    float subtot, total;
    printf(" YEAR RAINFALL (inches)\n");
    for (year = 0, total = 0; year < YRS; year++)
    { /* for each year, sum rainfall for each month */
        for (month = 0, subtot = 0; month < MONTHS; month++)
            subtot += *(*(rain + year) + month);
        printf("%5d %15.1f\n", 2010 + year, subtot);
        total += subtot; /* total for all years */
    }
    printf("\nThe yearly average is %.1f inches.\n\n", total/YRS);
    printf("MONTHLY AVERAGES:\n\n");
    printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct");
    printf(" Nov Dec\n");
    for (month = 0; month < MONTHS; month++)
    { /* for each month, sum rainfall over years */
        for (year = 0, subtot =0; year < YRS; year++)
            subtot += *(*(rain + year) + month);
        printf("%4.1f", subtot/YRS);
    }
    printf("\n");
    return 0;
}

2.

#include <stdio.h>
void copy_arr(double *pt1,double *ps,int n);
void copy_ptr(double *pt2,double *ps,int n);
void copy_ptrs(double *pt3,double *ps_start,double *ps_end);
void show_ar(double *pt,int n);

int main(void)
{
    double source[5] = {1.1,2.2,3.3,4.4,5.5};
    double target1[5];
    double target2[5];
    double target3[5];
    copy_arr(target1,source,5);
    show_ar(target1,5);
    copy_ptr(target2,source,5);
    show_ar(target2,5);
    copy_ptrs(target3,source,source + 5);
    show_ar(target3,5);

    return 0;
}
void copy_arr(double *pt1,double *ps,int n)
{
    int j;
    for (j = 0;j < n;j++)
        pt1[j]= ps[j];
    return;
}
void copy_ptr(double *pt2,double *ps,int n)
{
    int j;
    for (j = 0;j < n;j++)
        *(pt2 + j) = *(ps + j);
    return;
}
void copy_ptrs(double *pt3,double *ps_start,double *ps_end)
{
    while (ps_start < ps_end)
        *(pt3++) = *(ps_start++);
    return;
}
void show_ar(double *pt,int n)
{
    int j;
    for (j = 0;j < n;j++)
        printf(" %.1f",*(pt + j));
    printf("\n");
}

3.

/* Programming Exercise 10-3 */
#include <stdio.h>
#define LEN 10
int max_arr(const int ar[], int n);
void show_arr(const int ar[], int n);
int main(void)
{
    int orig[LEN] = {1,2,3,4,12,6,7,8,9,10};
    int max;
    show_arr(orig, LEN);
    max = max_arr(orig, LEN);
    printf("%d = largest value\n", max);
    return 0;
}
int max_arr(const int ar[], int n)
{
    int i;
    int max = ar[0];
    /* don't use 0 as initial max value -- fails if all array values are neg */
    for (i = 1; i < n; i++)
        if (max < ar[i])
    max = ar[i];
    return max;
}
void show_arr(const int ar[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    printf("%d ", ar[i]);
    putchar('\n');
}

4.

/* Programming Exercise 10-4 */
#include <stdio.h>
#define LEN 10
int max_index_arr(const int ar[], int n);
void show_arr(const int ar[], int n);
int main(void)
{
    int orig[LEN] = {1,2,3,4,12,6,7,8,9,10};
    int max_index;
    show_arr(orig, LEN);
    max_index = max_index_arr(orig, LEN);
    printf("%d = largest value's index\n", max_index);
    return 0;
}
int max_index_arr(const int ar[], int n)
{
    int i;
    int max = ar[0];
	int max_index = 0;
    /* don't use 0 as initial max value -- fails if all array values are neg */
    for (i = 1; i < n; i++)
	{
        if (max < ar[i])
		{
			max = ar[i];
			max_index = i;
		}  
	}
    
    return max_index;
}
void show_arr(const int ar[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    printf("%d ", ar[i]);
    putchar('\n');
}

5.

/* Programming Exercise 10-5 */
#include <stdio.h>
#define LEN 10
double max_diff(const double ar[], int n);
void show_arr(const double ar[], int n);
int main(void)
{
    double orig[LEN] = {1.1,2,3,4,12,61.3,7,8,9,10};
    double max;
    show_arr(orig, LEN);
    max = max_diff(orig, LEN);
    printf("%g = maximum difference\n", max);
    return 0;
}
double max_diff(const double ar[], int n)
{
    int i;
    double max = ar[0];
    double min = ar[0];
    for (i = 1; i < n; i++)
    {
        if (max < ar[i])
        max = ar[i];
        else if (min > ar[i])
        min = ar[i];
    }
    return max - min;
}
void show_arr(const double ar[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    printf("%g ", ar[i]);
    putchar('\n');
}

6.

#include <stdio.h>
#define LEN 10
void sort(double ar[], int n);
void show_arr(const double ar[], int n);

int main(void)
{
	double orig[LEN] = {1.1,2,3,4,12,61.3,7,8,9,10};
    show_arr(orig, LEN);
	sort(orig,LEN);
	show_arr(orig, LEN);
	return 0;
}
void sort(double ar[], int n)
{
	int i;
	double temp;
    for (i = 0;i < n / 2 ;i++ )
    {
        temp = ar[i];
		ar[i] = ar[n-i-1];
		ar[n-i-1] = temp;
    }
	return;
}
void show_arr(const double ar[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    printf("%g ", ar[i]);
    putchar('\n');
}

7

#include <stdio.h>
#define ROWS 5
#define COLS 12

void show_arr(const double ar[][COLS], int n);
void copy_arr(double (*pt)[COLS],double (*po)[COLS],int n);

int main(void)
{
	double orig[ROWS][COLS] =
	{
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
        {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
        {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
        {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
    };
	double target[ROWS][COLS] = {0};
	printf("orig[ROWS][COLS]=\n");
        show_arr(orig, ROWS);
	printf("target[ROWS][COLS]=\n");
	show_arr(target, ROWS);
	copy_arr(target,orig,5);
	printf("After copy\ntarget[ROWS][COLS]=\n");
	show_arr(target, ROWS);
	return 0;
}
void copy_arr(double (*pt)[COLS],double (*po)[COLS],int n)
{
    int i,j;
	for (i = 0;i < n;i++)
	{
		for (j = 0;j < COLS;j++ )
		{
                    pt[i][j]= po[i][j];
		}
	}
	return;
}
void show_arr(const double ar[][COLS], int n)
{
    int i,j;
    for (i = 0; i < n; i++)
	{
		for (j = 0;j < COLS;j++)
		{
		    printf("%.1f ", ar[i][j]);
		}
        putchar('\n');
	}
	return;
}

8.

/* Programming Exercise 10-8 */
#include <stdio.h>
#define LEN1 7
#define LEN2 3
void copy_arr(int ar1[], const int ar2[], int n);
void show_arr(const int [], int);
int main(void)
{
    int orig[LEN1] = {1,2,3,4,5,6,7};
    int copy[LEN2];
    show_arr(orig, LEN1);
    copy_arr(copy, orig + 2, LEN2);
    show_arr(copy, LEN2);
    return 0;
}
void copy_arr(int ar1[], const int ar2[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        ar1[i] = ar2[i];
}
void show_arr(const int ar[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%d ", ar[i]);
    putchar('\n');
}

9.

#include <stdio.h>
#define ROWS 5
#define COLS 12

void show_arr(const double ar[][COLS], int n);
void copy_arr(double (*pt)[COLS],double (*po)[COLS],int n);

int main(void)
{
	double orig[ROWS][COLS] =
	{
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
        {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
        {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
        {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
    };
	double target[ROWS][COLS] = {0};
	printf("orig[ROWS][COLS]=\n");
        show_arr(orig, ROWS);
	printf("target[ROWS][COLS]=\n");
	show_arr(target, ROWS);
	copy_arr(target,orig,5);
	printf("After copy\ntarget[ROWS][COLS]=\n");
	show_arr(target, ROWS);
	return 0;
}
void copy_arr(double (*pt)[COLS],double (*po)[COLS],int n)
{
    int i,j;
	for (i = 0;i < n;i++)
	{
		for (j = 0;j < COLS;j++ )
		{
                    pt[i][j]= po[i][j];
		}
	}
	return;
}
void show_arr(const double ar[][COLS], int n)
{
    int i,j;
    for (i = 0; i < n; i++)
	{
		for (j = 0;j < COLS;j++)
		{
		    printf("%.1f ", ar[i][j]);
		}
        putchar('\n');
	}
	return;
}

10.

#include <stdio.h>
void arr_add(int ar1[],int ar2[],int ar3[],int n);
void show_ar(int ar[],int n);
int main(void)
{
	int num1[4] = {2,4,5,8};
	int num2[4] = {1,0,4,6};
	int num3[4] = {0};
	show_ar(num1,4);
	show_ar(num2,4);
	show_ar(num3,4);
	arr_add(num1,num2,num3,4);
	printf("after add:\n");
	show_ar(num3,4);
	return 0;
}
void arr_add(int ar1[],int ar2[],int ar3[],int n)
{
	int i;
	for (i = 0;i <n;i++)
		ar3[i] = ar1[i] + ar2[i];
	return;
}
void show_ar(int ar[],int n)
{
	int j;
	for (j = 0;j < n;j++)
		printf(" %d",ar[j]);
	printf("\n");
	return;
}

11.

/* Programming Exercise 10-11 */
#include <stdio.h>
#define ROWS 3
#define COLS 5
void times2(int ar[][COLS], int r);
void showarr2(int ar[][COLS], int r);
int main(void)
{
    int stuff[ROWS][COLS] = 
	{ 
		{1,2,3,4,5},
        {6,7,8,-2,10},
        {11,12,13,14,15}
    };
    showarr2(stuff, ROWS);
    putchar('\n');
    times2(stuff, ROWS);
    showarr2(stuff, ROWS);
    return 0;
}
void times2(int ar[][COLS], int r)
{
    int row, col;
    for (row = 0; row < r; row++)
        for (col = 0; col < COLS; col++)
            ar[row][col] *= 2;
}
void showarr2(int ar[][COLS], int r)
{
    int row, col;
    for (row = 0; row < r; row++)
    {
        for (col = 0; col < COLS; col++)
            printf("%d ", ar[row][col]);
        putchar('\n');
    }
}

13

#include <stdio.h>
#define ROWS 3
#define COLS 5
void store(double ar[][COLS], int n);
void showarr2(double ar[][COLS], int n);
double average_row(double ar[], int n);
double average2d(double ar[][COLS], int n);
double max2d(double ar[][COLS], int n);

int main(void)
{
    double stuff[ROWS][COLS];
    int row;
    store(stuff,ROWS);
	printf("数组内容:\n");
	showarr2(stuff,ROWS);
	for (row = 0; row < ROWS; row++)
        printf("第%d行的平均值 = %g\n", row, average_row(stuff[row], COLS));
    printf("所有元素的平均值 = %g\n", average2d(stuff, ROWS));
	printf("数组中最大元素为 = %g\n", max2d(stuff, ROWS));
    printf("再见!\n");
	return 0;
}
double max2d(double ar[][COLS], int n)
{
    int i,j;
    int max = ar[0][0];
    for (i = 0; i < n; i++)
		for (j = 0;j < COLS;j++ )
		    if (max < ar[i][j])
                max = ar[i][j];
    return max;
}
double average2d(double ar[][COLS], int n)
{   
	int i,j;
	double sum_total = 0;
	for (i = 0;i < n;i++)
		for (j = 0;j < COLS;j++)
			sum_total += ar[i][j];
	if (n * COLS > 0)
		return sum_total / (i * j);
	else
		return 0;
}
double average_row(double ar[], int n)
{
	int i;
	double sum_row = 0.0;
	for (i = 0;i < n;i++)
		sum_row += ar[i];
	if (n > 0)
		return sum_row / n;
	else
	    return 0;
}
void showarr2(double ar[][COLS], int n)
{
    int row,col;
    for (row = 0; row < n; row++)
	{
		for (col = 0;col < COLS;col++)
		    printf("%.1f\t", ar[row][col]);
        putchar('\n');
	}
	return;
}
void store(double ar[][COLS], int n)
{
	int i,j;
	printf("您需要输入一个%d x %d的double类型数组\n",ROWS,COLS);
	for (i = 0;i < n;i++ )
	{
		for (j = 0;j < COLS;j++)
		{
            printf("请输入第%d行的第%d个数值: ",i,j);
			while (scanf("%lf",&ar[i][j]) != 1)
			{
				printf("您输入错误,请输入一个double数字:");
				while (getchar() != '\n')
					continue;
			}
		}
		
	}
    return;
}

14

/* Programming Exercise 10-14 */
#include <stdio.h>
#define ROWS 3
#define COLS 5
void store(double ar[], int n);
double average2d(int rows, int cols, double ar[rows][cols]);
double max2d(int rows, int cols, double ar[rows][cols]);
void showarr2(int rows, int cols, double ar[rows][cols]);
double average(const double ar[], int n);
int main(void)
{
    double stuff[ROWS][COLS];
    int row;
    for (row = 0; row < ROWS; row++)
    {
        printf("Enter %d numbers for row %d\n", COLS, row + 1);
        store(stuff[row], COLS);
    }
    printf("array contents:\n");
    showarr2(ROWS, COLS, stuff);
    for (row = 0; row < ROWS; row++)
        printf("average value of row %d = %g\n", row + 1, average(stuff[row], COLS));
    printf("average value of all rows = %g\n", average2d(ROWS, COLS, stuff));
    printf("largest value = %g\n", max2d(ROWS, COLS, stuff));
    printf("Bye!\n");
    return 0;
}
void store(double ar[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("Enter value #%d: ", i + 1);
        scanf("%lf", & ar[i]);
    }
}
double average2d(int rows, int cols, double ar[rows][cols])
{
    int r, c;
    double sum = 0.0;
    for (r = 0; r < rows; r++)
        for (c = 0; c < cols; c++)
            sum += ar[r][c];
    if (rows * cols > 0)
        return sum / (rows * cols);
    else
        return 0.0;
}
double max2d(int rows, int cols, double ar[rows][cols])
{
    int r, c;
    double max = ar[0][0];
    for (r = 0; r < rows; r++)
        for (c = 0; c < cols; c++)
            if (max < ar[r][c])
                max = ar[r][c];
    return max;
}
void showarr2(int rows, int cols, double ar[rows][cols])
{
    int row, col;
    for (row = 0; row < rows; row++)
    {
        for (col = 0; col < cols; col++)
            printf("%g ", ar[row][col]);
        putchar('\n');
    }
}
double average(const double ar[], int n)
{
    int i;
    double sum = 0.0;
    for (i = 0; i < n; i++)
        sum += ar[i];
    if (n > 0)
        return sum / n;
    else
        return 0.0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值