2010-12-15 9 views
-2

私のプログラムが何をするか保存されません。.. は、あなたが私のコードを実行するときは、タスクを入力するために要求されますハッシュ表:それは正しく

store name 1 
itemcode quantity 
itemcode quantity 
. 
. 
store name 2 
itemcode quantity 
itemcode quantity 
. 
. 

形式のテキストファイルを読み込みます。 所定量とその項目を含むすべての店舗を印刷する上記のシーケンスを入力し、3つのオプションが

L itemcode quantity 

あります。

U itemcode quantity storename 

このオプションは、単に量の量で与えられたストアを更新このオプションのint型の量とStoreNameを itemcode 3つの引数関数を取ります。

Q 

このオプションは、現在のデータ構造をファイルに保存し直すSavefileメソッドを呼び出します。

問題。

私が直面している問題があります。 私は、ファイルを更新するたびに、それは正しく保存されません終了して保存するには、コマンドQを入力したときに、それが正常に更新しますが...

save_file(char *) 

それだけで最初の店が節約され、全体のデータを失った。..

stores.txt 

carrefour_Milan 
12345678 12 
23456766 16 
carrefour_Torino 
12345678 65 
67676765 12 
Carrefour_Vercelli 
23456766 20 

ともあなたが

int listfile(char *) 

の時間の複雑さを見つけるために私を助けることができる
int updatefile(char *,int ,char *) 

は、私はあなたのコードは非常に非効率的であるビッグO.

#include<stdio.h> 
    #include<string.h> 
    #include<stdlib.h> 
    #define MAX_ITEM 1000 
    #define MAXS 129 
    #define MAXL 132 
    #define MAXC 9 
    FILE *fp; 
    typedef struct store{ 
     char Storename[MAXS]; 
     int quantity; 
     struct store *NEXT; 
     }STORE; 

    typedef struct item{ 
     char item_code[MAXC]; 
     struct store *Stores; 
     struct item *NEXT; 
     }ITEM; 


    ITEM *list_item[MAX_ITEM]; 
    int readfile(char *fname); 
    int update_file(char *item_code,int qty,char *name); 
    int hash(char *item_code); 
    int save_file(char *fname); 
    void init(); 
void init(){ 
    int i; 
    for(i=0;i<MAX_ITEM;i++) 
     list_item[i]=NULL; 
    } 
int readfile(char *fname){ 
     char *p,line[MAXL+1],storen[MAXL+1]; 
     int pos; 
     ITEM *current=NULL,*prev=NULL; 
     STORE *s_cur=NULL,*s_prev=NULL; 
     char itemcode[MAXC];int qty; 
     if((fp=fopen(fname,"r"))==NULL) 
      return -1; 
     while(!feof(fp)){ 
      if(fgets(line,MAXL+1,fp)==NULL) 
       break; 
      if((p=strchr(line,'\n'))==NULL) 
       ; 
      else 
       *p='\0'; 
      if(line[0]>='a' && line[0]<='z' ||line[0]>='A' && line[0]<='Z') 
       strcpy(storen,line); 
      else{ 
       //fgets(line,MAXL,fp); 
       if(sscanf(line,"%s %d",itemcode,&qty)>0){ 

        current=(ITEM *)malloc(sizeof(ITEM)); 
        if(current==NULL) 
         return -1; 

        pos=hash(itemcode); 

        if(list_item[pos]==NULL){ 
         list_item[pos]=current; 
         if((s_cur=(STORE *)malloc(sizeof(STORE)))==NULL) 
          return -1; 

           strcpy(s_cur->Storename,storen); 
           strcpy(current->item_code,itemcode); 
           s_cur->quantity=qty; 
           current->Stores=s_cur; 
           s_cur->NEXT=NULL; 
           current->NEXT=NULL; 
        } 
        else{ 
         ITEM *q=list_item[pos]; 
         if((s_cur=(STORE *)malloc(sizeof(STORE)))==NULL) 
          return -1; 
         while(q!=NULL){ 
          if(strcmp(q->item_code,itemcode)==0){ 
           STORE *temp=q->Stores,*temp_a=NULL; 
           if(temp==NULL){ 
            q->Stores=s_cur; 
            strcpy(s_cur->Storename,storen); 
            s_cur->quantity=qty; 

            s_cur->NEXT=NULL; 
            } 
           else{ 
          while(temp!=NULL){ 
           temp_a=temp; 
           temp=temp->NEXT; 
          } 

           temp_a->NEXT=s_cur; 
           strcpy(s_cur->Storename,storen); 
           s_cur->quantity=qty; 
           s_cur->NEXT=NULL; 
           } 
          } 
         q=q->NEXT; 
         } 
         if(q==NULL){ 
          q=current; 
          current->NEXT=NULL; 
          current->Stores=s_cur; 
          strcpy(s_cur->Storename,storen); 
          s_cur->quantity=qty; 
          s_cur->NEXT=NULL; 
          } 
         } 
        } 
      } 
     } 
    fclose(fp); 
return 0; 
} 

