掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28244

トーナメント戦の順位
投稿者---くるる(2006/09/22 23:41:44)


トーナメント戦の結果を入力し
勝ち点を計算して降順に並べ替え表示するプログラムなのですが。

配列を使えば簡単に行えるともうのですが
無理やり構造体を使って実現したいと思い
思いついたままに書いてみました。

(入力データ)
4
Japan 2 0 1
America 2 1 0
France 1 0 2
Italy 3 0 0

(出力結果)
Italy 9
America 7
Japan 6
France 3

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

int main(){
    
    typedef struct TEAM{
                    char         team[80];
                    int          t_total;
                    struct TEAM  *next_p;
            }TEAM_DATA,*TEAM_P;
            
    TEAM_P t_p,w_p,s_p,e_p;
    char   name[80];
    int    team_su=0,t_count=1,win=0,lose=0,drow=0;
    
    
    t_p=(TEAM_P)malloc(sizeof(TEAM_DATA));
    w_p=t_p;
    printf("\nチーム数を入力してください:");
    scanf("%d",&team_su);
    
    while(1){
        if(team_su<=0){
            return;
        }
        
      →if(t_count==1)printf("\nチームデータを入力してください(終了は^Z)\n");
        scanf("%s %d %d %d",name,&win,&lose,&drow);
        if(name == EOF || (name == EOF && t_count != team_su)){
            break;
        }
        strcpy(w_p->team,name);
        w_p->t_total=win*3+drow;
        w_p->next_p= (TEAM_P)malloc(sizeof(TEAM_DATA));
        w_p=w_p->next_p;
        t_count++;
        
    }
    
    for(w_p = t_p;w_p != NULL;w_p = w_p->next_p){
        for(s_p = w_p->next_p;s_p != NULL;s_p = s_p->next_p){
            if(w_p->t_total < s_p->t_total){
                e_p=w_p->next_p;
                w_p->next_p=s_p->next_p;
                s_p->next_p=e_p;
                e_p=w_p;
                w_p=s_p;
                s_p=e_p;
            }
        }
    }
    
    for(w_p=t_p;w_p!=NULL;w_p=w_p->next_p)
        printf("%s %2d",w_p->team,w_p->t_total);
    
    while(t_p != NULL){
        w_p=t_p->next_p;
        free(t_p);
        t_p=w_p;
    }
        
    return;
    
}


コンパイルすると、以下の警告が出ます。
→をつけた部分です。

警告 W8069 No.2.c 30: 移植性のないポインタ変換(関数 main )
警告 W8069 No.2.c 30: 移植性のないポインタ変換(関数 main )

解決方法が良く分からず投稿させていただきました
軽くログを漁ってみたんですが、いまいちどうすればいいのか分かりません。
助言、お願いします。

また、ここはこうしたほうがいいというのも
できればお願いします。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:トーナメント戦の順位 28245 くるる 2006/09/22 23:44:22
<子記事> Re:トーナメント戦の順位 28247 通りすがり 2006/09/23 01:04:35
<子記事> Re:トーナメント戦の順位 28248 nano 2006/09/23 01:08:07


No.28245

Re:トーナメント戦の順位
投稿者---くるる(2006/09/22 23:44:22)


      →if(t_count==1)printf("\nチームデータを入力してください(終了は^Z)\n");
        scanf("%s %d %d %d",name,&win,&lose,&drow);
        if(name == EOF || (name == EOF && t_count != team_su)){
            break;
        }


       if(t_count==1)printf("\nチームデータを入力してください(終了は^Z)\n");
        scanf("%s %d %d %d",name,&win,&lose,&drow);
      →if(name == EOF || (name == EOF && t_count != team_su)){
            break;
        }



訂正です。



この投稿にコメントする

削除パスワード

No.28246

Re:トーナメント戦の順位
投稿者---επιστημη(2006/09/23 00:32:14)


name はchar*, EOFは(通常)int。なので比較できません。
name == EOF てのはなにを判断したいのでしょうか?



この投稿にコメントする

削除パスワード

No.28247

Re:トーナメント戦の順位
投稿者---通りすがり(2006/09/23 01:04:35)


細かいことですが、明らかにトーナメント戦ではなく総当たりを想定していると思うんですがどうでしょう?


