構造体と関数

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

構造体と関数

#1

投稿記事 by りんご » 14年前

学校の課題がわからず投稿しました。課題は
3つのテキストファイルから情報を読み取り全情報の表示を行う機能と時刻と表示数(1~10)を入力し,その時刻よりも後で最も早い回を早い順に表示数分だけ表示する機能を実装したプログラムを作成するといったもので、表示は行えるのですがどのようにして3つのファイルのデータをソートして表示すればいいのかわかりません.

コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
typedef struct TM {
    int s_h;
    int s_m;
    int e_h;
    int e_m;
}TM;
 
typedef struct SN {
    char title[50];
    int theater;
    struct TM table[8];
}SN;
 
typedef struct SHW {
    char title[50];
    int theater;
    int s_hour;
    int s_min;
    int e_hour;
    int e_min;
}SHW;
 
 
int i,cnt2;
 
void print_screen (SN *screening);
void read_screen (char filename[], SN *screening);
void select_show (SN *screening, int hour, int min, SHW *showing);
void print_show (SHW *showing);
 
int main(void){                                         
    int x,ch,rt,num;
    int an=1;
    int cnt=1;
    int hour,min;
    char name[30]="s01.txt";
    SN screen[3];
    SHW show[20];
 
    
    
    for(rt=0;rt<3;rt++){
        for(x=0;x<8;x++){
            screen[rt].table[x].s_h=99;
            screen[rt].table[x].s_m=99;
            screen[rt].table[x].e_h=99;
            screen[rt].table[x].e_m=99;
        }
    }
 
    for(rt=0;rt<20;rt++){
            show[rt].s_hour=99;
            show[rt].s_min=99;
            show[rt].e_hour=99;
            show[rt].e_min=99;
        }
 
    for(rt=0;rt<3;rt++){    
    read_screen(name,&screen[rt]);
 
    if(rt==0)
        strcpy(name,"s02.txt");
    if(rt==1)
        strcpy(name,"s03.txt");
    }
    
    printf("機能を選択してください.(p:表示,s:検索)\n");
    
    while(an != 0){
        ch=getchar();
        if(ch!='p' && ch!='s'){
            printf("pかsを入力してください\n");
        }else{
            an=0;
        }
    }
 
    switch(ch){
        case 'p':
            printf("上映スケジュールを表示します。\n");
            for(rt=0;rt<3;rt++){
            print_screen(&screen[rt]);
            }
        break;
        case 's':
            while(cnt != 0){
                printf("時刻を(hh:mm)の形式で入力してください\n");
                scanf("%d:%d",&hour,&min);
                if( hour>24 || hour<0 ){
                    cnt=1;
                    printf("入力値が不正です\n");
                }
                else if( min>60 || min<0 ){
                    cnt=1;
                    printf("入力値が不正です\n");
                }
                else{
                    cnt=0;
                }
            }
            while(cnt!=1){
                printf("表示数を入力してください(1-10).\n");
                scanf("%d",&num);
                if(num<1||num>10){
                    printf("入力値が不正です\n");
                    cnt=0;
                }
                else{
                    cnt=1;
                }
                break;
            }
 
            
            select_show(screen,hour,min,show);
            
            
            rt=0;
            while(show[rt].e_hour!=99){
            print_show (&show[rt]);
            rt++;
            }
            break;
        default:
            break;
    }
 
 
    return 0;
}
 
void print_screen (SN *screening)
{
    int t=0;
 
    printf("「%s」 シアター%d\n",screening->title,screening->theater);
    while(screening->table[t].s_h!=99){
    printf("%d:%02d > %d:%02d\n",screening->table[t].s_h
            ,screening->table[t].s_m,screening->table[t].e_h
            ,screening->table[t].e_m);
    t++;
    }
 
}
 
