---
# System prepended metadata

title: C習題6-22
tags: [C習題]

---

# C習題6-22
###### tags: `C習題`
## 題目:
>4個sales,5種產品, 每天每個Sales有0~5筆銷售資料.假設手上有上個月所有銷售資料,用一個二維陣列計算所有Sales對產品的每月銷售額,該Sales當月總銷售額,以及該產品之當月總銷售額.並印出報表.
## code:
```c=
#include <stdio.h>
#define SALES 4 /* there are 4 sales*/
#define GOODS 5 /* there are 5 products on sale*/
/*Function Prototype*/
void printArray(float array[GOODS][SALES],int col,int row);
float readData(float talbe[GOODS][SALES],int g,int s);
float initialArray(float array[GOODS][SALES], int col, int row);

int main()  /*to initialArray, read input data, print 1st row and print the rest array*/
{
    
    float t[GOODS][SALES]  ;
    initialArray(t,GOODS,SALES);
    readData(t,GOODS,SALES);
    printf("%s%s%s%s%s\n","********","Sales[1]","Sales[2]","Sales[3]","Sales[4]");
    printArray(t,GOODS,SALES);
    
    return 0;
}

float readData(float talbe[GOODS][SALES],int g,int s) /*in order to read input data stroke by stroke*/
{
    int sales,pnber;
    float amo;
    float table[GOODS][SALES] ; 
    
    
    printf("Enter Sales Notes(To end input, key in '-1'):\n");
    printf("Sales ID(1~4):\n");
    scanf("%d",&sales);
        /*printf("%d\n",sales);*/
    while(sales != -1) 
    {
    printf("Product Number(1~5):\n");
    scanf("%d",&pnber);
        /*printf("%d\n",pnber);*/
    printf("Sales Amount(USD):\n");
    scanf("%f",&amo);
        /*printf("%f\n",amo);
        printf("%f\t\n",table[pnber][sales]);*/
    printf("Sales ID:\n");
    scanf("%d",&sales);
        /*printf("%d\n",sales);*/
    
    table[pnber][sales] +=  amo;  /*in order to add amount in the coressponding coordinate*/
   /* table[GOODS][SALES] = table[pnber][sales];    */
        /*printf("%f\t\n",table[pnber][sales]);*/
    
    }
    return table[GOODS][SALES];
    
    
}

float initialArray(float array[GOODS][SALES], int col, int row) /*initial array*/
{
    int x, y;
    for(x=0;x<GOODS;x++) 
    {
        for(y=0;y<SALES;y++) 
        {
        
        array[x][y] = 0 ;    
        
        }
    }
    return array[x][y];
}

void printArray(float array[GOODS][SALES], int col, int row) /*print array*/
{
    int x, y;
    for(x=0;x<GOODS;x++) 
    {
        printf("Good[%d]",x+1);
        for(y=0;y<SALES;y++) 
        {
        
        printf("\t%6.2f",array[x][y]);    
        
        }
        
        printf("\n");
    }
}

```
## 心得
>建構中...print功能ok,正在處理輸入資料&分類儲存進二維陣列的部分。

