自学C第16天

C primer plus

第10章

第1题:

#include<stdio.h>

#define MONTHS 12

#define YEARS 5

int main(void)

{

       const float rain[YEARS][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;

       float(*pr)[MONTHS];

       pr = rain;

       printf("YEAR    RAINFALL  (inches)\n");

       for (year = 0, total = 0; year < YEARS; year++)

       {

              for (month = 0, subtot = 0; month < MONTHS; month++)

              {

                     subtot += *(*(pr + year) + month); #注:(pr+year),其中year是数组的列,当year=1时,pr+0表示该数组的第一列, 所以*(pr+0)也就表示rain[0]它是一个地址,表示rain[0][0]的值的地址,也就是&rain[0][0]当让其+month的话就会列遍数组每个月对于的值的地址,之后再用一个解引用,可以表示每个月的值。二维数组的指针名可以记忆为rain[m][n]=*(*(rain+m)+n)

              }

              printf("%5d %15.1f\n", 2010 + year, subtot);

              total += subtot;

       }

       printf("\nThe yearly average is %.1f inches.\n\n",total / YEARS);

       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 (year = 0, subtot = 0; year < YEARS; year++)

              {

                     subtot += *(*(pr + year) + month);

              }

                        printf("%4.1f", subtot / YEARS);

       }

       printf("\n");

       return 0;

             

}

第2题:

#include <stdio.h>

void copy_arr(double x[], double source[], int n);#注:也可以把x[]定义成x*两者没有区别都表示地址。

void copy_ptr(double *y, double source[], int n);

void copy_ptrs(double *z, double source[], double *b);

int main(void)

{

       double target1[5];

       double target2[5];

       double target3[5];

       double source[5] = { 1.1,2.2,3.3,4.4,5.5 };

       copy_arr(target1, source, 5); #注:函数中的前两个实参都相当于指针,也就地址。

       copy_ptr(target2, source, 5);

       copy_ptrs(target3, source, (source + 5));

}

void copy_arr(double x[], double source[], int n)

{

       int i;

       for (i = 0; i < n; i++) {

              x[i] = source[i];

              printf("%g ", x[i]);

       }

}

void copy_ptr(double* y, double source[], int n)

{

       int i;

       putchar('\n');

       for (i = 0; i < n; i++)

       {

              *(y + i) = *(source + i);

              printf("%g ", *(y + i));

       }

}

void copy_ptrs(double* z, double source[], double* b)

{

       int i;

       putchar('\n');

       for (i = 0; i < b-source; i++) {

              *(z + i) = *(source + i);

              printf("%g ", *(z + i));

       }

}

第3题:

#include <stdio.h>

int get_max(int target[], int n);

int main (void){

       int m;

       int source[5] = { 1,2,3,3,3 };

       int size = sizeof source / sizeof source[0]; #注:sizeof运算符给出它运算对象的大小,sizeof source是整个数组的大小也是4*5为20,source[0]是数组中一个元素的大小为4.

       m=get_max(source, size);

       printf("The max number of this list is %d", m);

       return 0;

}

int get_max(int target[],int n) {

       int i;

       int max = target[0];  #注:一开始是尝试直接用sizeof target/sizeof target[0]表示数组长度的,但由于该函数中定义的target其实是一个指针,所以它的sizeof 大小是8字节,而target[0]是一个整数值,是4字节,结果就是2,所以定义数组的长度需要用到数组的名字。所以需要在主函数中计算数组长度。

       for (i = 0; i < n; i++) {

              if (max < target[i]) {

                     max = target[i];

              }

      

       }

       return max;

}

第4题:

#include <stdio.h>

int get_max(double target[], int n);

int main(void) {

       int m;

       double source[] = { 2.3,5.6,7.8,9.0,11.2,15.5,10.1,11.2,13.3 };

       int size = sizeof source / sizeof source[0];

       m = get_max(source, size);

       printf("The max number is %g, and it is the %dth of the list",source[m], m);

       return 0;

}

int get_max(double target[], int n) {

       int i;

       int mark;

       double max = target[0];

       for (i = 0; i < n; i++) {

              if (max < target[i] ) {

                     max = target[i];

                     mark = i;

              }

       }

       return mark;

}