void read_screen (char filename[], SN *screening)
{
    FILE *fp;
    int cnt=0;
    char tn[50],ss[256];
    
    if((fp=fopen(filename,"r"))==NULL){
        printf("ファイルが開けません\n");
        exit(1);
    }
        fscanf(fp,"%s",tn);
    strcpy(screening->title,tn);
 
    i=0;
    while(fgets(ss,256,fp)!=NULL){
    
        fscanf(fp,"%d,%2d:%d,%d:%2d",&screening->theater,&screening->table[i].s_h
            ,&screening->table[i].s_m,&screening->table[i].e_h
            ,&screening->table[i].e_m);
        i++;
    }
     
 
 
    fclose(fp);
 
}
 
 
void select_show (SN *screening, int hour, int min, SHW *showing){  
 
    int t,cnt,gt=0;
    cnt=0;
    
	while(gt!=3){
		for(t=0;t<8;t++)
		{
			if(cnt==0&&screening->table[t].s_h==99){
				printf("入場可能な上映回が存在しません.\n");
				break;
			}
			else if(screening->table[t].s_h==hour){
				if(screening->table[t].s_m > min){
					strcpy(showing->title,screening->title);
					showing->theater = screening->theater;
					showing->s_hour = screening->table[t].s_h;
					showing->s_min  = screening->table[t].s_m;
					showing->e_hour = screening->table[t].e_h;
					showing->e_min  = screening->table[t].e_m;
					showing++;
					cnt++;
				}
			}
			else if(screening->table[t].s_h > hour){
				strcpy(showing->title,screening->title);
				showing->theater = screening->theater;
				showing->s_hour = screening->table[t].s_h;
				showing->s_min  = screening->table[t].s_m;
				showing->e_hour = screening->table[t].e_h;
				showing->e_min  = screening->table[t].e_m;
				showing++;
				cnt++;
			}
		}
		gt++;
		screening++;
	}
 
 
}
 
