c primer plus 第十章编程题
来源:互联网 发布:js获取指定的时间戳 编辑:程序博客网 时间:2024/06/05 12:40
第一题:修改程序清单10.7中的程序rain,使它不使用数组下标,而是使用指针进行计算(程序中仍然需要声明并初始化数组)。
解:
代码如下:
#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;
const float (*ptr) [MONTHS];
ptr = rain;
printf(" YEAR RAINFALL(inches) \n");
for(year = 0,total = 0;year < YEARS;year++)
{
for(month= 0,subtot = 0;month < MONTHS;month++)
subtot += *(*(ptr + year) + month);
printf("%5d %15.1f\n",2000 + 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 Ict ");
printf(" Nov Dec \n");
for(month = 0;month < MONTHS;month++)
{
for(year = 0,subtot = 0;year < YEARS;year++)
subtot += *(*(ptr + year) + month);
printf("%4.1f ",subtot/YEARS);
}
printf("\n");
return 0;
}
———————————————分割线—————————————————
第二题:编写一个程序,初始化一个double数组,然后把数组内容复制到另外两个数组(3个数组都需要在主程序中声明)。制作第一份拷贝的函数使用数组符号。制作第二份拷贝的函数使用指针符号,并使用指针的增量操作。把目标数组名和要复制的元素数目作为参数传递给函数。也就是说,如果给定了下列声明,函数调用用过如下面所示:
double source[5] = {1.1,2.2,3.3,4.4,5.5};
double target1[5];
double target2[5];
copy_arr(source,target1,5);
copy_ptr(source,target2,5);
解:
代码如下:
#include <stdio.h>
#include <string.h>
#define SIZE 5
void copy_arr(double * source,double * target ,int n);
void copy_ptr(double * source,double * target ,int n);
int main(void)
{
double source[SIZE] = {1.1,2.2,3.3,4.4,5.5};
double *ptr;
ptr = source;
double target1[SIZE];
double target2[SIZE];
copy_arr(source,target1,5);
copy_ptr(source,target2,5);
return 0;
}
void copy_arr(double * sou,double * tar ,int n)
{
int count;
printf("target1:");
for(count = 0;count < n;count++)
{
tar[count] = sou[count];
printf(" %.1f",tar[count]);
}
printf("\n");
}
void copy_ptr(double * sou,double * tar ,int n)
{
int count;
printf("target2:");
for(count = 0;count < n;count++,sou++,tar++)
{
*tar = *sou;
printf(" %.1f",*tar);
}
printf("\n");
}
———————————————分割线—————————————————
第三题:编写一个函数,返回一个int数组中存储的最大值,并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 5
int max_arr(int * ptr,int n);
int main(void)
{
int arr[SIZE] = {67,22,73,35,47};
int * ptr;
ptr = arr;
printf("The max number of arr is %d\n",max_arr(ptr,SIZE));
return 0;
}
int max_arr(int * ptr,int n)
{
int i,re;
for(i = 0,re = 0;i < n;i++,ptr++)
re = (*ptr > re)?*ptr:re;
return re;
}
———————————————分割线—————————————————
第四题:编写一个函数,返回一个double数组中存储的最大数值的索引,并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 5
int max_arr_index(double * ptr,int n);
int main(void)
{
double arr[SIZE] = {67.4,22.4,73.4,35.4,47.4};
double * ptr;
ptr = arr;
printf("The max number's index of arr is %d\n",max_arr_index(ptr,SIZE));
return 0;
}
int max_arr_index(double * ptr,int n)
{
int i,re;
double d,* p;
p = ptr;
for(i = 0,d = 0.0;i < n;i++,ptr++)
d = (*ptr > d)?*ptr:d;
for(i = 0;i < n;i++)
if(d == p[i])
re = i;
return re;
}
———————————————分割线—————————————————第五题:编写一个函数,返回一个double数组中最大和最小的数之间的差值,并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 5
double cha_arr(double * ptr,int n);
int main(void)
{
double arr[SIZE] = {67.4,22.4,73.4,35.4,47.4};
double * ptr;
ptr = arr;
printf("The dif of max and min about arr is %.1f\n",cha_arr(ptr,SIZE));
return 0;
}
double cha_arr(double * ptr,int n)
{
int i;
double max,min,* p1,* p2;
p1 = p2 = ptr;
for(i = 0,max = *p1;i < n;i++,p1++)
max = (*p1 > max)?*p1:max;
for(i = 0,min = *p2;i < n;i++,p2++)
min = (*p2 > min)?min:*p2;
return max - min;
}
———————————————分割线—————————————————第六题:编写一个程序,初始化一个二维double数组,并利用第二题中的任意一函数来把这个函数赋值到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的函数来赋值数组的每一个子数组)。
解:
代码如下:
#include <stdio.h>
#include <string.h>
#define SIZE1 2
#define SIZE2 5
void copy_arr(double (* source)[SIZE2],double (* target)[SIZE2] ,int n,int m);
int main(void)
{
double source[SIZE1][SIZE2] = {
{1.1,2.2,3.3,4.4,5.5},
{6.6,7.7,8.8,9.9,0.0}
};
double target[SIZE1][SIZE2];
copy_arr(source,target,SIZE1,SIZE2);
return 0;
}
void copy_arr(double (* source)[SIZE2],double (* target)[SIZE2] ,int n,int m)
{
int count1,count2;
printf("target:\n");
for(count1 = 0;count1 < n;count1++)
{
for(count2 = 0;count2 < m;count2++)
{
target[count1][count2] = source[count1][count2];
printf("%.1f,",target[count1][count2]);
}
printf("\n");
}
printf("\n");
}
———————————————分割线—————————————————第七题:利用第二题中的复制函数,把一个包含7个元素的数组内第3到第5元素赋值到一个包含3个元素的数组中。函数本身不需要修改,只需要选择合适的实际参数(实际参数不需要是数组名和数组大小,而只需是数组元素的地址和需要赋值的元素数目)。
解:
代码如下:
#include <stdio.h>
#include <string.h>
#define SIZE1 7
#define SIZE2 3
void copy_ptr(double * source,double * target ,int n);
int main(void)
{
double source[SIZE1] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7};
double *ptr;
ptr = source + 2;
double target[SIZE2];
copy_ptr(ptr,target,SIZE2);
return 0;
}
void copy_ptr(double * sou,double * tar ,int n)
{
int count;
printf("target:");
for(count = 0;count < n;count++,sou++,tar++)
{
*tar = *sou;
printf(" %.1f",*tar);
}
printf("\n");
}
———————————————分割线—————————————————第八题:编写一个程序,初始化一个3X5的二维double数组,并利用一个基于变长数组的函数把该数组赋值到另一个二维数组。还要编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能够处理任意的NXM数组(如果没有可以指出变长数组的编译器,就使用传统C处理NX5数组的函数方法)。
解:
代码如下:
#include <stdio.h>
#define ROW 3
#define COL 5
void copy_vla(int row,int col,double (*ptr)[COL],double arr[row][col]);
void print_vla(int row,int col,double (*ptr)[COL],double arr[row][col]);
int main(void)
{
double source[ROW][COL] = {
{1.1,2.2,3.3,4.4,5.5},
{6.6,7.7,8.8,9.9,10.0},
{11.0,12.0,13.0,14.0,15.0}
};
int row;
int col;
printf("Input how many row(less than 4) and col(less than 6) do you want:\n");
scanf("%d %d",&row,&col);
double target[row][col];
copy_vla(row,col,source,target);
print_vla(row,col,source,target);
return 0;
}
void copy_vla(int row,int col,double (*ptr)[COL],double arr[row][col])
{
int i,j;
for(i = 0;i < row;i++)
{
for(j = 0;j < col;j++)
arr[i][j] = ptr[i][j];
}
}
void print_vla(int row,int col,double (*ptr)[COL],double arr[row][col])
{
int i,j;
printf("source:\n");
for(i = 0;i < ROW;i++)
{
for(j = 0;j < COL;j++)
printf(" %.1f",ptr[i][j]);
}
printf("\ntarget:\n");
for(i = 0;i < row;i++)
{
for(j = 0;j < col;j++)
printf(" %.1f",arr[i][j]);
}
printf("\n");
}
———————————————分割线—————————————————
第九题:编写一个函数,把两个数组内的相应元素相加,结果存储到第三个数组内,也就是说,如果数组1具有值2,3,4,8,数组2具有值1,0,4,6,则函数对数组3赋值3,4,9,14。函数的参数包括3个数组名和数组大小。并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 4
void add_arr(int * p1,int * p2,int * p3,int n);
void print_arr(int * p,int n);
int main(void)
{
int s1[SIZE] = {2,4,5,8};
int s2[SIZE] = {1,0,4,6};
int result[SIZE];
add_arr(s1,s2,result,SIZE);
printf("s1:\n");
print_arr(s1,SIZE);
printf("s2:\n");
print_arr(s2,SIZE);
printf("result:\n");
print_arr(result,SIZE);
return 0;
}
void add_arr(int * add1,int * add2,int * result,int n)
{
int i;
for(i = 0;i < n;i++,add1++,add2++,result++)
*result = *add1 + *add2;
}
void print_arr(int * p,int n)
{
int i;
for(i = 0;i < n;i++,p++)
printf(" %d",*p);
printf("\n");
}
———————————————分割线—————————————————
第十题:编写一个程序,声明一个3x5的数组并初始化,具体数值可以随意。程序打印出数值,然后数值翻一番,戒指再次打印出新值。编写一个函数来显示数组的内容,再编写另一个函数执行翻倍功能。数组名和数组行数作为参数有程序传递给函数。
解:
代码如下:
#include <stdio.h>
#define ROW 3
#define COL 5
void doub(double (*ptr)[COL],int row);
void print(double (*ptr)[COL],int row);
int main(void)
{
double source[ROW][COL] = {
{1.1,2.2,3.3,4.4,5.5},
{6.6,7.7,8.8,9.9,10.0},
{11.0,12.0,13.0,14.0,15.0}
};
print(source,ROW);
doub(source,ROW);
print(source,ROW); return 0;
}
void doub(double (*ptr)[COL],int row)
{
int i,j;
for(i = 0;i < row;i++)
{
for(j = 0;j < COL;j++)
ptr[i][j] = ptr[i][j] * 2.0;
}
}
void print(double (*ptr)[COL],int row)
{
int i,j;
printf("source:\n");
for(i = 0;i < row;i++)
{
for(j = 0;j < COL;j++)
printf(" %.1f",ptr[i][j]);
}
printf("\n");
}
———————————————分割线—————————————————第十一题:重写程序清单10.7的程序rain,main()中的主要功能改为由函数来执行。
解:
代码如下:
#include <stdio.h>
#define MONTHS 12
#define YEARS 5
void yearly(const float (*ptr)[MONTHS],int n,int m);
void monthly(const float (*ptr)[MONTHS],int n,int m);
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}
};
const float (*ptr) [MONTHS];
ptr = rain;
yearly(ptr,YEARS,MONTHS);
monthly(ptr,YEARS,MONTHS);
return 0;
}
void yearly(const float (*ptr)[MONTHS],int n,int m){
int year,month;
float subtot,total;
printf(" YEAR RAINFALL(inches) \n");
for(year = 0,total = 0;year < n;year++)
{
for(month= 0,subtot = 0;month < m;month++)
subtot += *(*(ptr + year) + month);
printf("%5d %15.1f\n",2000 + year,subtot);
total += subtot;
}
printf("\nThe yearly average is %.1f inches.\n\n",total/n);
}
void monthly(const float (*ptr)[MONTHS],int n,int m)
{
int year,month;
float subtot;
printf("MONTHLY AVERAGES: \n\n");
printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Ict ");
printf(" Nov Dec \n");
for(month = 0;month < m;month++)
{
for(year = 0,subtot = 0;year < n;year++)
subtot += *(*(ptr + year) + month);
printf("%4.1f ",subtot/n);
}
printf("\n");
}
———————————————分割线—————————————————第十二题:编写一个程序,提示用户输入3个数集,每个数集包括5个double值。程序应当事先下列所有功能:
a.把输入信息存储到一个3x5的数组中
b.计算出每个数集(包括5个数值)的平均值
c.计算所有数值的平均数
d.找出这15个数中的最大值
e.打印出结果
每个任务需要用一个单独的函数来实现(使用传统C处理数组的方法)。对于人物b,需要编写计算并返回一维数组平均值的函数,循环3此调用该函数实现人物b。对于其他任务,函数应当把整个数组作为参数,并且完成人物c和d的函数应该向它的调用函数返回答案。
解:
代码如下:
#include <stdio.h>
#define ROW 3
#define COL 5
void get_arr(double (* arr)[COL],int n,int m);
void print_row_avg(double * arr,int m);
double avg(double (* arr)[COL],int n,int m);
double max(double (* arr)[COL],int n,int m);
void print_arr(double (* arr)[COL],int n,int m);
int main(void)
{
double arr[ROW][COL];
int i;
get_arr(arr,ROW,COL);
for(i = 0;i < ROW;i++)
print_row_avg(arr[i],COL);
printf("The average of arr is %.2f\n",avg(arr,ROW,COL));
printf("The max of arr is %.2f\n",max(arr,ROW,COL));
print_arr(arr,ROW,COL);
return 0;
}
void get_arr(double (* arr)[COL],int n,int m)
{
int i,j;
printf("Input 15 double:\n");
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
scanf("%f",&arr[i][j]);
}
}
void print_row_avg(double * arr,int m)
{
int i;
double total = 0.0;
for(i = 0;i < m;i++)
total += arr[i];
printf("average is %.2f\n",total / (float)m);
}
double avg(double (* arr)[COL],int n,int m)
{
int i,j;
double total = 0.0;
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
total +=arr[i][j];
}
return total / (float)(n * m);
}
double max(double (* arr)[COL],int n,int m)
{
int i,j;
double max = arr[0][0];
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
max = (max > arr[i][j])?max:arr[i][j];
}
return max;
}
void print_arr(double (* arr)[COL],int n,int m)
{
int i,j;
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
printf(" %.2f",arr[i][j]);
printf("\n");
}
}
———————————————分割线—————————————————
第十三题:利用变长数组作为函数参数重做练习12。
解:
代码如下:
#include <stdio.h>
void get_arr(int n,int m,double arr[n][m]);
void print_row_avg(int m,double arr[m]);
double avg(int n,int m,double arr[n][m]);
double max(int n,int m,double arr[n][m]);
void print_arr(int n,int m,double arr[n][m]);
int main(void)
{
int n,m;
printf("Input the row and col:\n");
scanf("%d %d",&n,&m);
double arr[n][m];
int i;
get_arr(n,m,arr);
for(i = 0;i < n;i++)
print_row_avg(m,arr[i]);
printf("The average of arr is %.2f\n",avg(n,m,arr));
printf("The max of arr is %.2f\n",max(n,m,arr));
print_arr(n,m,arr);
return 0;
}
void get_arr(int n,int m,double arr[n][m])
{
int i,j;
printf("Input %d double:\n",n * m);
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
scanf("%lf",&arr[i][j]);
}
}
void print_row_avg(int m,double arr[m])
{
int i;
double total = 0.0;
for(i = 0;i < m;i++)
total += arr[i];
printf("average is %.2f\n",total / (float)m);
}
double avg(int n,int m,double arr[n][m])
{
int i,j;
double total = 0.0;
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
total +=arr[i][j];
}
return total / (float)(n * m);
}
double max(int n,int m,double arr[n][m])
{
int i,j;
double max = arr[0][0];
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
max = (max > arr[i][j])?max:arr[i][j];
}
return max;
}
void print_arr(int n,int m,double arr[n][m])
{
int i,j;
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
printf(" %.2f",arr[i][j]);
printf("\n");
}
}
阅读全文
0 0
- 《C Primer Plus》第十章编程题
- c primer plus 第十章编程题
- C Primer Plus 第十章 编程练习 1-11题
- c primer plus 第十章
- C primer plus 第十章
- 记录——《C Primer Plus (第五版)》第十章编程练习第十题
- 《C Primer Plus 第五版》第十章编程练习
- 《c primer plus》编程练习回顾-第十章
- C primer plus(第五版)编程练习第十章
- c++.primer.plus第五版第十章编程练习答案
- C ++ Primer Plus 第六版 第十章编程练习答案
- 这是我关于c++primer plus第七章编程练习第十题的解答
- 记录——《C Primer Plus (第五版)》第九章编程练习第十题
- 记录——《C Primer Plus (第五版)》第十章编程练习第一题
- 记录——《C Primer Plus (第五版)》第十章编程练习第二题
- 记录——《C Primer Plus (第五版)》第十章编程练习第三题
- 记录——《C Primer Plus (第五版)》第十章编程练习第四题
- 记录——《C Primer Plus (第五版)》第十章编程练习第五题
- mac os快速切换多个php版本
- 使用gradle指令运行测试脚本
- CSS3中text-overflow支持以...代替超出文本
- Mongoose populate方法
- 使用sklearn进行集成学习——理论
- c primer plus 第十章编程题
- java基础复习一:int与Integer
- spring boot下非web应用,mysql数据源报错问题
- Gson
- JavaScript专题系列20篇正式完结!
- Java高级开发工程师考纲
- win7安装adb
- Linux执行JAVA JAR出现java.io.IOException: Permission denied
- A Dynamic Algorithm for Local Community Detection in Graphs--阅读笔记