第5题:

#include <stdio.h>

double get_diff(double target[], int n);

int main(void) {

       double d;

       double source[] = { 2.3,5.6,7.8,9.0,11.2,15.5,10.1,11.2,13.3 };

       int size = sizeof source / sizeof source[0];

       d = get_diff(source, size);

       printf("The max number - min number in the list is %g", d);

       return 0;

}

double get_diff(double target[], int n) {

       int i, j;

       double max, min, diff;

       max = target[0];

       min = target[0];

       for (i = 0; i < n; i++) {

              if (max < target[i]) {

                     max = target[i];

              }

       }

       for (j = 0; j < n; j++) {

              if (min > target[j]) {

                     min = target[j];

              }

       }

       diff = max - min;

       return diff;

}

第6题:

#include <stdio.h>

#include <stdio.h>

void copy_arr(double x[][5], double source[][5], int n); #注:用数组表示法

void copy_ptr(double(*y)[5], double(*source)[5], int n);#注:指针表示法

int main(void)

{

       double target1[2][5];

       double target2[2][5];

       double source[2][5] = { {1.1,2.2,3.3,4.4,5.5},

                                                 {7.7,8.8,9.9,10.1,11.1} };

       copy_arr(target1, source, 5);

       copy_ptr(target2, source, 5);

       return 0;

}

void copy_arr(double x[][5], double source[][5], int n)

{

       int i;

       int j;

       for (i = 0; i < 2; i++) {

              putchar('\n');

              for (j = 0; j < n; j++) {

                     x[i][j] = source[i][j];

                     printf("%g ", x[i][j]);

              }

       }

}

void copy_ptr(double(* y)[5], double(*source)[5], int n)

{

       int i,j;

       putchar('\n');

       for (i = 0; i < 2; i++){

              putchar('\n');

              for (j = 0; j < n; j++) {

                     *(*(y+i) + j) = *(*(source+i) + j);

                     printf("%g ", *(*(y + i) + j));

              }

       }

}

第7题:

#include <stdio.h>

void copy_ptr(double* y, double source[], int n);

int main(void)

{

       double target[3];

       double source[] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7 };

       copy_ptr(target, source, 3);

       return 0;

}

void copy_ptr(double* y, double source[], int n)

{

       int i;

       for (i = 0; i < n; i++) {

              *(y + i) = *(source + 2 + i);

              printf("%g ", *(y + i));

       }

}

第8题:

#include <stdio.h>

void copy_ptr(double* y, double source[], int n);

int main(void)

{

       double target[3];

       double source[] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7 };

       copy_ptr(target, source, 3);

       return 0;

}

void copy_ptr(double* y, double source[], int n)

{

       int i;

       for (i = 0; i < n; i++) {

              *(y + i) = *(source + 2 + i);

              printf("%g ", *(y + i));

       }

}

第9题:#注:VS编译器不支持变长数组,所以这题和第7题类似

#include<stdio.h>

void copy_arr(int rows, int cols, double ar[][5],double cr[][5]);

int main(void) {

       double source[][5] = { {1,2,3,4,5},{5,4,3,2,1},{10,9,8,7,6} };

       double target[3][5];

       copy_arr(3, 5, source, target);

       return 0;

}

void copy_arr(int rows, int cols, double ar[][5], double cr[][5]) {

       int i, j;

       for (i = 0; i < rows; i++) {

              putchar('\n');

              for (j = 0; j < cols; j++) {

                     cr[i][j] = ar[i][j];

                     printf("%g ", cr[i][j]);

              }

       }

}

第10题:

#include <stdio.h>

#define SIZE 4

void get_arr(double ar[], double cr[], int n);

int main(void) {

       double ar[] = { 1,5,4,8 };

       double cr[] = { 5,5.6,8.3,8.8 };

       get_arr(ar, cr, SIZE);

       return 0;

}

void get_arr(double ar[], double cr[], int n) {

       int i;

       double sum_arr[SIZE]; #注:C语言貌似无法直接声明一个空的数组,必须要一个列。

       for (i = 0; i < n; i++) {

              sum_arr[i] = ar[i] + cr[i];

              printf("%g ", sum_arr[i]);

       }

}

加油!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值