この投稿にコメントする

削除パスワード

No.28248

Re:トーナメント戦の順位
投稿者---nano(2006/09/23 01:08:07)


>トーナメント戦の結果を入力し

確かに、トーナメント戦ではなくてリーグ戦ですよね…。
こんな感じではどうでしょう。
後から並べ替えるのでなく、リスト構造に追加する時点で
降順にしてしまいます。

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

typedef struct TEAM {
    char team[80];
    int t_total;
    struct TEAM *next_p;
} TEAM_DATA, *TEAM_P;

TEAM_P new_item(void);
TEAM_P add_item(TEAM_P t, char *name, int total);
void list_item(TEAM_P t);
void free_item(TEAM_P t);

int main(void)
{
    TEAM_P start;
    char name[80];
    int team_su, t_count, win, lose, draw, total;
    
    printf("チーム数を入力してください:");
    scanf("%d", &team_su);
    if (team_su <= 0)
        exit(1);
    
    start = new_item();
    printf("\nチームデータを入力してください\n");
    for (t_count = 0; t_count != team_su; t_count++) {
        scanf("%s %d %d %d", name, &win, &lose, &draw);
        total = win * 3 + draw;
        start = add_item(start, name, total);
    }
    putchar('\n');
    list_item(start);
    free_item(start);
    return 0;
}

TEAM_P new_item(void)
{
    TEAM_P p;
    
    p = (TEAM_P) malloc(sizeof(TEAM_DATA));
    if (p == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }
    p->next_p = NULL;
    return p;
}

TEAM_P add_item(TEAM_P t, char *name, int total)
{
    TEAM_P t0 = t, p;
    
    p = (TEAM_P) malloc(sizeof(TEAM_DATA));
    if (p == NULL) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }
    
    strcpy(p->team, name);
    p->t_total = total;
    for(; t->next_p; t = t->next_p)
        if (t->next_p->t_total <= total)
            break;
    p->next_p = t->next_p;
    t->next_p = p;
    return t0;
}

void list_item(TEAM_P t)
{
    for (t = t->next_p; t; t = t->next_p)
        printf("%s %d\n", t->team, t->t_total);
}

void free_item(TEAM_P t)
{
    TEAM_P t0;
    
    for (; t; t = t0) {
        t0 = t->next_p;
        free(t);
    }
}




この投稿にコメントする

削除パスワード

No.28249

Re:トーナメント戦の順位
投稿者---くるる(2006/09/23 02:45:00)


>name はchar*, EOFは(通常)int。なので比較できません。
>name == EOF てのはなにを判断したいのでしょうか?
なるほど・・・そうなんですか・・・。
^ZがEOFの意なのかと思っていました・・・・。勉強になります。



>確かに、トーナメント戦ではなくてリーグ戦ですよね…。
すみません、これは素で間違えました・・・・。



>こんな感じではどうでしょう。
>後から並べ替えるのでなく、リスト構造に追加する時点で
>降順にしてしまいます。

なるほど。
入力し終わってから並べ替えるよりも
効率が良く且分かりやすいですね。
とても、参考になります。ありがとうございます!



もっと勉強して
効率のよいプログラムが組めるようになりたいです。
みなさん、ありがとうございます!!


この投稿にコメントする

削除パスワード

No.28250

Re:トーナメント戦の順位
投稿者---くるる(2006/09/23 02:49:52)


>TEAM_P new_item(void);
>TEAM_P add_item(TEAM_P t, char *name, int total);

プロトタイプ宣言の部分なんですが
構造体に対するポインタを引数として渡す場合
この宣言の方法しかいけないということですか?




この投稿にコメントする

削除パスワード

No.28254

Re:トーナメント戦の順位
投稿者---nano(2006/09/23 08:03:26)


>構造体に対するポインタを引数として渡す場合
>この宣言の方法しかいけないということですか?

私は、その方法しか知らないです。


この投稿にコメントする

削除パスワード

No.28253

Re:トーナメント戦の順位
投稿者---nano(2006/09/23 08:02:25)


>^ZがEOFの意なのかと思っていました・・・・。

それは正しいのですが、char *型と比較しているのが
正しくない、ということでありましょう。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