void print_show (SHW *showing){
    
    printf("%2d:%02d > %2d:%02d 「%s」 シアター%d\n",showing->s_hour,showing->s_min,
                    showing->e_hour,showing->e_min,showing->title,showing->theater);
    
}
コードは上記に示したもので表示は行えます。また構造体の要素は変更しない方向でお願いします。
解説よろしくお願いします。
添付ファイル
zyouei.zip
テキストファイルです
(497 バイト) ダウンロード数: 122 回
最後に編集したユーザー りんご on 2011年10月22日(土) 21:03 [ 編集 2 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体と関数

#2

投稿記事 by softya(ソフト屋) » 14年前

このコードはコンパイルが通りません。
動くものを貼っていただけますか?

>コードは上記に示したもので表示は行えます。また構造体の要素は変更しない方向でお願いします。
とあるので、コピペして頂くだけだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

Re: 構造体と関数

#3

投稿記事 by naohiro19 » 14年前

Visual Studio および gccでコンパイルが通りません。

コード:

test.cpp
test.cpp(42) : error C2065: 'SHOW' : 定義されていない識別子です。
test.cpp(42) : error C2146: 構文エラー : ';' が、識別子 'show' の前に必要です。
test.cpp(42) : error C2065: 'show' : 定義されていない識別子です。
test.cpp(48) : error C2039: 's_hour' : 'TM' のメンバーではありません。
        test.cpp(5) : 'TM' の宣言を確認してください。
test.cpp(49) : error C2039: 's_min' : 'TM' のメンバーではありません。
        test.cpp(5) : 'TM' の宣言を確認してください。
test.cpp(50) : error C2039: 'e_hour' : 'TM' のメンバーではありません。
        test.cpp(5) : 'TM' の宣言を確認してください。
test.cpp(51) : error C2039: 'e_min' : 'TM' のメンバーではありません。
        test.cpp(5) : 'TM' の宣言を確認してください。
test.cpp(56) : error C2065: 'show' : 定義されていない識別子です。
test.cpp(56) : error C2228: '.s_hour' の左側はクラス、構造体、共用体でなければなりません
test.cpp(57) : error C2065: 'show' : 定義されていない識別子です。
test.cpp(57) : error C2228: '.s_min' の左側はクラス、構造体、共用体でなければなりません
test.cpp(58) : error C2065: 'show' : 定義されていない識別子です。
test.cpp(58) : error C2228: '.e_hour' の左側はクラス、構造体、共用体でなければなりません
test.cpp(59) : error C2065: 'show' : 定義されていない識別子です。
test.cpp(59) : error C2228: '.e_min' の左側はクラス、構造体、共用体でなければなりません
test.cpp(119) : error C2065: 'show' : 定義されていない識別子です。
test.cpp(123) : error C2065: 'show' : 定義されていない識別子です。
test.cpp(123) : error C2228: '.e_hour' の左側はクラス、構造体、共用体でなければなりません
test.cpp(123) : fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。

りんご
記事: 6
登録日時: 14年前

Re: 構造体と関数

#4

投稿記事 by りんご » 14年前

大変すいません。投稿したコードを修正したものに変更しました。
改めてよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体と関数

#5

投稿記事 by softya(ソフト屋) » 14年前

問題点を2つ見つけました。
まず、これを直してみてください。

コード:

			for(rt=0;rt<3;rt++){
				select_show(&screen[rt],hour,min,show);

			}
select_showが呼ばれる度に毎回show配列の先頭から値が書き込まれてしまいます。
select_show側でshow配列に値が代入されていたら次の要素にスキップすると良いと思います。

コード:

			while(show[rt].e_hour==99){
				print_show (&show[rt]);
				rt++;
			}
show[rt].e_hour==99は条件が逆だろうと思います。

それとselect_showで

コード:

printf("入場可能な上映回が存在しません.\n");
が必ず表示されるので条件を工夫されたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

りんご
記事: 6
登録日時: 14年前

Re: 構造体と関数

#6

投稿記事 by りんご » 14年前

返信ありがとうございます。書き直してみました。
とりあえずソートするため、入力された時刻以降の上映回すべてを配列showに格納したいのですが、
1つめのファイルの情報は入っているようなのですが2つ目以降がエラーがでてうまくいきません。
確認お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体と関数

#7

投稿記事 by softya(ソフト屋) » 14年前

更新が分かりづらいので、毎回ソースコードを新たに貼ってもらったほうが良いかと思います。

>select_showが呼ばれる度に毎回show配列の先頭から値が書き込まれてしまいます。
>select_show側でshow配列に値が代入されていたら次の要素にスキップすると良いと思います。

ここの部分が変わっていない気がするのですが(前のソースコードが残っていないので確認できません)、この問題点の内容で分からないことがあったら聞いてください。

それとインデントが適当なのでソースコードが読みづらいため綺麗に整えてもらえますか。
整えた参考。 VC++の編集→詳細→選択範囲のフォーマットを使用。

コード:

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

typedef struct TM {
	int s_h;
	int s_m;
	int e_h;
	int e_m;
}TM;

typedef struct SN {
	char title[50];
	int theater;
	struct TM table[8];
}SN;

typedef struct SHW {
	char title[50];
	int theater;
	int s_hour;
	int s_min;
	int e_hour;
	int e_min;
}SHW;


int i,cnt2;

void print_screen (SN *screening);
void read_screen (char filename[], SN *screening);
void select_show (SN *screening, int hour, int min, SHW *showing);
void print_show (SHW *showing);

int main(void){                                         
	int x,ch,rt,num;
	int an=1;
	int cnt=1;
	int hour,min;
	char name[30]="s01.txt";
	SN screen[3];
	SHW show[20];



	for(rt=0;rt<3;rt++){
		for(x=0;x<8;x++){
			screen[rt].table[x].s_h=99;
			screen[rt].table[x].s_m=99;
			screen[rt].table[x].e_h=99;
			screen[rt].table[x].e_m=99;
		}
	}

	for(rt=0;rt<20;rt++){
		show[rt].s_hour=99;
		show[rt].s_min=99;
		show[rt].e_hour=99;
		show[rt].e_min=99;
	}

	for(rt=0;rt<3;rt++){    
		read_screen(name,&screen[rt]);

		if(rt==0)
			strcpy(name,"s02.txt");
		if(rt==1)
			strcpy(name,"s03.txt");
	}

	printf("機能を選択してください.(p:表示,s:検索)\n");

	while(an != 0){
		ch=getchar();
		if(ch!='p' && ch!='s'){
			printf("pかsを入力してください\n");
		}else{
			an=0;
		}
	}

	switch(ch){
		case 'p':
			printf("上映スケジュールを表示します。\n");
			for(rt=0;rt<3;rt++){
				print_screen(&screen[rt]);
			}
			break;
		case 's':
			while(cnt != 0){
				printf("時刻を(hh:mm)の形式で入力してください\n");
				scanf("%d:%d",&hour,&min);
				if( hour>24 || hour<0 ){
					cnt=1;
					printf("入力値が不正です\n");
				}
				else if( min>60 || min<0 ){
					cnt=1;
					printf("入力値が不正です\n");
				}
				else{
					cnt=0;
				}
			}
			while(cnt!=1){
				printf("表示数を入力してください(1-10).\n");
				scanf("%d",&num);
				if(num<1||num>10){
					printf("入力値が不正です\n");
					cnt=0;
				}
				else{
					cnt=1;
				}
				break;
			}


			select_show(screen,hour,min,show);


			rt=0;
			while(show[rt].e_hour!=99){
				print_show (&show[rt]);
				rt++;
			}
			break;
		default:
			break;
	}


	return 0;
}

void print_screen (SN *screening)
{
	int t=0;

	printf("「%s」 シアター%d\n",screening->title,screening->theater);
	while(screening->table[t].s_h!=99){
		printf("%d:%02d > %d:%02d\n",screening->table[t].s_h
			,screening->table[t].s_m,screening->table[t].e_h
			,screening->table[t].e_m);
		t++;
	}

}

void read_screen (char filename[], SN *screening)
{
	FILE *fp;
	int cnt=0;
	char tn[50],ss[256];

	if((fp=fopen(filename,"r"))==NULL){
		printf("ファイルが開けません\n");
		exit(1);
	}
	fscanf(fp,"%s",tn);
	strcpy(screening->title,tn);

	i=0;
	while(fgets(ss,256,fp)!=NULL){

		fscanf(fp,"%d,%2d:%d,%d:%2d",&screening->theater,&screening->table[i].s_h
			,&screening->table[i].s_m,&screening->table[i].e_h
			,&screening->table[i].e_m);
		i++;
	}



	fclose(fp);

}


void select_show (SN *screening, int hour, int min, SHW *showing){  

	int t,cnt,gt=0;
	cnt=0;

	while(gt!=3){
		for(t=0;t<8;t++)
		{
			if(cnt==0&&screening->table[t].s_h==99){
				printf("入場可能な上映回が存在しません.\n");
				break;
			}
			else if(screening->table[t].s_h==hour){
				if(screening->table[t].s_m > min){
					strcpy(showing->title,screening->title);
					showing->theater = screening->theater;
					showing->s_hour = screening->table[t].s_h;
					showing->s_min  = screening->table[t].s_m;
					showing->e_hour = screening->table[t].e_h;
					showing->e_min  = screening->table[t].e_m;
					showing++;
					cnt++;
				}
			}
			else if(screening->table[t].s_h > hour){
				strcpy(showing->title,screening->title);
				showing->theater = screening->theater;
				showing->s_hour = screening->table[t].s_h;
				showing->s_min  = screening->table[t].s_m;
				showing->e_hour = screening->table[t].e_h;
				showing->e_min  = screening->table[t].e_m;
				showing++;
				cnt++;
			}
		}
		gt++;
		screening++;
	}


}

void print_show (SHW *showing){

	printf("%2d:%02d > %2d:%02d 「%s」 シアター%d\n",showing->s_hour,showing->s_min,
		showing->e_hour,showing->e_min,showing->title,showing->theater);

}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 15年前

Re: 構造体と関数

#8

投稿記事 by box » 14年前

りんご さんが書きました: 2つ目以降がエラーがでてうまくいきません。
エラーメッセージを貼ってください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

りんご
記事: 6
登録日時: 14年前

Re: 構造体と関数

#9

投稿記事 by りんご » 14年前

すいません。ソースコードとインデントの件了解しました。
次の要素にスキップするというのはshowの次の要素ということでしょうか?
とりあえず1つめのテキストの内容はshowに入っているようなのですがそれ以降が
よくわかりません。とりあえずshowに与えられた時間以降の上映回を格納して
それからソートをする関数を作成しそれを与えられた数だけ表示しよう考えているのですが。

また、エラーですがたとえば時間を10:23と入力するとdebug error
stack around the variable 'screen' was corruptedと表示されます。

そして、課題で与えられた実行結果の例を載せておきます。
機能を選択してください.(p:表示,s:検索) s
時刻を(hh:mm)の形式で入力してください.13:00
表示数を入力してください(1-10).3
1) 13:10 > 15:05「ナイト&デイ」シアター10
2) 14:50 > 16:40「エクスペンダブルズ」シアター6
3) 15:35 > 17:30「ナイト&デイ」シアター10

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体と関数