int listfile(char *item_code,int qty){ 
      int i; 
      ITEM *u=NULL; 
      item_code[strlen(item_code)]='\0'; 
      if(list_item[hash(item_code)]==NULL) 
       return -1; 
      else{ 
       u=list_item[hash(item_code)]; 
       while(u!=NULL){ 
        if(strcmp(u->item_code,item_code)==0){ 
         STORE *temp=u->Stores; 
         while(temp!=NULL){ 
          if(temp->quantity>=qty){ 

          printf("STORE %s\n",temp->Storename); 
          } 
          temp=temp->NEXT; 
          } 
      } 
      u=u->NEXT; 
       } 
      } 
      return 0; 
    } 
    int update_file(char *item_code,int qty,char *name){ 

     ITEM *u=NULL; 
     item_code[strlen(item_code)]='\0'; 
     name[strlen(name)]='\0'; 
     if(list_item[hash(item_code)]==NULL) 
     return -1; 

     u=list_item[hash(item_code)]; 
     if(u==NULL) 
      return -1; 
     while(u!=NULL){ 
      if(strcmp(u->item_code,item_code)==0){ 
       STORE *temp=u->Stores; 
       while(temp!=NULL){ 
        if(strcmp(temp->Storename,name)==0) 
         temp->quantity+=qty; 
         temp=temp->NEXT; 
       } 
      } 
     u=u->NEXT; 
     } 
     return 0; 
    } 
    int hash(char *item_code){ 
     int sum=0,s=0; 
     while(item_code[s]!='\0'){ 
     sum+=33*item_code[s]; 
     s++;} 
     return sum%MAX_ITEM; 
     } 

    void clear(){ 
      char c; 
      while(c!='\n') 
       scanf("%c",&c); 
      } 

    main(){ 
     int y; 
     char fname[]="stores.txt",line[MAXL],command,z[MAXS]; 
     char x[MAXC]; 
     init(); 
     if(readfile(fname)==-1) 
      printf("Error reading file!"); 
     else{ 
     do{ 
      printf("Enter task:"); 
      fgets(line,MAXL,stdin); 
      sscanf(line,"%c",&command); 
      switch(command){ 
       case 'L': sscanf(line,"%c%s%d",&command,x,&y); 

          if(listfile(x,y)==-1) 
          printf("No items were found\n"); 
          break; 
       case 'U':sscanf(line,"%c%s%d%s",&command,x,&y,z); 
         if(update_file(x,y,z)==0) 
          printf("Update OK\n"); 
         else 
          printf("Error when updating\n"); 
          break; 
       case 'Q':if(save_file(fname)==0) 
          printf("Done\n!"); 
          break; 
       default:printf("Enter correct command\n"); 
         break; 
       } 
      }while(command!='Q'); 
     } 
    } 
