C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 線形リストを用いた商品注文プログラム


(過去ログ 137 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■80443 / inTopicNo.1)  線形リストを用いた商品注文プログラム
  
□投稿者/ 海の藻屑 (1回)-(2016/07/18(Mon) 18:49:04)

分類:[C/C++] 

課題を今日中に提出しなければならないのですが、セグメンテーション違反が出て大変困っています。
C言語、LINUX OSです。
仕様は次の通りです。

・ユーザーはメニューにある商品の中から商品を選んで注文する。
・ユーザーがENDと入力するまで注文を聞く。
・その際何個注文するかもあわせて入力してもらう
・メニューにない商品の注文はできない
・メニューは予め用意されたものがあるのでそのプログラムを読み込んで使用する
・以前注文したものと同じ物を注文する際は、以前注文した物の個数に今回注文した数を足す
・注文が終わったら注文したものの商品名、個数、合計金額を表示する
・線形リストを用いて実現する


以下のプログラムが予め用意されたメニューのプログラムでファイル名はyakitori.hです。


    	

    typedef struct
    {
      char *item;
      int unit_price;
      int number_of_pieces;
    } PRICE;
     
    PRICE menu[] = {
      {"Tsukune",480,0},
      {"Kohchin-bonziri",200,0},
      {"Negima",200,0},
      {"Tebasaki",200,0},
      {"Sinzo",180,0},
      {"Sunagimo",180,0},
      {"Liver",230,0},
      {"Hatsumoto",200,0},
      {"Nankotsu",200 ,0},
      {"Tori-kawa",180 ,0},
      {"Seseri",200,0},
      {"Yamaimo-negima",250,0},
      {"Sasami",180,0},
      {"Ume-sasami",230,0},
      {"Sasami-isobemaki",230,0},
      {"Sasami-sabiyaki",230,0},
      {"Lamb-rolled",480,0},
      {"Asparagus-rolled",200 ,0},
      {"Pork-negima",230,0},
      {"Quail-eggs",200 ,0},
      {"Mino",230,0},
      {"Green-papper",180,0},
      {"Mashroom",230,0},
      {"Kumidashi-tofu",250,0},
      {"Hiya-yakko",300,0},
      {"Yu-tofu",580,0},
      {"Toriaezu",780,0},
      {"Special-tomato-salad",780,0},
      {"Japanese-cucumber-pickles",300,0},
      {"Kimchi",380,0},
      {"Chicken-soup",300,0},
      {"Yaki-norimaki",150,0},
      {"Yaki-norimaki-chazuke",400,0},
      {"Seasonal-chazuke",480,0},
      {"Yaki-mochi",150,0},
      {"Homemade-pudding",300,0},
      {"Seasonal-dessart",350,0}
    };



