2016-12-06 5 views
-1

私は現在、まだCプログラミングスキルを練習していますが、ここには非常に多くのエラーがあり、何が間違っていて、修正する方法が混乱しています。それは私が練習していたデータベースプログラムのためのものです。多くのエラーとそれを修正する方法がわからない

それが示す保持:

new2.c:86: error: request for member ‘previousreading’ in something not a structure or union

new2.c:94: error: ‘Break’ undeclared (first use in this function)

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int custid; 
    char custname; 
    float currentreading; 
    float previousreading; 
    double charge; 
    int choice; 
    unsigned cust; 
    int revenue, meterdifference, BILL; 

    printf("----------------------------------\n"); 
    printf("Electricity Management System\n"); 
    printf("----------------------------------\n"); 
    printf("\n1. Record Usage"); 
    printf("\n2. Add Customer"); 
    printf("\n3. Edit Customer"); 
    printf("\n4. Delete Customer"); 
    printf("\n5. Show Customer"); 
    printf("\n6. Show Total monthly income"); 
    printf("\n7. Exit"); 


    scanf("%d",&choice); 

    if(choice >=1 || choice <=7) 
    { 
    switch(choice) 
     { 
      case 1: //Record Usage 
      printf("Enter Customer ID\n"); 

      FILE *cfPtr; 
      if ((cfPtr = fopen("customer.txt", "r"))== NULL) 
       puts("This file could not be opened"); 
      else 
       { 
        puts("Enter the customer ID, name."); 
        scanf("%d%29s", &cust.custid, cust.custname); 
        puts("Enter the current reading in kWh"); 
        scanf("%d", cust.currentreading); 

        if(cust.currentreading < cust.previousreading) 
        puts("Input invalid"); 
        else 
        { 
         if (cust.currentreading>=200) 
          { 
          cust.charge = (cust.currentreading - cust.previousreading)*21.80; 
          printf("\nThe charge is RM%f\n", &cust.charge); 
          } 
         else 
         { 
          if (cust.currentreading>=300) 
           { 
           cust.charge= ((cust.currentreading - cust.previousreading)*33.40)+21.80; 
           printf("\nThe charge is RM%f", &cust.charge); 
           } 
          else 
          { 
           if (cust.currentreading>=600) 
            { 
             cust.charge= ((cust.currentreading - cust.previousreading)*51.60)+21.80; 
             printf("\nThe charge is RM%f", &cust.charge); 
            } 
           else 
            { 
            if (currentreading>=900) 
             { 
             cust.charge = ((cust.currentreading - cust.previousreading)*54.60)+21.80; 
             printf("\nThe charge is RM%f", &cust.charge); 
             } 
            else 
             { 
             cust.charge = ((cust.currentreading - cust.previousreading)*57.10)+21.80; 
             printf("\nThe charge is RM%f", &cust.charge); 
             } 
            } 
          } 
         } 
        } 
       } 
      Break; 

      case2: //Add Customer 
      puts("This option allows user to add new customer"); 
      printf("Enter Customer ID and name."); 
      scanf("%d%c", &cust.custid, cust.custname); 
      puts("To return to menu"); 
      Break; 

      case 3: //Edit Customer 
      puts("This option allows user to edit customer info"); 
      Break; 

      case 4: //delete customer 
      puts("This option allows user to delete customer"); 
      Break; 

      case 5: //Show Customer 
      printf("To show customer information\n"); 
      FILE*tPtr; 
      char custid[100],custname[100]; 
      int previousreading,currentreading; 
      double charge; 

      printf("\n Show Customer\n"); 
      if((tPtr= fopen("customer.txt","r"))==NULL){ 
      puts("File not found"); 
       } 

      else{ 
       printf("%-15s%-25s%-20s%-15s%-15s\n","ID","Name","Previous Reading","Current Reading","Charges"); 
        while(!feof(tPtr)){ 
         fscanf(tPtr,"%[^;];%[^;];%d;%d;%lf",cust.custid,cust.custname,&cust.previousreading,&cust.currentreading,&cust.charge); 
         printf("%s\t\t%-25s%-20d%-15d%-15.2lf",cust.custid,cust.custname,cust.previousreading,cust.currentreading,cust.charge); 
        } 
        fclose(tPtr); 
       } 
       printf("\n\n"); 
       Break; 

      case 6: //Show total income(monthly) 
      puts("To show monthyly income"); 
      printf("total usagekWh, meterdifference"); 
      printf("%-15s%-35.2d\n", "Total UsagekWh","meterdifference"); 
      scanf("%-16dtotal usage(kWh)%-24d: %.2f",&meterdifference); 
      printf("%-13dtotal revenue%-24d: %.2f",BILL); 
      revenue=BILL; 
      printf("revenue is %.2f", BILL); 
      Break; 

      case 7: //Exit 
      Break; 
     } 
    } 
    else 
    printf("\nError. Number not in choices."); 

return 0; 
} 

typedef struct{ 
     int custid[50]; 
     char custname[100]; 
     int previousreading; 
     int currentreading; 
     float charges; 
}cust; 
+1

「休憩」ではなく「休憩」です。 Cは大文字と小文字を区別します。 – alk

+0

非常に多くのエラーがある場合は、まずコンパイラによって報告された最初のエラーを修正してください。多くの場合、これに続く他のエラーが修正されます。再コンパイルして繰り返します。 –

+0

構造を全く理解していないので、研究に戻ってください。 – KevinDTimm

答えて

3
  1. maintypedefを入れてください。 typedefは、の前に発生する必要があります。の場合は、それらをヴァイアブルと同じように使用してください。
  2. unsigned cust;cust cust;に置き換えます。 unsigned cust;unsigned int cust;と同じで、符号なし整数が宣言されている場合は、custを宣言します。
  3. typedef
  4. float charge;によってfloat charges;を交換break;によってBreak;を交換します。 C. Breakの事例は、がintではないので、Breakではありません。

次にコンパイルします。

正しく動作するかどうかは別の話です。

+0

@alk a typo:それは今修正されました。 –

0

あり、単一の構造ではない変数宣言の形でも、型定義として、あなたのコードではなく、あなたはおそらく、単にそれが構造だったかのように、符号なしintあるcustを扱っていますあなたはまた、

struct { 
    float previousreading; 
    float currentreading; 
    /* And so on */ 
} cust; 

意味、CにはBreakキーワードはありません、それはbreak、すべて小文字です。

しかし、

  1. により、たとえばタイプstruct Costumerの変数を宣言し使用できるように、新しいstructを作成し、それをしないでください。コードの最後と同じように、コンパイラはそれを使用する前にそれを知る必要があり、変数custはその型を持つ必要があります。あなたはcharの配列を必要とする文字列をしたい場合は

  2. charは、文字列型ではありませんので、char custname;文字列のために仕事に行くのではありません。

  3. 変数には意味のある名前を使用し、構造体と型名についてもメンバーを使用します。 custの代わりにcostumerのようにします。

追加NOTE

Why while (!foef(file)) is always wrongを参照してください。あなたのコードは常にfscanf()で読み込みを試みますが、それは失敗しますが、データを印刷するので、コードをコンパイルすると最後の行が2回印刷される可能性が非常に高いです。

戻り値がわからない場合はfscanf()の戻り値を確認してください。完全に理解できない場合は、fscanf(3)のマニュアルを必ずお読みください。


少なくとも、あなたはそれを使用しようとしないの前に。

関連する問題