複数の構造体について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
box
記事: 1737
登録日時: 8年前

Re: 複数の構造体について

#31

投稿記事 by box » 6年前

コード全体をちゃんと追いかけたわけではありませんが、
main関数の最後の方にある
小岩井 さんが書きました:

コード:

StudentHead = (buffer,StudentHead);
この部分は、おそらく意図どおりには動かないと思います。
実際には、(buffer の前に関数名が来るのではありませんか?
このコードでは、事実上

コード:

    StudentHead = StudentHead;
と書いたのと同じになっています。そういう意図ではないですよね?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

小岩井

Re: 複数の構造体について

#32

投稿記事 by 小岩井 » 6年前

box さんが書きました:コード全体をちゃんと追いかけたわけではありませんが、
main関数の最後の方にある
小岩井 さんが書きました:

コード:

StudentHead = (buffer,StudentHead);
この部分は、おそらく意図どおりには動かないと思います。
実際には、(buffer の前に関数名が来るのではありませんか?
このコードでは、事実上

コード:

    StudentHead = StudentHead;
と書いたのと同じになっています。そういう意図ではないですよね?
抜かりがありました。ご指摘ありがとうございます…。
ただしくは

コード:

StudentHead = addStudent(buffer,StudentHead);
でした。
しかしこれでもセグメンテーション違反なのです。
そういうコメントが出る理由は調べましたが、該当する箇所がピンときません…。

box
記事: 1737
登録日時: 8年前

Re: 複数の構造体について

#33

投稿記事 by box » 6年前

小岩井 さんが書きました:

コード:

main()
    struct Student_Entry *StudentHead = NULL;
	StudentHead = addStudent(buffer,StudentHead);
main関数でaddStudent関数を初めて呼び出す際、引数StudentHeadはNULLです。
ということは、
小岩井 さんが書きました:

コード:

struct Student_Entry* addStudent(char *addnumber, struct Student_Entry *ptr)
    (tailStudent(ptr))->next = p;
第2引数のptrがNULLですから、tailStudent関数にNULLを渡しています。
小岩井 さんが書きました:

コード:

struct Student_Entry* tailStudent(struct Student_Entry *t)
{
    if(t->next == NULL)
	return t;
    tailStudent(t->next);
}
tailStudent関数の引数tがNULLですから、そのメンバーであるnextを参照しようとすると
セグメント違反が起きるのは致し方ないと思います。

別の回答者さんからの回答にあったと思いますが、リスト構造の絵を書いてみましたか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

小岩井

Re: 複数の構造体について

#34

投稿記事 by 小岩井 » 6年前

box さんが書きました: tailStudent関数の引数tがNULLですから、そのメンバーであるnextを参照しようとすると
セグメント違反が起きるのは致し方ないと思います。
そ、そういうことでしたか…。
値が入っていればセグメント違反は出ないのですね!
box さんが書きました: 別の回答者さんからの回答にあったと思いますが、リスト構造の絵を書いてみましたか?
どういうことをすればいいか絵を書いてわかったこともあるのですが、それをプログラムに…となるとどうすればいいのかわからなくなります。
実際に打って何がいけないか考える作業が少ないのが原因だと思います…。

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#35

投稿記事 by non » 6年前

なんで、再帰。再帰を使っていけないわけではないけど、何のためにサンプルがあるページを示したの。わざわざ、違う方法を使う理由がわからない。サンプルが理解できてから、違う方法にチャレンジすべきじゃないかな。
non

小岩井

Re: 複数の構造体について

#36

投稿記事 by 小岩井 » 6年前

non さんが書きました:なんで、再帰。再帰を使っていけないわけではないけど、何のためにサンプルがあるページを示したの。わざわざ、違う方法を使う理由がわからない。サンプルが理解できてから、違う方法にチャレンジすべきじゃないかな。
すみませんでした。サンプルページのおかげで、実行結果を表示できました。

コード:

struct Student_Entry* addStudent(char *addnumber,struct Student_Entry *ptr)
{
    struct Student_Entry *p;
    p = (struct Student_Entry *)malloc(sizeof(struct Student_Entry));
    strcpy(p -> number, addnumber);
 
    while(p != NULL)
    {
        if(ptr == NULL)
        {
            return p;
        }
        else
        {
            struct Student_Entry *q = ptr;
            while(q->next != NULL)
            {
                q = q->next;
            }
            q->next = p;
            return ptr;
        }      
    }
}

main()
{
    FILE *fp;
    char buffer[1024];

    struct Student_Entry *StudentList = NULL;
    fp = fopen("text.txt", "r");

    while(fscanf(fp, "%s", buffer) != EOF)
    {
        StudentList = addStudent(buffer, StudentList);
    }
    dispStudent(StudentList->next);
    fclose(fp);
}
挿入箇所を探すことはできた、と思います。
strcmpで比較する処理もやっていきます!

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#37

投稿記事 by non » 6年前

7行目 while(p != NULL)
これってなぜwhile?

6行目あたりに、 p->next=NULL;
が必要だと思うけど。

まだたいして長くないので、プログラムは省略せずに全部載せてください。途中からスレッドを読む人がわかりにくいし、こちらも試すのに面倒です。

ついでに main() は
int main(void)
と書いてもらえますか。
non

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#38

投稿記事 by non » 6年前

そろそろ、もともと課題用に用意されているTEXT.TXTを添付してもらえますか。
non

小岩井

Re: 複数の構造体について

#39

投稿記事 by 小岩井 » 6年前

non さんが書きました:そろそろ、もともと課題用に用意されているTEXT.TXTを添付してもらえますか。
課題用のテキストファイルですが、ざっと見るかぎり100日以上ありそこに出席番号がずらっと並んであるのと学内専用のページにあるので難しいです…。
ファイル内は日付順ならびに出席番号順で用意されています。

コード:

20120404

20120406

20120411
B3000011
B3000015
....
....

20120413
B3000011
B3000014
....
....
20130301

20130306
B3000121

20130308
一部抜粋ですが、出席していない日付などがあります。

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#40

投稿記事 by non » 6年前

共通のデータで実行しないと、同じ結果を確認できません。
テスト用のデータを作ってファイル添付してください。
non

小岩井

Re: 複数の構造体について

#41

投稿記事 by 小岩井 » 6年前

コード:

20130130
B0000064

20130201
B0000005
B0000064

20130206

20130208

20130213

20130215

20130220

20130222

20130227
B0000005
B0000094
B0000117

20130301

20130306
B0000117

20130308

こんなものでよろしいでしょうか…?

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#42

投稿記事 by non » 6年前

すると、空白行があったり、出席者がいない日付があるわけですね。了解しました。
non

かずま

Re: 複数の構造体について

#43

投稿記事 by かずま » 6年前

その入力に対する出力はこれでいいですか?

コード:

B0000005
2013.2.1
2013.2.27

B0000064
2013.1.30
2013.2.1

B0000094
2013.2.27

B0000117
2013.2.27
2013.3.6

なお、この出力は次のプログラムによるものです。
C ではなく、C++ なので、課題の解答ではありません。

コード:

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <list>
#include <cstdlib>

int main()
{
    using namespace std;
    string id, date;
    typedef list<string> Dates;
    typedef map<string, Dates> Students;
    Students students;
    ifstream ifs("text.txt");
    if (!ifs) return 1;

    while (ifs >> id)
        if (id[0] == 'B') students[id].push_back(date);
        else date = id;
    for (Students::iterator si = students.begin(); si != students.end(); ++si) {
        cout << si->first << endl;
        Dates& dates = si->second;
        for (Dates::iterator di = dates.begin(); di != dates.end(); ++di)
            cout << di->substr(0, 4) << '.'
                << atoi(di->substr(4, 2).c_str()) << '.'
                << atoi(di->substr(6, 2).c_str()) << endl;
        cout << endl;
    }
}

かずま

Re: 複数の構造体について

#44

投稿記事 by かずま » 6年前

"B0000064" は 8文字ですが、末尾の '\0' を含めると 9バイト
なので、struct Student_Entry の char number[8]; には
入らないことに注意してください

小岩井

Re: 複数の構造体について

#45

投稿記事 by 小岩井 » 6年前

かずま さんが書きました:"B0000064" は 8文字ですが、末尾の '\0' を含めると 9バイト
なので、struct Student_Entry の char number[8]; には
入らないことに注意してください
それはchar number[10]に変更すれば大丈夫そうですね。
出力結果はそれで合っています!
それだけでできるものなんですね…驚いています。
そう!atoiでchar型をint型に変更してねーと先生が言っていたのを思い出しました。
引き続き頑張ってみます。

小岩井

Re: 複数の構造体について

#46

投稿記事 by 小岩井 » 6年前

初めてC++のプログラムを見ましたが…、なんとなくはわかるのですが知らない文法もあり混乱しています…。
提出期限ギリギリまで完成しないのは私の責任です。
わがままではありますが、完成するまでもう少し噛み砕いてご教授いただけないでしょうか…?

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#47

投稿記事 by non » 6年前

C++の勉強するのは課題が終わってからにしなさいよ。
non

小岩井

Re: 複数の構造体について

#48

投稿記事 by 小岩井 » 6年前

non さんが書きました:C++の勉強するのは課題が終わってからにしなさいよ。
もちろんそのつもりです!
C言語においてどうすれば課題がクリアできるか教えていただきたかったのです。言葉が足りませんでした…。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Student_Entry
{
    char number[10];
    struct Student_Entry *next;
};
 
struct Date_Entry
{
    int year;
    int month;
    int day;
    struct Date_Entry *next;
};
 

struct Student_Entry* addStudent(char *addnumber, struct Student_Entry *ptr)
{
    struct Student_Entry *p;
    p = (struct Student_Entry *)malloc(sizeof(struct Student_Entry));
    strcpy(p -> number, addnumber);
    p->next = NULL;

    if(ptr == NULL)
    {
        p->next = NULL;
        return p;
    }
    else 
    {
        struct Student_Entry *q = ptr;
        while(q->next != NULL)
        {
            q = q->next;
        }
        q->next = p;
        return p;
    }
}

void dispStudent (struct Student_Entry *ptr)
{
    while(ptr != NULL)
    {
    printf("%s\n", ptr -> number);
    ptr = ptr -> next;
    }
}
 
main()
{
    FILE *fp;
    char buffer[1024];
    
    struct Student_Entry *StudentList = NULL;
 
    fp = fopen("text.txt", "r"); 
 
    while(fscanf(fp, "%s", buffer) != EOF)
    {
    StudentList = (buffer,StudentList);
    }
    dispStudent(StudentList->next);
    fclose(fp); 
}
実行結果は以下になります。

コード:

20130201
B0000005
B0000064
20130206
20130208
20130213
20130215
20130220
20130222
20130227
B0000005
B0000094
B0000117
20130301
20130306
B0000117
20130308
text.txtに記載されている最初の
2013130
B000064
が表示されませんでした。



もう一度ご教授願えないでしょうか…?

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#49

投稿記事 by non » 6年前

あなたが、動かしているプログラムをそのまま、載せてください。
これに投稿するために打ち直しているのですか?
non

小岩井

Re: 複数の構造体について

#50

投稿記事 by 小岩井 » 6年前

コード:


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


struct Student_Entry
{
    char number[10];
    struct Student_Entry *next;
};


struct Date_Entry
{
    char year[10];
    char month;
    char day;
    struct Date_Entry *next;
};


int before(struct Date_Entry* a, struct Date_Entry* b) {
    if (a->year < b->year) {
        return 1;
    }
    else if (a->year == b->year) {
        if (a->month < b->month) {
            return 1;
        }
        else if (a->month == b->month) {
            if (a->day < b->day) {
                return 1;
            }
	    
	}
    }
    
    return 0;
}
 
struct Student_Entry *addStudent(char *addnumber, struct Student_Entry *ptr)
{
    struct Student_Entry *p;
    p = (struct Student_Entry *)malloc(sizeof(struct Student_Entry));
    strcpy(p->number,addnumber);
    p->next  = NULL;


    if(ptr == NULL)
    {
	p->next = NULL;
	return p;
    }
    else
    {
	struct Student_Entry *q = ptr;
	while(q->next != NULL)
	{
	    q = q->next;
	}
	q->next = p;
	return ptr;
    }
}

struct Date_Entry* addDate(int y,int m,int d,char date[], struct Date_Entry *ptr)
{
    struct Date_Entry *p;
    p = (struct Date_Entry *)malloc(sizeof(struct Date_Entry));
    p->month=m;
    p->day=d;
    strcpy(p->year,date);

    if(ptr == NULL)
    {
	p->next  = NULL;
	return p;
    }
    else if(before(p, ptr) == 1)
    {
	p->next = ptr;
	return p;
    }
    else
    {
	struct Date_Entry *q = ptr;
	while(q->next != NULL && before(p,q->next) == 0)
	{
	    q = q->next;
	}
	struct Date_Entry *n = q->next;
	q->next = p;
	p->next = n;
	return ptr;
    }
}

void dispStudent (struct Student_Entry *ptr)
{
    while(ptr != NULL)
    {
	printf("%s\n", ptr -> number);
	ptr = ptr -> next;
    }
}

 
int main()
{
    FILE *fp;
    char buffer[1024];
    
    struct Student_Entry *StudentList = NULL;
    struct Date_Entry *DateList = NULL;

    fp = fopen("text.txt", "r"); 

    while(fscanf(fp, "%s", buffer) != EOF)
    {
	if(buffer[0]=='B')
	{
	    StudentList = addStudent(buffer,StudentList);
	}
	else
	{
	    StudentList = addStudent(buffer,StudentList);
	}
    }
    dispStudent(StudentList->next);
    fclose(fp);	
}
これが私の動かしているプログラムです。
日付を加える処理を出席番号を加えるものと同様にしたものを追加してあります。

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#51

投稿記事 by non » 6年前

130 行 dispStudent(StudentList->next);

dispStudent(StudentList);
でしょう。
また、これで出力されないのは先頭の1行であり、2行出ていないと思っているのは勘違いでしょう。

また、関数 beforeは日付で並べる必要はないので、(もともと日付順で入力される)不要です。

それより、addstudentを番号順に挿入できるようにしてください。
non

小岩井

Re: 複数の構造体について

#52

投稿記事 by 小岩井 » 6年前

non さんが書きました:それより、addstudentを番号順に挿入できるようにしてください。
そのことなんですが、課題用のテキストファイルは日付順かつ出席番号順に記述されているので、ただ挿入するだけでいいという気もするのです…。
とにかく追加できるようやってみます。

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#53

投稿記事 by non » 6年前

小岩井 さんが書きました:
non さんが書きました:それより、addstudentを番号順に挿入できるようにしてください。
そのことなんですが、課題用のテキストファイルは日付順かつ出席番号順に記述されているので、ただ挿入するだけでいいという気もするのです…。
とにかく追加できるようやってみます。
その日だけで考えれば、確かに学籍番号順なのですが、欠席した学生が後ででてくることもあるので、出席番号順に挿入できるようにしておかなくてはいけません。できあがりの絵がわかってないからイメージがつかめないのです。
添付ファイル
LIST.JPG
LIST.JPG (58.94 KiB) 閲覧数: 863 回
non

アバター
usao
記事: 1546
登録日時: 6年前

Re: 複数の構造体について

#54

投稿記事 by usao » 6年前

うーん,

課題の内容を読む → どうやって実現するか(日本語)を決める → 実現するためのコードを書く
という流れの,真ん中の部分があやふやなままだと,最後のコードをちゃんと書けないわけで,
そんな感じの状況に陥っているように見受けます.

ばかばかしいと思われるかもしれませんが,
自身が書いたコードに存在する個々の要素(関数,構造体,変数)毎に,
・それがなんなのか(役割.何のために必要で用意したのか)
を書いてみると 頭の中の整理の助けになったりしないでしょうか?

例えば,

コード:

//学生毎のデータを格納する用の構造体.
//・特定の学生を表すための学籍番号と,
// その学生が出席した日時のリストを 変数として保持する
//・また,nextを用いて数珠つながりなデータ構造を作ることで
// 学生データのリストを表現する
struct Student_Entry
{
    //この学生のデータ
    char number[10];  //学籍番号(文字列)
    struct Date_Entry *pDateListHead;  //出席日時リストの先頭要素へのポインタ.(最初(Student_Entry型変数を作ったとき)にNULLに初期化すること!)

    //学生リスト構築用
    struct Student_Entry *next;  //次の学生のデータへのポインタ.(次が無い時はNULLを格納すること!)
};
みたく.

自然と 何をどうすべきか,今のコードに変な(意味や役割のわからない)部分が無いか 等が見えてくると思います.
(回答者も 各所が何を意図して書いたコードなのか を理解しやすくなりますし,
 もしコードも提出する課題だったら,きちっとこういったことが書かれていたら 私だったら好印象)

小岩井

Re: 複数の構造体について

#55

投稿記事 by 小岩井 » 6年前

non さんが書きました:その日だけで考えれば、確かに学籍番号順なのですが、欠席した学生が後ででてくることもあるので、出席番号順に挿入できるようにしておかなくてはいけません。できあがりの絵がわかってないからイメージがつかめないのです。
絵を描いていただきありがとうございます!
なんとなくのイメージはあるのですが、前にも言ったようにそれをどう組み立てていけばいいのかさっぱりでして…。

番号順に追加するところでつまづいています。

コード:

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

struct Student_Entry
{
    char number[10];
    struct Student_Entry *next;
};


struct Date_Entry
{
    char year[10];
    char month;
    char day;
    struct Date_Entry *next;
    struct Student_Entry *studentlist;
};



struct Student_Entry *addStudent(char *addnumber, struct Student_Entry *ptr)
{
    struct Student_Entry *p, *q;
    p = (struct Student_Entry *)malloc(sizeof(struct Student_Entry));
    strcpy(p->number,addnumber);

    if(addnumber)
    {
        while(p)
        {
        if(!strcmp(p->next,addnumber))
	    break;
        p = p->next;
        }
        return p;
    }

    if(ptr == NULL)
    {
	p->next = NULL;
	return p;
    }
    else
    {
	struct Student_Entry *q = ptr;
	while(q->next != NULL)
	{
	    q = q->next;
	}
	q->next = p;
	return ptr;
   }
}

struct Date_Entry* addDate(int y,int m,int d,char date[], struct Date_Entry *ptr)
{
    struct Date_Entry *p;
    p = (struct Date_Entry *)malloc(sizeof(struct Date_Entry));
    strcpy(p->year,date);
    p->next  = NULL;

    if(ptr == NULL)
    {
	p->next = NULL;
	return p;
    }
    else
    {
	struct Date_Entry *q = ptr;
	while(q->next != NULL)
	{
	    q = q->next;
	}
	q->next = p;
	return ptr;
    }
}

void dispStudent (struct Student_Entry *ptr)
{
    while(ptr != NULL)
    {
	printf("%s\n", ptr -> number);
	ptr = ptr -> next;
    }
}

void dispDate(struct Date_Entry *ptr)
{
    while(ptr != NULL)
    {
	printf("www%s\n", ptr-> year);
	ptr = ptr->next;
    }
}


int main()
{
    FILE *fp;
    char buffer[1024];
    struct Student_Entry *StudentList = NULL;
    struct Date_Entry *DateList = NULL;
    fp = fopen("text.txt", "r");
   while(fscanf(fp, "%s", buffer) != EOF)
    {
	if(buffer[0]!='B')
	{
	    StudentList = addStudent(buffer,StudentList);
	}
	else
	{
	    StudentList = addStudent(buffer,StudentList);
	}
    }
    dispStudent(StudentList);
    fclose(fp);	
}

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#56

投稿記事 by non » 6年前

これが、私が前に示したHPの挿入部分

コード:

if (list == NULL) {        /* リストが空の場合は特別扱いする */        
	node->next = NULL;        
	return node;    
}
else if (before(node, list) == 1) {        /* 新しい要素が日付順でもっとも早い */        
	node->next = list;        
	return node;    
}    
else {        /* 挿入位置を決める */        
	struct schedule* p = list;        
	while (p->next != NULL && before(node, p->next) == 0) {            
		p = p->next;        
	}        /* 新しい要素は変数 p がさす要素の直後に挿入 */        
	struct schedule* n = p->next;        
	p->next = node;        
	node->next = n;        
	return list;    
}
下が、あなたのプログラム

コード:

if(addnumber)
{
	while(p)
	{
		if(!strcmp(p->next,addnumber))
			break;
		p = p->next;
	}
	return p;
}

if(ptr == NULL)
{
	p->next = NULL;
	return p;
}
else
{
	struct Student_Entry *q = ptr;
	while(q->next != NULL)
	{
		q = q->next;
	}
	q->next = p;
	return ptr;
}
なぜ、参考にしないのですか?
non

小岩井

Re: 複数の構造体について

#57

投稿記事 by 小岩井 » 6年前

non さんが書きました:これが、私が前に示したHPの挿入部分

コード:

if (list == NULL) {        /* リストが空の場合は特別扱いする */        
	node->next = NULL;        
	return node;    
}
else if (before(node, list) == 1) {        /* 新しい要素が日付順でもっとも早い */        
	node->next = list;        
	return node;    
}    
else {        /* 挿入位置を決める */        
	struct schedule* p = list;        
	while (p->next != NULL && before(node, p->next) == 0) {            
		p = p->next;        
	}        /* 新しい要素は変数 p がさす要素の直後に挿入 */        
	struct schedule* n = p->next;        
	p->next = node;        
	node->next = n;        
	return list;    
}
下が、あなたのプログラム

コード:

if(addnumber)
{
	while(p)
	{
		if(!strcmp(p->next,addnumber))
			break;
		p = p->next;
	}
	return p;
}

if(ptr == NULL)
{
	p->next = NULL;
	return p;
}
else
{
	struct Student_Entry *q = ptr;
	while(q->next != NULL)
	{
		q = q->next;
	}
	q->next = p;
	return ptr;
}
なぜ、参考にしないのですか?
す、すみませんでした…。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct Student_Entry
{
    char number[10];
    struct Student_Entry *next;
};
 
 
struct Date_Entry
{
    char year[10];
    char month;
    char day;
    struct Date_Entry *next;
    struct Student_Entry *studentlist;
};


int before(struct Student_Entry *a, struct Student_Entry *b)
{
    if(a->number < b->number)
    {
        return 1;
    }
    else if(a->number == b->number)
    {
        return 1;
    } 
    return 0;
} 
 
struct Student_Entry *addStudent(char *addnumber, struct Student_Entry *ptr)
{
    struct Student_Entry *p;
    p = (struct Student_Entry *)malloc(sizeof(struct Student_Entry));
    strcpy(p->number,addnumber);

    if(ptr == NULL)
    {
        p->next = NULL;
        return p;
    }
    else if(before(p,ptr) == 1)
    {
        p->next = ptr;
        return p;
    }
    else
    {
        struct Student_Entry *q = p;
        while(q->next!=NULL && before(p,q->next)==0)
        {
            struct Student_Entry *n = q->next;
            q->next = p;
            p->next = n;
            return ptr;
        }
    }
}
 
struct Date_Entry* addDate(int y,int m,int d,char date[], struct Date_Entry *ptr)
{
    struct Date_Entry *p;
    p = (struct Date_Entry *)malloc(sizeof(struct Date_Entry));
    strcpy(p->year,date);
    p->next  = NULL;
 
    if(ptr == NULL)
    {
    p->next = NULL;
    return p;
    }
    else
    {
    struct Date_Entry *q = ptr;
    while(q->next != NULL)
    {
        q = q->next;
    }
    q->next = p;
    return ptr;
    }
}
 
void dispStudent (struct Student_Entry *ptr)
{
    while(ptr != NULL)
    {
    printf("%s\n", ptr -> number);
    ptr = ptr -> next;
    }
}
 
void dispDate(struct Date_Entry *ptr)
{
    while(ptr != NULL)
    {
    printf("www%s\n", ptr-> year);
    ptr = ptr->next;
    }
}
 
 
int main()
{
    FILE *fp;
    char buffer[1024];
    struct Student_Entry *StudentList = NULL;
    struct Date_Entry *DateList = NULL;
    fp = fopen("text.txt", "r");
   while(fscanf(fp, "%s", buffer) != EOF)
    {
    if(buffer[0]!='B')
    {
        StudentList = addStudent(buffer,StudentList);
    }
    else
    {
        StudentList = addStudent(buffer,StudentList);
    }
    }
    dispStudent(StudentList);
    fclose(fp); 
}
実行結果は
20130130
のみとなりました。
before関数内で同じ番号だったときの処理がまずいのでしょうか…。

アバター
usao
記事: 1546
登録日時: 6年前

Re: 複数の構造体について

#58

投稿記事 by usao » 6年前

ちょっとコード変えた→結果はこうなった→動きませんが?
みたいなことを繰り返すよりも,
せめて
「○○してみて,動きを追ってみたところ
 ここでしくじっているせいで うまくいっていないところまでは突き止めたんだけど
 なんでこの書き方でうまくいかないのか??」
くらいの状態までは自力でこぎ着けて,疑問点を明確に訊いた方が良いように思いますが…


とりあえず 

・before()で文字列の辞書順の比較のようなことを行いたいのであれば
 意図したとおりに働かないものと思います.
 Cでは char[]文字列を単純に < とか == とかで比較できないので.

・struct Date_Entryとかを見る限りだと,
 他の回答者様が示した図によるデータ構造(私も図示された構造に見合う形でコードを示したのですが)
 とは異なるデータ構造 でやろうとしているように見えるが,意図的にそういう方向でいくことにしたのでしょうか?

・116行目の ifの分岐後の処理内容(118行と122行)が全く一緒の処理なのも謎です.

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#59

投稿記事 by non » 6年前

学籍番号は文字列なのでstrcmpを使います。beforeはいらないと前もいいました。
non

non
記事: 1097
登録日時: 8年前

Re: 複数の構造体について

#60

投稿記事 by non » 6年前

54行のwhileあたりも、サンプルと違う。
non

閉鎖

“C言語何でも質問掲示板” へ戻る