int save_file(char *fname){ 
ITEM *p=NULL,*q=NULL; 
int num=0,i,j; 
char str[MAXS]; 

if((fp=fopen(fname,"w"))==NULL) 
    return -1; 
    for(i=0;i<MAX_ITEM;i++){ 
     if(list_item[i]==NULL) 
      ; 
     else{ 
      p=list_item[i]; 
      while(p!=NULL){ 
       STORE *s=p->Stores; 
       if(s==NULL) 
        ; 
       else{ 
        if(strcmp(s->Storename,"0000\0")!=0){ 
        strcpy(str,s->Storename); 
        // puts(str); 
        fprintf(fp,"%s\n",str); 
        } 
        while(s!=NULL){ 
        for(j=0;j<MAX_ITEM;j++){ 
         if(list_item[j]==NULL) 
          ; 
         else{ 
          q=list_item[j]; 
          while(q!=NULL){ 
           STORE *st=q->Stores; 
           if(st==NULL) 
            ; 
            else{ 
             while(st!=NULL){ 
             if(strcmp(st->Storename,str)==0 && strcmp(st->Storename,"0000\0")!=0){ 

              printf("%s %d\n",q->item_code,st->quantity); 
              fprintf(fp,"%s %d\n",q->item_code,st->quantity); 
              strcpy(st->Storename,"0000\0"); 
              } 
              st=st->NEXT; 
             } 
             } 
           q=q->NEXT; 
           } 
          } 
         } 
         s=s->NEXT; 
         } 
       } 
     p=p->NEXT; 
     } 
     } 
    } 
    fclose(fp); 
    return 0; 
     } 
+2

コードを書式化してください。これを実際に問題を示す小さなコードに減らしてください。それはたくさんのコードです。 – birryree

+1

これは宿題の問題ですか?もしそうなら、そのようにタグを付けてください。 – George

+4

私のアドバイスは、最初にあなたのコードを徹底的にコメントして、各ステップを自分自身で話すことです。 –

答えて

3

これは一貫性がなく、判読不能な混乱です。レイアウトをリファクタリングするための第一歩としてお勧めします。

インデントを修復して、コード構造を反映させます。ブレーススタイルを選択し、一貫して使用します。この

if(x){ 
    ; 
    }else{ 
     foo(); 
     } 

のようなものが良く、このようになります。任意のデバッグや保守のためのより良い出発点だ

if (x) { 
    ; 
} 
else { 
    foo(); 
} 

を。そして、多くのメンテナンスが必要です。

+0

私は実際にあなたのコードのいくつかをカットしてテキストエディタに貼り付けました。私はそれを正しく字下げして正確に読むことができました。特に、他の人が実際にあなたのコードを読んでコメントに気を付けることを望むならば、Secureは非常に良い点になります。 – AlastairG

3

を意味します。たとえば、ファイルを読むときには、if文の両方のブランチで別々にストア構造をmallocし、3つの異なる場所、つまり異なるコードパスにストア名をコピーします。単に店舗構造をmallocして、それをどこに置くかを決める前に正しく初期化するのはなぜですか?

また、読み取りファイル機能では、項目に対応するハッシュテーブルの位置が空でない場合、「現在」に割り当てられたメモリがリークします。あなたが実際にアイテムの一致を見つけた場合

さらに、あなたは、コードのブロックが始まることを意味しループの外に壊れない:

    if(q==NULL){ 
         q=current; 

が実行されます。

最後に(今のところ)、ハッシュテーブルのスロットがいっぱいだが一致するアイテムコードがない場合、アイテムはハッシュテーブルに入れられません。あなたのコードを見てください。どの時点で "list_item [pos]"で始まるチェーンのどの部分に "現在"を割り当てていますか?あなたはそうしない。 "q = current"を実行すると、ある値が別の変数に格納されます。必要なのは次のようなものです:

current->next = list_item[pos]; 
list_item[pos] = current; 

リストの先頭に追加してください。

ファイル書き込み機能を気にする前に、ファイル読み取り機能を修正することをお勧めします。

P.S. upvoteとより多くのコメントの要求はあなたにもう少し助けを得るかもしれません。どのように忙しいかに応じて、また他の人が手伝ってもらうことができるかどうかによって異なります。

関連する問題