並び替え
-
YuO
Re:並び替え
> まずある程度どういうプログラムにするか理解できていないとプログラムは組めません。
プログラムを作成する場合,プログラムは理解する物ではなく考える物です。
考え方なので,方法はいくつもあると思いますが。
> わからないのは分け方かな。値を保持し、比較しさらにソートする、これがわからないとおもいます。
> 比較はさすがにわかるので値の保持の仕方とソート方法です。
CSVのデータは,1行を構造体にでもマッピングしてしまえばよいと思います。
あとは,それを配列やCArrayやstd::vectorにして保持するだけです。
ソート方法は,好きな方法を使えばよいです。
クイックソートでもヒープソートでも挿入ソートでもバブルソートでも……。
大小関係でソートするこれらのソートであれば,比較関数が問題になるだけです。
ところで,入力がどうみてもCSV ("Comma" Separated Values) ではないのですが。
プログラムを作成する場合,プログラムは理解する物ではなく考える物です。
考え方なので,方法はいくつもあると思いますが。
> わからないのは分け方かな。値を保持し、比較しさらにソートする、これがわからないとおもいます。
> 比較はさすがにわかるので値の保持の仕方とソート方法です。
CSVのデータは,1行を構造体にでもマッピングしてしまえばよいと思います。
あとは,それを配列やCArrayやstd::vectorにして保持するだけです。
ソート方法は,好きな方法を使えばよいです。
クイックソートでもヒープソートでも挿入ソートでもバブルソートでも……。
大小関係でソートするこれらのソートであれば,比較関数が問題になるだけです。
ところで,入力がどうみてもCSV ("Comma" Separated Values) ではないのですが。
-
やそ
Re:並び替え
研修生さんの技術レベルはわかりませんが、
csvファイルの扱いって厳密に行おうとすると、
Cを触り始めたばかりの初心者には難しいかもしれません。
エラー処理までを考えると非常にめんどいです。
課題であれば、このcsvファイルの構造もしっかり明記されているか、データそのものがあるはずだと思います。
まずはそれをここに晒すことからはじめるべきかな。csvといいつつカンマが見えないし^^;
で、処理の流れは皆さんが挙げられたとおりソートを用いて組むことになります。
まあ、ソートはとりあえずバブルソートでいいんじゃないかな。
1、”クラス”でソートする。
2、”クラス”が同じもののなかで”教科”でソートする。
2番目のソートの実現に若干の工夫が必要です。
というか課題を出された側はそこをどう表現するかを見たいのかもしれません。
規約に則った上で、質問内容を具体的にし、自分はどこまで考えたかを晒せば有用な回答が得られるでしょう。
がんばれ~。
csvファイルの扱いって厳密に行おうとすると、
Cを触り始めたばかりの初心者には難しいかもしれません。
エラー処理までを考えると非常にめんどいです。
課題であれば、このcsvファイルの構造もしっかり明記されているか、データそのものがあるはずだと思います。
まずはそれをここに晒すことからはじめるべきかな。csvといいつつカンマが見えないし^^;
で、処理の流れは皆さんが挙げられたとおりソートを用いて組むことになります。
まあ、ソートはとりあえずバブルソートでいいんじゃないかな。
1、”クラス”でソートする。
2、”クラス”が同じもののなかで”教科”でソートする。
2番目のソートの実現に若干の工夫が必要です。
というか課題を出された側はそこをどう表現するかを見たいのかもしれません。
規約に則った上で、質問内容を具体的にし、自分はどこまで考えたかを晒せば有用な回答が得られるでしょう。
がんばれ~。
-
研修生
Re:並び替え
意見ありがとうございました。
カンマの方は思いつきの例で手打ちでしたのでみすってしまいました。
今考えてた方法が却下されて構造体でいつでもアクセスできるようにとかいわれ
構造体配列を使うことを考えました。
カンマの方は思いつきの例で手打ちでしたのでみすってしまいました。
今考えてた方法が却下されて構造体でいつでもアクセスできるようにとかいわれ
構造体配列を使うことを考えました。
struct test{
int student_number;
char classtype[5];
char name[20];
char subject[10];
};
struct test seito2[20] = {
{ 1,"A","山田I", "国語"},
{ 2,"B", "佐藤", "数学" },
{ 3,"B", "加藤", "数学" },
{ 4,"A","渡辺","国語"}
};
としておけばアクセスできそうですが・・
よく皆様が構造体といってる類の使い方ですが
こういうことでしょうか?少し今試せる環境にないので後日試してみます。-
研修生
Re:並び替え
自分で組まなければ勉強にならないと大見得きっといてあれですが・・
構造体の組み方についておしえてください。。
1,"A","山田","国語"
2,"B","佐藤","数学"
3,"B","加藤","数学"
4,"A","渡辺","国語"
・
・
・
・
というようなファイルの文字列を構造体に組み込めないんですが
どのようにすればいいでしょうか?
今やってるのは
でwhileから先がわからないのですがfgetsで一行ずつ代入しようとすると配列の配列にしなくてはいけないが
何行あるかはファイル次第なのでstruxt test T[1000]としようとしたが定数式ではないので無理でした。
そもそも変換が合わないのですがこのファイルから読み込んだ文字列を構造体に組み込むのはできるのでしょうか?
構造体の組み方についておしえてください。。
1,"A","山田","国語"
2,"B","佐藤","数学"
3,"B","加藤","数学"
4,"A","渡辺","国語"
・
・
・
・
というようなファイルの文字列を構造体に組み込めないんですが
どのようにすればいいでしょうか?
今やってるのは
struct test{
int student_number;
char classtype[5];
char name[20];
char subject[10];
};
int main()
{
FILE *fp;
char buf[1001];
if((fp = fopen("test.csv","r")) == NULL){
return;
}
while(fgets(buf,1000,fp) !=NULL){
//struct test T[1000] = bufでwhileから先がわからないのですがfgetsで一行ずつ代入しようとすると配列の配列にしなくてはいけないが
何行あるかはファイル次第なのでstruxt test T[1000]としようとしたが定数式ではないので無理でした。
そもそも変換が合わないのですがこのファイルから読み込んだ文字列を構造体に組み込むのはできるのでしょうか?
-
研修生
Re:並び替え
csvの定義にレコードは各行で区切られた各値のことと書いてるので1かな?
どこがおかしいのか教えて下さい。
type struct{
int number[20];
char class type[20];
char name[8];
char subject[20];
} my;
my data[100];
int main()
{
FILE *fp;
int line = 0;
char buf[1000];
if((fp = fopne("test.csv","r")) == NULL){
printf("ファイルopneerror");
}
while(fgets(buf,1000mfp) != NULL){
sscanf(buf,"%d%s%s%s",&data[line].number,data[line].class_type, data[line].name,data[line].subject);
line++;
}
fclose(fp);
return 0;
}
としてみましたが値がちゃんと入っていません。ファイルは1個上の例の内容をテキストファイルで開いたものです。どこがおかしいのか教えて下さい。
-
研修生
Re:並び替え
やっぱそうですか。ねこさんのいうようにファイルの区切りをカンマではなく半角スペースならいけました。
sscanfはカンマにはむいていないのかな。別の方法で模索してみます
こちらはsscanfを薦められる前に組んでいたプログラムですが
これだと最初の一行だけ値が入っています。
次の行からはstrncpyのところでちゃんとはいっていないようです。
bufGの値はちゃんとなっているのにコピーができていません。
どうしてでしょうか?
sscanfはカンマにはむいていないのかな。別の方法で模索してみます
type struct{
int number[20];
char class type[20];
char name[8];
char subject[20];
} my;
my data[100];
int main()
{
FILE *fp;
int line = 0;
int field = 0;
int i;
char buf[1000], *str;
char bufG[1000];
if((fp = fopne("test.csv","r")) == NULL){
printf("ファイルopenerror");
}
while(fgets(buf,1000,fp) != NULL){
str = buf;
while(*str != '\0'){
if(*str != ','){
for(i = 0; *str != ',' && *str != '\0'; i++){
bufG = *str;
str++;
}
bufG = '\0';
switch(field){
case 0:
strncpy(data[line].number, bufG , sizeof(data[line.number));
breakk;
case 1:
strncpy(data[line].class_type, bufG , sizeof(data[line.class_type));
breakk;
case 2:
strncpy(data[line].name, bufG , sizeof(data[line.name));
breakk;
case 3:
strncpy(data[line].subject, bufG , sizeof(data[line.subject));
breakk;
}
field++;
}
else{
str++;
}
}
line++;
}
fclose(fp);
return 0;
}こちらはsscanfを薦められる前に組んでいたプログラムですが
これだと最初の一行だけ値が入っています。
次の行からはstrncpyのところでちゃんとはいっていないようです。
bufGの値はちゃんとなっているのにコピーができていません。
どうしてでしょうか?
-
Mist
Re:並び替え
> あーすいません。そこはコピペったので本プログラムではちゃんとなってます
きちんとしたプログラムを提示しないでバグ教えては虫が良すぎるかと。
だいたい、「ちゃんと」とはどうなっているのですか?
int number;
こう定義しているなら
strncpy(data[line].number, bufG , sizeof(data[line.number));
ここはコンパイルエラーにしかならないですね。(元の定義でも変だけど)
括弧の過不足ぐらいなら何とかなりますけど、こちらは提示されたものの中からしか解析できません。
過去にも手打ちで間違いだらけのプログラムを提示する人がいましたが、問題の解決にずいぶん時間がかかっていました。
まず、打ち間違いのないプログラムを提示することが第一かと。
きちんとしたプログラムを提示しないでバグ教えては虫が良すぎるかと。
だいたい、「ちゃんと」とはどうなっているのですか?
int number;
こう定義しているなら
strncpy(data[line].number, bufG , sizeof(data[line.number));
ここはコンパイルエラーにしかならないですね。(元の定義でも変だけど)
括弧の過不足ぐらいなら何とかなりますけど、こちらは提示されたものの中からしか解析できません。
過去にも手打ちで間違いだらけのプログラムを提示する人がいましたが、問題の解決にずいぶん時間がかかっていました。
まず、打ち間違いのないプログラムを提示することが第一かと。
-
ねこ
Re:並び替え
一応突っ込んでおこう。
<strncpy(data[line].number, bufG , sizeof(data[line].number));
<こちらが正しいです。
<これだとコンパイルエラーにはなりません。
strncpyの第一引数にint型配列を渡す事はできません。
Mistさんがおっしゃられてるのは括弧のミスの話じゃなくてそういうことです。
<nonさんの意見で、自分で考えさせようという人が増え解答を書くのを抑える人が増えそうなのでいっただけですよ。
構造体について教えてくださいとはあるけど
「アイディアを下さい」って言ったのは研修生さんなんだから自分で言ってておかしくないですか?
「いや、自分は途中からこういうつもりで聞いてる」と思ってたとしても、
それを明示する文章はレスからは不十分かなと。
<調べもせずとありますがどれのこといってるのでしょうか?調べたとか調べてないとか本人にしかわからない気もするので指摘内容の意味がわかりません。
・strncpyの第一引数にintを渡す
・sscanfをカンマで取得する方法
・strncpyの第三引数が何故かsizeof
これらを見てる限り「十分に調べていない」というのは分かってしまいます。
簡単な質問でも答えてくれる人が居るってのは良い事ですよ。
他所なら「ググれ」「過去ログ読め」で終わる内容だって一杯あります。
今回のだって「C++ CSV 読み込み」これで検索するだけで全部分かります。
<strncpy(data[line].number, bufG , sizeof(data[line].number));
<こちらが正しいです。
<これだとコンパイルエラーにはなりません。
strncpyの第一引数にint型配列を渡す事はできません。
Mistさんがおっしゃられてるのは括弧のミスの話じゃなくてそういうことです。
<nonさんの意見で、自分で考えさせようという人が増え解答を書くのを抑える人が増えそうなのでいっただけですよ。
構造体について教えてくださいとはあるけど
「アイディアを下さい」って言ったのは研修生さんなんだから自分で言ってておかしくないですか?
「いや、自分は途中からこういうつもりで聞いてる」と思ってたとしても、
それを明示する文章はレスからは不十分かなと。
<調べもせずとありますがどれのこといってるのでしょうか?調べたとか調べてないとか本人にしかわからない気もするので指摘内容の意味がわかりません。
・strncpyの第一引数にintを渡す
・sscanfをカンマで取得する方法
・strncpyの第三引数が何故かsizeof
これらを見てる限り「十分に調べていない」というのは分かってしまいます。
簡単な質問でも答えてくれる人が居るってのは良い事ですよ。
他所なら「ググれ」「過去ログ読め」で終わる内容だって一杯あります。
今回のだって「C++ CSV 読み込み」これで検索するだけで全部分かります。
-
研修生
Re:並び替え
確かにアイデアをくださいといってバグさんからsscanfの助言をもらいました。誤解されているのは
sscanfをカンマで取得する方法ならとっくに調べています。sscanf カンマと検索すればずらりと出てきますしね。向いていないというのはsscanfはあくまで半角スペースで区別するもので別の方法をとらなくてはいけないという軽い言い回しで、無理だから調べず他の方法を探るといったわけでもありません。ただこれ以上は聞かなかったというだけのことです。
そこまでがアイデアについて質問した所の一区切りです。上記のはバグさんから助言をいただくまえに
私が自分でアイデアを出したもの(というか自分で組み立てていたプログラム)に対する質問で、こちらはアイデアをくださいとは関係でございません。まぁ一連の流れで察するのは不可能だと思いますがそういうことです。
変な質問転換になってるので本人以外にはわかりませんね。
strncpyの事に関しては無知もいい所でしたがこちらも私のみすでした
numberの定義は
int numberです。ちゃんと書き直さなかったのが良く無かったですね。まぁこれも間違ってるわけですが。
不毛な言い争いになるのでこの件に関しては他で聞くことにします。
板を汚してしまって申し訳ありませんでした。
sscanfをカンマで取得する方法ならとっくに調べています。sscanf カンマと検索すればずらりと出てきますしね。向いていないというのはsscanfはあくまで半角スペースで区別するもので別の方法をとらなくてはいけないという軽い言い回しで、無理だから調べず他の方法を探るといったわけでもありません。ただこれ以上は聞かなかったというだけのことです。
そこまでがアイデアについて質問した所の一区切りです。上記のはバグさんから助言をいただくまえに
私が自分でアイデアを出したもの(というか自分で組み立てていたプログラム)に対する質問で、こちらはアイデアをくださいとは関係でございません。まぁ一連の流れで察するのは不可能だと思いますがそういうことです。
変な質問転換になってるので本人以外にはわかりませんね。
strncpyの事に関しては無知もいい所でしたがこちらも私のみすでした
numberの定義は
int numberです。ちゃんと書き直さなかったのが良く無かったですね。まぁこれも間違ってるわけですが。
不毛な言い争いになるのでこの件に関しては他で聞くことにします。
板を汚してしまって申し訳ありませんでした。