>更新:仔細看了一下&重新查書發現幾個錯誤:
>1. 使用函式原型叫用的方式後發現在27行的table有typo, 導致每次輸出結果都是陣列初始化之後的結果(全0); 
>2. readData()中, 陣列加總在第二次print sales之後執行, 導致加總到錯的格子;調整到之前就可以正常執行;
>3. C陣列的第一行第一列是(0,0), 而Sales和goods沒有第0號, 使用這些數字會導致第一行與第一列都不會有值;將加總陣列內值各-1就可以印到正確的格子內.(第59行)
>4. 函式原型調整順序與main()函式叫用的順序相同。
>
>修改後程式碼如下:
## code:(v2)
```c=
#include <stdio.h>
#define SALES 4 /* there are 4 sales*/
#define GOODS 5 /* there are 5 products on sale*/

/*Function Prototype*/
float initialArray(float array[GOODS][SALES], int col, int row);
float readData(float table[GOODS][SALES],int pnber,int sales);
void printArray(float array[GOODS][SALES],int col,int row);

int main()  /*to initialArray, read input data, print 1st row and print the rest array*/
{
    
    float t[GOODS][SALES]  ;
    initialArray(t,GOODS,SALES);
    readData(t,GOODS,SALES);
    printf("%s%s%s%s%s\n","********","Sales[1]","Sales[2]","Sales[3]","Sales[4]");
    printArray(t,GOODS,SALES);
    
    return 0;
}

float initialArray(float array[GOODS][SALES], int col, int row) /*initial array*/
{
    int x, y;
    for(x=0;x<GOODS;x++) 
    {
        for(y=0;y<SALES;y++) 
        {
        
        array[x][y] = 0 ;    
        
        }
    }
    return array[x][y];
}


float readData(float table[GOODS][SALES],int pnber,int sales) /*in order to read input data stroke by stroke*/
{
    /*int sales,pnber;*/
    float amo;
    /*float table[GOODS][SALES] ; */
    
    
    printf("Enter Sales Notes(To end input, key in '-1'):\n");
    printf("Sales ID(1~4):\n");
    scanf("%d",&sales);
        /*printf("%d\n",sales);*/
    
    while(sales != -1) 
    {
    printf("Product Number(1~5):\n");
    scanf("%d",&pnber);
        /*printf("%d\n",pnber);*/
    printf("Sales Amount(USD):\n");
    scanf("%f",&amo);
        /*printf("%f\n",amo);
        printf("%f\t\n",table[pnber][sales]);*/
    table[pnber-1][sales-1] +=  amo;
    printf("Sales ID:\n");
    scanf("%d",&sales);
        /*printf("%d\n",sales);*/
    
    /*table[pnber][sales] +=  amo;*/  /*in order to add amount in the coressponding coordinate*/
   /* table[GOODS][SALES] = table[pnber][sales];    */
        /*printf("%f\t\n",table[pnber][sales]);*/
   
    }
    return table[pnber][sales];
    
    
}


void printArray(float array[GOODS][SALES], int col, int row) /*print array*/
{
    int x, y;
    for(x=0;x<GOODS;x++) 
    {
        printf("Good[%d]",x+1);
        for(y=0;y<SALES;y++) 
        {
        
        printf("\t%6.2f",array[x][y]);    
        
        }
        
        printf("\n");
    }
}
```
## 驗證資料儲存正確性:
>題目提到每個sales手上每天都有0~5條銷售資料, 且繳到我手上累積一個月的數量
>簡單驗證每個sales每樣商品都有銷售,每個sales的紙條有5張,但銷售金額不同,不考慮哪一天(因對我而言是手上有一桶資料慢慢key)
>
>紙條:

| Sales | 1   | 1   | 1   | 2   | 2   | 2   | 3   | 3   | 3   | 4   | 4   | 4   | 1   | 1   | 1   |
| ----- | --- | --- | --- | --- | --- | --- | --- | --- |:--- | --- | --- | --- | --- | --- | --- |
| P/N   | 1   | 1   | 1   | 2   | 2   | 2   | 3   | 3   | 3   | 4   | 4   | 4   | 5   | 5   | 5   |
| $     | 5   | 8   | 7   | 7   | 6   | 3   | 8   | 2   | 5   | 9   | 7   | 6   | 7   | 8   | 9   |

>結果應該會是:


| Sales  | sales1 | Sales2 | Sales3 | Sales4 |
|:------ | ------ | ------ | ------ |:------ |
| goods1 | 20     |        |        |        |
| goods2 |        | 16     |        |        |
| goods3 |        |        | 15     |        |
| goods4 |        |        |        | 22     |
| goods5 | 24     |        |        |        |
>實際印出結果:

![Uploading file..._82j5l8tjw]()








