C primer plus第10章(指針)練習問題


    //       *ptr *(ptr+2)       
    int *ptr;
    int torf[2][2] = {12,14,16};
    ptr = torf[0];
    //*ptr = 12;*(ptr+2) = 16; 16             

    int *ptr;
    int fort[2][2] = {{12},{14,16}};
    ptr = fort[0];
    //*ptr = 12;*(ptr+2) = 14;        ,      ,  2          

    //       **ptr **(ptr+1)       
    int(*ptr)[2];
    int torf[2][2] = {12,14,16};
    ptr = torf;
    //**ptr = 12;**(ptr+1) = 16; 16             

    int (*ptr)[2];
    int fort[2][2] = {{12},{14,16}};
    ptr = fort;
    //**ptr = 12;**(ptr+1) = 14;

6.以下の定義があると仮定する.
int grid[30][100];
a.grid[22][56]のアドレスを1つの方法で表示する
&grid[22][56]
b.grid[22][0]のアドレスを2つの方法で表す
&grid[22][0] = grid[22]
c.grid[0][0]のアドレスを3つの方法で表す
grid=(int*)grid=grid[0]=&grid[0][0]//gridは(int*)gridと同じです
7.次の各変数を適切な方法で宣言します.
int digits[10];
float rates[6];
int mat[3][5];
char *psa [20] = char *(psa[20]);//charを指すポインタを20個含む配列([]優先度は*より高いので、カッコがない場合はまず配列記述子を適用し、次にポインタ記述子を適用します)
char (*pstr) [20];//配列を指すポインタで、配列は20 char値で構成されます.
8,
int a[6] = {1,2,4,8,16,32};
a[2];
int a[100] = {[99] = -1};
10.
float rootbeer[10],things[10][5],*pf,value = 2.2;
int i = 3;
以下が正しいか間違っているか
rootbeer[2] = value;//正しい
scanf("%f",&rootbeer)/エラー、rootbeerはアドレスです.
rootbeer = value;//エラー、rootbeerはアドレスです
printf("%f",rootbeer);//エラー、rootbeerはアドレス%pを使うべきです
things[4][4] = rootbeer[3];//正しい
things[5] = rootbeer;//エラー、配列割り当ては使用できません
pf = value;//エラーvalueはアドレスではありません
pf = rootbeer;//正しい
12.以下は3つの配列宣言である.
double trots[20];
short clops[10][30];
long shots[5][10][15];
a.従来のvoid関数方式で、配列trotsを処理する関数プロトタイプと関数呼び出しを書く.次に、配列trotsを処理する関数のプロトタイプと関数呼び出しを長い配列で書く.
1.void a1(double trots[],int row);
a1(trots,20);
2.void a2(int row,trots[row]);
a2(20, trots);
b.従来のvoid関数方式で、配列clopsを処理する関数の原型と関数呼び出しを書く.次に、長い配列で、配列clopsを処理する関数のプロトタイプと関数呼び出しを書き出します.
1.void b1(short clops[][30],int row)
b1(clops,10);
2.void b2(int cols,int row,short clops[row][cols])
b2(10,30,clpos)
c.従来のvoid関数方式で、配列shotsを処理する関数プロトタイプと関数呼び出しを書き出し、その後、配列shotsを処理する関数プロトタイプと関数呼び出しを変長配列方式で書き出します.
1.void c1(long shorts[][10][15],int rows);
c1(shorts,5);
2.void c2(int row1,int row2,int row3, long shorts[row1][row2][row3])
c2(5,10,15,shorts);
10.
    show((double []){8,3,9,2},4);     show2((double[][3]){{8,3,9},{5,4,1},2);
プログラミング問題
1
#include 
#define MONTHS 12   //      
#define YEARS 5     //        
int main()
{
    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},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6}
    };
    int year,month;
    float subtot,total;
    printf("YEAR RAINFALL (inches)
"); for(year = 0,total = 0; year < YEARS; year++) { for(month = 0,subtot = 0; month

2.
#include 
int main()
{
    double a[2] = {1.2,2.3};
    double b[2];
    double c[2];
    cp1(a,b,2);
    cp2(a,c,2);
    return 0;
}

void cp1(double a[],double b[], int r)
{
    int i;
    for(i = 0; i 

3.
#include 
int main()
{
    int a[4] = {3,2,7,1};
    printf("%d",getMax(a,4));
    return 0;
}
/*
int getMax(int a[],int r)
{
    int i,m;
    for(i = 0,m = 0; i < r; i++)
    {
        if(a[i] >= m)
        {
            m = a[i];
        }
    }
    return m;
}
*/
int getMax(int *a,int r)
{
    int i,m;
    for(i = 0,m = 0; i < r; i++)
    {
        if(*a >= m)
        {
            m = *a;
        }
        *(a++);
    }
    return m;
}

4.
#include 
double getMax(double a[],int r);
int main()
{
    double a[4] = {3.1,2.1,7.1,1.1};
    printf("%lf",getMax(a,4));
    return 0;
}
/*
double getMax(double a[],int r)
{
    int i;
    double m;
    for(i = 0,m = 0; i < r; i++)
    {
        if(a[i] >= m)
        {
            m = a[i];
        }
    }
    return m;
}
*/
double getMax(double *a,int r)
{
    int i;
    double m;
    for(i = 0,m = 0; i < r; i++)
    {
        if(*a >= m)
        {
            m = *a;
        }
        *(a++);
    }
    return m;
}

5.
#include 
double getMax(double a[],int r);
int main()
{
    double a[4] = {3.1,2.1,7.1,1.1};
    printf("%lf",getMax(a,4));
    return 0;
}
/*
double getMax(double a[],int r)
{
    int i;
    double m,ma;
    for(i = 0,m = 0; i < r; i++)
    {
        if(a[i] >= m)
        {
            m = a[i];
        }
    }
    for(i = 0,m = 0,ma=a[i]; i < r; i++)
    {
        if(a[i] >= m){
            m = *a;
        }
        if(a[i] <= ma){
            ma = *a;
        }
    }
    return m-ma;
}
*/
double getMax(double *a,int r)
{
    int i;
    double m,ma;
    for(i = 0,m = 0,ma=*a; i < r; i++)
    {
        if(*a >= m)
        {
            m = *a;
        }
        if(*a <= ma)
        {
            ma = *a;
        }
        *(a++);
    }
    return m-ma;
}

6.
#include 
void cp1(double a[],double b[], int r);
int main(){ int i; double a[2][4] = {{3.1,2.1,7.1,1.1},{3.1,2.1,7.1,1.1}}; double b[2][4]; for(i = 0;i<2;i++) cp1(a[i],b[i],4); return 0;}void cp1(double a[],double b[], int r){ int i; for(i = 0; i
7
#include 
void cp1(double a[],double b[], int r);
int main(){ int i; double a[7][2] = {{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{7.1,1.1}}; double b[3][2]; for(i = 0; i<7; i++) { if(i > 1 && i <5) cp1(a[i],b[i],2); } return 0;}void cp1(double a[],double b[], int r){ int i; for(i = 0; i
8
#include 
void cp(int r,int c,double a[r][c],double b[r][c]);
void pr(int r,int c,double a[r][c],double b[r][c]);
int main()
{
    int i;
    double a[7][2] = {{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{7.1,1.1}};
    double b[7][2];
    cp(7,2,a,b);
    pr(7,2,a,b);
    return 0;
}
void cp(int r,int c,double a[r][c],double b[r][c])
{
    int i,j;
    for(i = 0; i 

9.
#include 
void add(int r,int c,double a[r][c],double b[r][c],double d[r][c]);
int main()
{
    int i;
    double a[7][2] = {{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{7.1,1.1}};
    double b[7][2] = {{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{3.1,2.1},{7.1,1.1},{7.1,1.1}};
    double c[7][2];
    add(7,2,a,b,c);
    pr(7,2,a,b,c);
    return 0;
}
void add(int r,int c,double a[r][c],double b[r][c],double d[r][c])
{
    int i,j;
    for(i = 0; i 

10
#include 
#define COLS 5
void add(int r,int c,double a[r][c],double b[r][c],double d[r][c]);
int main()
{
    int i;
    double a[3][5] = {{3.1,2.1,7.1,1.1,2,2},{3.1,2.1,7.1,1.1,2,2},{3.1,2.1,7.1,1.1,7.1}};
    pr(3,a);
    dou(3,a);
    pr(3,a);
    return 0;
}
void dou(int r,double a[][COLS])
{
    int i,j;
    for(i = 0; i 

11
#include 
#define MONTHS 12   //      
#define YEARS 5     //        
int main()
{
    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},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
        {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6}
    };
    int year,month;
    float subtot,total;
    printf("YEAR RAINFALL (inches)
"); fun1(rain); printf("
The yearly average is %.1f inches.

",total/YEARS); printf("MONTHLY AVERAGES:

"); printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
"); fun2(rain); printf("
"); return 0; } void fun1(const float rain[YEARS][MONTHS]) { int year,month; float subtot,total; for(year = 0,total = 0; year < YEARS; year++) { for(month = 0,subtot = 0; month

12/13
#include 
void input(int r,int c,double rain[r][c]);
void avg(int r,int c,double rain[r][c]);
int main()
{
    double rain[3][5];
    input(3,5,rain);
    avg(3,5,rain);
    return 0;
}

void input(int r,int c,double rain[r][c])
{
    int i,j;
    for(i=0; i