#10

投稿記事 by softya(ソフト屋) » 14年前

>select_showが呼ばれる度に毎回show配列の先頭から値が書き込まれてしまいます。
>select_show側でshow配列に値が代入されていたら次の要素にスキップすると良いと思います。

この件は

コード:

		gt++;
		screening++;
で対応してたんですね。

ただ、

コード:

			if(cnt==0&&screening->table[t].s_h==99){
				printf("入場可能な上映回が存在しません.\n");
				break;
			}
がアダになったようです。
デバッガで見ると分かるんですが、table[t].s_h==99のデータがshowに書きこまれています。
if(screening->table[t].s_h==99){
に戻しましょう。
printf("入場可能な上映回が存在しません.\n");
の位置や条件を変えることを考えてみてください。
ただし、元の動作に悪影響を与えてはいけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

りんご
記事: 6
登録日時: 14年前

Re: 構造体と関数

#11

投稿記事 by りんご » 14年前

show配列に入力時間以降の上映回が格納されているようなので
上映回がない場合の表示を後にして、先にソートと表示を考えてみました。
しかし、ソートがうまくできずそのまま表示されているようです。
確認お願いします。

コード:

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

typedef struct TM {
	int s_h;
	int s_m;
	int e_h;
	int e_m;
}TM;

typedef struct SN {
	char title[50];
	int theater;
	struct TM table[8];
}SN;

typedef struct SHW {
	char title[50];
	int theater;
	int s_hour;
	int s_min;
	int e_hour;
	int e_min;
}SHW;


int i,cnt2,flag;

void print_screen (SN *screening);
void read_screen (char filename[], SN *screening);
void select_show (SN *screening, int hour, int min, SHW *showing);
void print_show (SHW *showing,int number);
void sort(SHW *showing,int number);
void swap(SHW *x,SHW *y);

int main(void){                                         
	int x,ch,rt,num;
	int an=1;
	int cnt=1;
	int hour,min;
	char name[30]="s01.txt";
	SN screen[3];
	SHW show[20];



	for(rt=0;rt<3;rt++){
		for(x=0;x<8;x++){
			screen[rt].table[x].s_h=99;
			screen[rt].table[x].s_m=99;
			screen[rt].table[x].e_h=99;
			screen[rt].table[x].e_m=99;
		}
	}

	for(rt=0;rt<20;rt++){
		show[rt].s_hour=99;
		show[rt].s_min=99;
		show[rt].e_hour=99;
		show[rt].e_min=99;
	}

	for(rt=0;rt<3;rt++){    
		read_screen(name,&screen[rt]);

		if(rt==0)
			strcpy(name,"s02.txt");
		if(rt==1)
			strcpy(name,"s03.txt");
	}

	printf("機能を選択してください.(p:表示,s:検索)\n");

	while(an != 0){
		ch=getchar();
		if(ch!='p' && ch!='s'){
			printf("pかsを入力してください\n");
		}else{
			an=0;
		}
	}

	switch(ch){
	case 'p':
		printf("上映スケジュールを表示します。\n");
		for(rt=0;rt<3;rt++){
			print_screen(&screen[rt]);
		}
		break;
	case 's':
		while(cnt != 0){
			printf("時刻を(hh:mm)の形式で入力してください\n");
			scanf("%d:%d",&hour,&min);
			if( hour>24 || hour<0 ){
				cnt=1;
				printf("入力値が不正です\n");
			}
			else if( min>60 || min<0 ){
				cnt=1;
				printf("入力値が不正です\n");
			}
			else{
				cnt=0;
			}
		}
		while(cnt!=1){
			printf("表示数を入力してください(1-10).\n");
			scanf("%d",&num);
			if(num<1||num>10){
				printf("入力値が不正です\n");
				cnt=0;
			}
			else{
				cnt=1;
			}
			break;
		}


		select_show(screen,hour,min,show);
		printf("%d\n",flag);

		rt=0;

		sort(show,flag);

		while(show[rt].e_hour!=99){
			print_show (&show[rt],rt+1);
			rt++;
			if(rt==num)
				break;
		}
		break;
	default:
		break;
	}


	return 0;
}

void print_screen (SN *screening)
{
	int t=0;

	printf("「%s」 シアター%d\n",screening->title,screening->theater);
	while(screening->table[t].s_h!=99){
		printf("%d:%02d > %d:%02d\n",screening->table[t].s_h
			,screening->table[t].s_m,screening->table[t].e_h
			,screening->table[t].e_m);
		t++;
	}

}

void read_screen (char filename[], SN *screening)
{
	FILE *fp;
	int cnt=0;
	char tn[50],ss[256];

	if((fp=fopen(filename,"r"))==NULL){
		printf("ファイルが開けません\n");
		exit(1);
	}
	fscanf(fp,"%s",tn);
	strcpy(screening->title,tn);

	i=0;
	while(fgets(ss,256,fp)!=NULL){

		fscanf(fp,"%d,%2d:%d,%d:%2d",&screening->theater,&screening->table[i].s_h
			,&screening->table[i].s_m,&screening->table[i].e_h
			,&screening->table[i].e_m);
		i++;
	}



	fclose(fp);

}


void select_show (SN *screening, int hour, int min, SHW *showing){  

	int t,cnt,gt=0;
	flag=0;

	while(gt!=3){
		for(t=0;t<8;t++)
		{
			if(screening->table[t].s_h==99){

				break;
			}
			else if(screening->table[t].s_h==hour){
				if(screening->table[t].s_m > min){
					strcpy(showing->title,screening->title);
					showing->theater = screening->theater;
					showing->s_hour = screening->table[t].s_h;
					showing->s_min  = screening->table[t].s_m;
					showing->e_hour = screening->table[t].e_h;
					showing->e_min  = screening->table[t].e_m;
					showing++;
					flag++;
				}
			}
			else if(screening->table[t].s_h > hour){
				strcpy(showing->title,screening->title);
				showing->theater = screening->theater;
				showing->s_hour = screening->table[t].s_h;
				showing->s_min  = screening->table[t].s_m;
				showing->e_hour = screening->table[t].e_h;
				showing->e_min  = screening->table[t].e_m;
				showing++;
				flag++;
			}
		}
		gt++;
		screening++;
	}


}

void print_show (SHW *showing,int number){

	printf("%d)%2d:%02d > %2d:%02d 「%s」 シアター%d\n",number,showing->s_hour,showing->s_min,
		showing->e_hour,showing->e_min,showing->title,showing->theater);

}




void sort(SHW *showing,int number){
	int cnt=number-1,i,j;

	while(cnt>=0)
	{
		for(i=1,j=-1;i<=cnt;i++){
			if(showing[i-1].s_hour==showing[i].s_hour){
				if(showing[i-1].s_min>showing[i].s_min)
				{
					j=i-1;
					swap(&showing[i],&showing[j]);
				}
			}

			else if(showing[i-1].s_hour>showing[i].s_hour)
			{
				j=i-1;
				swap(&showing[i],&showing[j]);
			}
			cnt=j;
		}
	}
}

void swap(SHW *x,SHW *y){

	SHW temp=*x;
	*x=*y;
	*y=temp;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体と関数

#12

投稿記事 by softya(ソフト屋) » 14年前

分りやすいようにprintfを埋め込んで見ました。
そもそもソート手法のどれを使うつもりだったのでしょうか?

コード:

void sort(SHW *showing,int number){
    int cnt=number-1,i,j;
 
    while(cnt>=0)
    {
		printf( "cnt=%d\n", cnt );
        for(i=1,j=-1;i<=cnt;i++){
			printf( "i , j = %d,%d\n", i, j );
            if(showing[i-1].s_hour==showing[i].s_hour){
                if(showing[i-1].s_min>showing[i].s_min)
                {
                    j=i-1;
					printf( "showing[%d] ⇔ showing[%d]\n", i, j );
                    swap(&showing[i],&showing[j]);
                }
            }
 
            else if(showing[i-1].s_hour>showing[i].s_hour)
            {
                j=i-1;
				printf( "showing[%d] ⇔ showing[%d]\n", i, j );
                swap(&showing[i],&showing[j]);
            }
            cnt=j;
        }
    }
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

りんご
記事: 6
登録日時: 14年前

Re: 構造体と関数

#13

投稿記事 by りんご » 14年前

さきほど、プログラムが完成しました。
ご指導ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体と関数

#14

投稿記事 by softya(ソフト屋) » 14年前

フォーラムルールにあるのですが、同様な質問のために解決したコードを書きこんでいただけると助かります。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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