以下が自分が作ったプログラムです。


    	

    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include"yakitori.h"
     
    typedef struct LIST
    {
        char *item_name;//商品名
        int one_price;//商品の単価
        int number_item;//何個注文されたか
        int number_prices;//合計金額(商品の単価×何個注文されたか)
        struct LIST *next;
            
    }list;
     
    list* new_node(char *name,int number,int number_item)//新規リスト生成
    {
        
        list *new=NULL;
        new=(list*)malloc(sizeof(list));
        
        if(new==NULL)
        {
          printf("割り当て失敗\n");//割り当て失敗
          return(NULL);
        }
        
        
          new->item_name=name;
          new->one_price=menu[number].unit_price;//number=メニューの何番目か
          new->number_item=number_item;//number_item=何個注文するか
          new->next=NULL;
         
          return(new);//fprintf( stderr, "Check\n" )で確認したところ問題ありそう?
        
            
            
            fprintf( stderr, "Check\n" );
    }
     
    int node_add(list *new_list,char *name,int number,int number_item)//最後尾にリスト追加
    {
        list *next=NULL;
        list *prev=new_list;
        
        next=new_node(name,number,number_item);
        
        while(prev->next!=NULL)
        {
            prev=prev->next;
        }
        
        prev->next=next;
        
        return (0);
    }
     
    void change_order(list **new_list,int number,int number_item)//注文された個数を変更する
    {
        int i;
        
        for(i=0;i<number;i++)
        {
            new_list=&((*new_list)->next);
        }
        
        (*new_list)->number_item+=number_item;
    }
     
    void culclate_amount(list *new_list)
    {
        int i;
        
        for(i=0;i<37;i++)
        {
            (new_list)->number_prices=((new_list)->number_item)*((new_list)->one_price);
             new_list=((new_list)->next);
        }
        
        
      
    }
     
    void list_print(list *new_list)
    {
        while(new_list!=NULL)
        {
          printf("%s\n",new_list->item_name);
          printf("%d個\n",new_list->number_item);
          printf("%d円\n",new_list->number_prices);
          putchar('\n');
          new_list=new_list->next;
        }
      
      
    }
     
    int main(void)
    {
        char *name;//品物
        int i,d;
        int number_item;
        int count_order=0;
        int judge;
        int judge_order[37]={0};
        list *new_list;
        
        while(1)
        {
            int judge;
            do 
            {
                int count=0;
                printf("ご注文は?\n");
                scanf("%s",name);
            
                d=strcmp(name,"END");
                if(d==0) 
                  break;
            
                for(i=0;i<37;i++)
                {
                if(strcmp(name,menu[i].item)!=0)
                  count++;          
                }
                
                if(count==37)
                printf("申し訳ありませんがその商品はありません。\n");
                
                judge=count;
                
            }while(judge==37);
            
            count_order++;
            if(d==0) 
              break;
            
            printf("何個ですか?\n");
            scanf("%d",&number_item);
                    
            
            for(i=0;i<37;i++)
            {
                if(!strcmp(name,menu[i].item))
                {
                      if(count_order==1)//1回目の注文ならばリスト新規作成
                      {
      
                      new_list=new_node(name,i,number_item);//new_list=一番先頭のノード
      
                      }else{//2回目以降の注文ならばリストを末尾に追加
     
                          if(judge_order[i]==0)//前に同じ品物の注文がされていない(その品物において初めての注文)ならば
                          {
                        judge_order[i]=1;/*次に同じ品物が注文された時に以前注文されたことが分かるようにする
                                (1=注文済み,0=まだ注文されたことがない*/
                        node_add(new_list,name,i,number_item);
                          }else{//judge_order[i]=1ならば(注文されたことがあるならば)すでにあるリストに個数を追加
                        change_order(&new_list,i,number_item);
                        
                          }
      
      
                       }
                }
            }
        }
        
        culclate_amount(new_list);//合計金額の計算
        
        list_print(new_list);
        
        free(new_list);
        return 0;
    }



実行結果は以下のようになりました。


ご注文は?
apple
申し訳ありませんがその商品はありません。
ご注文は?
orange
申し訳ありませんがその商品はありません。
ご注文は?
Sasami
何個ですか?
2
ご注文は?
Tsukune
何個ですか?
3
ご注文は?
Sasami
何個ですか?
4
ご注文は?
Sasami
何個ですか?
2
Segmentation fault (コアダンプ)


fprintf( stderr, "Check\n" )でプログラムを辿って確認していったのですが、どうやらnew_node関数のretunrn (new)に問題がありそう(ここだけを確認したので他にも問題はありそうです)ということが分かったのですが何がダメなのかは全く分かりません・・。

どなたかご教授よろしくお願いいたします。

引用返信 編集キー/
■80449 / inTopicNo.2)  Re[1]: 線形リストを用いた商品注文プログラム
□投稿者/ 774RR (427回)-(2016/07/19(Tue) 06:03:18)
リンク
http://dixq.net/forum/viewtopic.php?f=3&t=18214

全体的にツッコミどころしかないのだけどリンク先で指摘済みなようである。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -