構造体にエクセルのデータを代入

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

構造体にエクセルのデータを代入

#1

投稿記事 by まださまし » 10年前

現在、生徒という構造体の中に成績を入れてそのデータをソートしたりするプログラムを作成しています。
生徒のデータは 名前 数学の点数 英語の点数という順番でエクセルの中に入っています。そこで構造体の中にエクセルのデータを読み込んでみたのですが構造体のことをよく知らないせいか、1つ目の要素が思ったように表示されず困っています。
stu[1].namae, stu[1].mten, stu[1].etenこの状態で中身を見てみるとカタカナのㇾが無数にある状態とmtenとetenには-の巨大な数が入っていました。うまく1つ目の要素を表示できるようにどなたか解決策をお願いします。


コード:

//警告が出ないようにする
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//生徒の構造体
typedef struct{
	char namae[100];//名前
	int mten;//数学の点数
	int eten;//英語の点数
}student;

int main(void)
{
	int na;
	FILE *fp;
	int i = 0;
	int j = 0;
	char name[100];
	int Math, Eng;
	//student型を定義する
	student stu[100];



	if ((fp = fopen("seiseki.csv", "r")) == NULL){
		printf("\aファイルをオープンできません\n");
	}

	else{
		while (fscanf(fp, "%[^,],%d,%d", name, &Math, &Eng) == 3){
			//ここに問題があるのか
			student stu [] = { *name, Math, Eng };

			printf("%-10s %-10d %d", name, Math, Eng);


		}

		fclose(fp);
	}


	//1つ目の要素を表示してみる
	printf("%-10s %-10d %-10d", stu[1].namae, stu[1].mten, stu[1].eten);

	//読み込んだ値によって何をするか決めている。
	printf("実行するものを選んでください\n");
	printf("1.名前で入れ替え\n2.数学点数で入れ替え\n3.英語点数で並び替え\n4.名前で検索\n5.基本統計量\n6.終了");
	do{
		scanf_s("%d", &na);


	} while (na < 1 || na>6);

	if (na = 1)
	{
	}
	else if (na = 2)
	{
	}
	else if (na = 3)
	{
	}
	else if (na = 4)
	{
	}
	else if (na = 5)
	{
	}
	else if (na = 6)
	{
	}
	else






	getchar();
	getchar();
	return(0);
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 構造体にエクセルのデータを代入

#2

投稿記事 by みけCAT » 10年前

stu[1].namaeなどを表示しているスコープのstu[1]に適切な値を代入してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

まださまし
記事: 5
登録日時: 10年前

Re: 構造体にエクセルのデータを代入

#3

投稿記事 by まださまし » 10年前

student stu [] = { *name, Math, Eng };を student stu [1] = { *name, Math, Eng };にするということでしょうか?理解力がなくてすみません。
自分のプログラムのどこがまずいのかわかりません

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 構造体にエクセルのデータを代入

#4

投稿記事 by みけCAT » 10年前

違います。
無駄なバッファを使わずに、素直に直接読み込んではいけないのですか?
(インデント省略します。ごめんなさい。)

コード:

// else { の後から
int cnt=1;
while (cnt<100 && fscanf(fp, "%[^,],%d,%d", stu[cnt].namae, &stu[cnt].mten, &stu[cnt].eten) == 3){
//ここに問題があるのか

printf("%-10s %-10d %d", stu[cnt].namae, stu[cnt].mten, stu[cnt].eten);
cnt++;
// } fclose(fp); に繋がる
ところで、下の代入文が条件式として書かれているif文の列は何ですか?
飾りですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 構造体にエクセルのデータを代入

#5

投稿記事 by naohiro19 » 10年前

21行目のstudentと32行目でstudentはメモリアドレスが違うので32行目はスコープ内の宣言されたものなのです。

まださまし
記事: 5
登録日時: 10年前

Re: 構造体にエクセルのデータを代入

#6

投稿記事 by まださまし » 10年前

遅れてしまい申し訳ありません。無事構造体に入れることができました。
遠回りな方法で入れていたから何かミスがあったのかもしれません。下のほうのif文については、6つの動作を分岐させて実行させるためです。
完成途中で相談してしまい申し訳ありません。まだ分岐は1つしか完成しておらず1を押すと名前順で並び替えるという内容です。
また必ずこのプログラムでお世話になるのでよろしくお願いします。

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

typedef struct{
	char namae[100];
	int mten;
	int eten;
}student;

void swap(student *x, student *y)
{
	
	student temp = *x;
	*x = *y;
	*y = temp;
}


void irekae1(student stu[],int cnt)
{
	int a=0;
	int n;
	//for文でまわす
	
	

	int k=cnt-1;
	//数が大きいかどうかを判別をする
	while(k >= 0){
		int i=0,j=0;
	

		for(i=1,j=-1; i<=k; i++){
			if(strcmp(stu[i-1].namae , stu[i].namae)==1)
			{
				j=i-1;
				swap(&stu[i], &stu[j]);
				
			}
		}
		k=j;
	}


}






int main(void)
{
	int na;
	FILE *fp;
	int i=0;
	int j=0;
	char name[100];
	int p=0;

	student stu[100];
	int cnt=0;

	

	if((fp = fopen("seiseki.csv","r"))==NULL){
		printf("ファイルをオープンできません\n");
	}

	else{
		 while(cnt<100 &&fscanf(fp,"%[^,],%d,%d",stu[cnt].namae,&stu[cnt].mten,&stu[cnt].eten)==3){
		
			printf("%-10s %-10d %d",stu[cnt].namae ,stu[cnt].mten,stu[cnt].eten);
		 
			cnt++;
		 }
		}
	
	
	    fclose(fp);
		putchar('\n');

		
	

		


		printf("\n実行するものを選んでください\n");
		printf("1.名前で入れ替え\n2.数学点数で入れ替え\n3.英語点数で並び替え\n4.名前で検索\n5.基本統計量\n6.終了\n");
		
		scanf_s("%d",&na);
		

		

		if(na==1)
		{
			irekae1(stu,cnt);
			for(p=0;p<=cnt-1;p++){
			printf("%-10s %-10d %d",stu[p].namae ,stu[p].mten,stu[p].eten);
			}
		 
		}
		else if(na=2)
		{}
		else if(na=3)
		{}
		else if(na=4)
		{}
		else if(na=5)
		{}
		else if(na=6)
		{}
		else
		{}





	getchar();
	getchar();
	return(0);
}

閉鎖

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