トップページ⇒tech
1001コメント370KB

C/C++の宿題を片づけます 49代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/10(水) 17:10:47

あなたが解けないC/C++の宿題を片づけます
――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
―――――――――――――――――――――――――――――――

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: Windows/Linux/等々
 [3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0等
 [3.3] 言語: C/C++/どちらでも可 のいずれか
[4] 期限: [yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか (「できるだけ早く」は不可)
[5] その他の制限: どこまで習っているか、標準ライブラリは使ってはいけない等々

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

【前スレ】
48代目: http://pc8.2ch.net/test/read.cgi/tech/1121471445/

【歴代スレは>>2-13】
0075デフォルトの名無しさん2005/08/14(日) 21:37:17
>>74
すいません。
大きいノード全てを表示します。
0076デフォルトの名無しさん2005/08/14(日) 21:48:19
void printLargerForTree(struct TreeNode* data,int n)
{
  printLargerForTreeAux(data, n, 0);
}
void printLargerForTreeAux(struct TreeNode* data,int n,int pos)
{
  if (data == NULL)
    return;
  if (data->value > n)
    printf("% 3d %d\n", pos, data->value);
  printLargerForTreeAux(data->left, n, 2 * pos + 1);
  printLargerForTreeAux(data->right, n, 2 * pos + 2);
}
0077デフォルトの名無しさん2005/08/15(月) 00:35:52
>71
元の文字列が250文字あって、たとえば50文字を挿入するとかってヤヴァくね?
0078デフォルトの名無しさん2005/08/15(月) 00:40:18
>>77
宿題だし。それに、それを呼び出し元が管理するか呼び出し先が
管理するかはポリシーの問題。
0079772005/08/15(月) 00:46:05
>78
でも挿入位置のチェックだけは呼ばれた側でやるの?おかしくね?
0080デフォルトの名無しさん2005/08/15(月) 00:50:01
与えられた引数でできることはするポリシーなんだよ、うぜーな
0081デフォルトの名無しさん2005/08/15(月) 00:56:50
>80
でも与えられたポインタがNULLかどうかはチェックしない、と
0082デフォルトの名無しさん2005/08/15(月) 00:59:41
>>77は自分でコード出さない割に必死だな
0083デフォルトの名無しさん2005/08/15(月) 01:07:55
テストケースからプログラム作ることで、そこら辺の曖昧さを明確にせざるをえない
0084デフォルトの名無しさん2005/08/15(月) 01:08:14
str系のNULLチェックしないのはスタンダードポリシーだ
0085デフォルトの名無しさん2005/08/15(月) 01:15:02
たとえば、
strcpy()の受け側の文字列が十分に大きくない場合 (つまり、プログラマが間抜けか不精で、
コピーする前にサイズをチェックすることを怠った場合)、何が起こるかわからない。
固定長文字列を溢れさせるのはクラッカーが好むテクニックである。
0086デフォルトの名無しさん2005/08/15(月) 10:12:49
じゃあ、どうすればいいの?(;´Д`)
0087デフォルトの名無しさん2005/08/15(月) 10:27:53
課題出してる人だってわかって書いてるだろ
ただの宿題なんだろうし。
0088デフォルトの名無しさん2005/08/15(月) 14:24:17
[2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/861.txt
[3] 環境
 [3.1] OS: XP
 [3.2] コンパイラ名とバージョン: gcc 2.9
 [3.3] 言語: C言語
[4] 期限: 2005年8月19日 07:30まで
[5] その他の制限:特になし
おながいします
0089デフォルトの名無しさん2005/08/15(月) 15:35:58
>88
すまん、簡単すぎて食指が動かん。

んー・・?
たぶん>>71と同一人物だろうが、前の奴らに礼くらいしたらどうだ?
0090デフォルトの名無しさん2005/08/15(月) 16:19:50
高専だか何だか知らないが、
こんな簡単なものも自分で解けなくて、本当に卒業出来るのだろうか。
0091デフォルトの名無しさん2005/08/15(月) 16:56:49
仕事を回されたとき自分じゃできず、周囲に迷惑をかけるぱたーん?
0092デフォルトの名無しさん2005/08/15(月) 17:02:03
>>88
初心者なんで間違っていたらごめんなさい

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/862.txt
0093デフォルトの名無しさん2005/08/15(月) 17:05:44
>92
君は?
009492!=882005/08/15(月) 17:13:01
このスレでCを勉強してるものです
0095デフォルトの名無しさん2005/08/15(月) 17:19:11
>94
ワロス
問題文よく嫁w
0096デフォルトの名無しさん2005/08/15(月) 17:45:24
>>88
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/863.txt
0097デフォルトの名無しさん2005/08/15(月) 18:02:11
>96
>(男:'M' 女:'F')

とあるが'M','F'以外の入力もおけ
かつ'M'以外なら女にしてもおけ?
0098デフォルトの名無しさん2005/08/15(月) 18:04:35
>>88
#include <stdio.h>
#include <string.h>
struct data {
    char name[100];
    char sex;
    double sintyo;
    double taiju;
};
int main(void) {
    double d;
    char buf[2];
    struct data person;
    for (; ; ) {
        printf("名前入力:"); scanf("%s", person.name);
        if (!strcmp(person.name, "end")) break;
        printf("性別入力:"); scanf("%1s", buf);
        person.sex = buf[0];
        printf("身長入力:"); scanf("%lf", &person.sintyo);
        printf("体重入力:"); scanf("%lf", &person.taiju);
        d = person.taiju - (person.sintyo - 100) * 0.9;
        printf("\n%s%sは、平均体重より%fkg%sです。\n\n", person.name, person.sex == 'M' ? "君" : "さん", d > 0 ? d : -d, d > 0 ? "多い" : "少ない");
    }
    return 0;
}
0099デフォルトの名無しさん2005/08/15(月) 18:07:11
>98
>97
0100デフォルトの名無しさん2005/08/15(月) 18:25:04
>98
%c
0101デフォルトの名無しさん2005/08/15(月) 18:28:46
>>100
改行が残ってバッファをクリアしたりするのメンドイ。
0102デフォルトの名無しさん2005/08/15(月) 18:34:35
>101
なるへそ

(もれだったらgetchar()かな)
0103デフォルトの名無しさん2005/08/15(月) 18:34:36
スペース空ければ
0104デフォルトの名無しさん2005/08/15(月) 18:36:38
100以下の場合を考えなさいに見えた。orz
#include <stdio.h>
#include <string.h>
struct data{
char name[100];
char sex;
double sintyo;
double taiju;};
int main(void) {
struct data unko;
while(1) {
int namelen = 0;
double heykin;
const char* govi;
printf("名前入力:");
fseek(stdin, SEEK_END, 0);
while(namelen < sizeof(unko.name)) {
int c = getchar();
if(NULL != strchr("\n\r", c)) { fseek(stdin, SEEK_END, 0); break; }
unko.name[namelen++] = c; }
if(namelen == sizeof(unko.name)) { printf("名前長っ!\n"); break; }
unko.name[namelen] = '\0'; if(strcmp(unko.name, "end") == 0) break;
printf("性別入力:"); scanf("%c", &unko.sex);
if(unko.sex == 'M') govi = "君";
else if(unko.sex == 'F') govi = "さん";
else { printf("ホモお断り。\n"); break; }
printf("慎重入力:"); scanf("%lf", &unko.sintyo);
heykin = (unko.sintyo < 100.)? 0.9 / ((101-unko.sintyo) * 2.): (unko.sintyo - 100.) * 0.9;
printf("体重入力:"); scanf("%lf", &unko.taiju);
if(unko.taiju < heykin) printf("%s%sは、平均体重より%.1f少ないです。\n", unko.name, govi, heykin - unko.taiju);
else printf("%s%sは、平均体重より%.1f重いです。\n", unko.name, govi, unko.taiju - heykin);}
return 0;}
0105デフォルトの名無しさん2005/08/15(月) 18:44:37
>printf("ホモお断り。\n"); break;

end入力以外でかってに終了するのはいくない
0106デフォルトの名無しさん2005/08/15(月) 19:01:39
まじっすかorz
0107デフォルトの名無しさん2005/08/15(月) 19:05:25
問題に書かれていないことならどうなっても問題ないと思うけど?
例え format c: とか rm /* とか動いてもw
0108デフォルトの名無しさん2005/08/15(月) 19:06:49
エラーメッセージ吐いて終了してるから問題ないべ。
0109デフォルトの名無しさん2005/08/15(月) 19:22:24
つまらん宿題だと思ったが、対話型データ入力の例外処理をどう扱うかが主題だったら深いかもしれないねコレ。
0110962005/08/15(月) 20:20:25
>>97
性別として男と女しか認めないのはあまりに保守的で時代遅れだと思った。
それから、「さん」は性別にかかわりなく使える一般的な敬称だと思ってそうした。
反省はしていない。
0111デフォルトの名無しさん2005/08/15(月) 22:48:34
>>97
実用的には、「男」「女」以外に「不明」が必要だな。
0112デフォルトの名無しさん2005/08/15(月) 22:55:11
不明はともかく
未回答とかはありかも(webのアンケートとか)
0113デフォルトの名無しさん2005/08/15(月) 23:16:51
そーいや、アホがラジオボタンじゃなくてチェックボックスでつくってたな。
未回答、男、女、男女の4通りの答えがあった。

てか、燃料くれよ。
0114デフォルトの名無しさん2005/08/15(月) 23:23:32
>>113
理にかなってるだろそれは。
まあ欲を言えば、チェックボタンを押す順番も取得したいところだが。
0115デフォルトの名無しさん2005/08/16(火) 00:44:41
>>88
構造体の再利用は考えないでいいのか? 
一人目以降のデータを上書きだと実用的じゃないよな?
0116デフォルトの名無しさん2005/08/16(火) 00:57:56
>>115
宿題ごときに実用もクソもないと思われ。
このレベルの問題で再利用もクソもないと思われ。
こんなデータを上書きされても別に誰も困らないと思われ。
0117デフォルトの名無しさん2005/08/16(火) 01:03:24
というか、常に上書きするのだったら構造体みたいなのじゃなくて単独変数でいいやん
0118デフォルトの名無しさん2005/08/16(火) 01:04:24
だよね〜
0119デフォルトの名無しさん2005/08/16(火) 01:34:01
>>88 やってみました。添削キボンヌ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/864.txt
0120882005/08/16(火) 01:35:24
あぁぁぁ、いきなりヘンなとこ見つけた……
0121デフォルトの名無しさん2005/08/16(火) 01:37:11
え?今更上書きバージョン?
0122882005/08/16(火) 01:41:03
ダメ? なら直してくるよ。
0123882005/08/16(火) 01:46:40
急いで直してみました。どうでしょう?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/865.txt
0124デフォルトの名無しさん2005/08/16(火) 01:52:58
これらが未使用変数ですよ
char NAMAE[100];
char SEX;
double SHINTYOU;
double TAIJYUU;
0125882005/08/16(火) 01:54:38
あぁぁあ、ゴメン。
それさっき気付いたんですけど、また更新前のを送ってしまいました。orz
0126デフォルトの名無しさん2005/08/16(火) 02:05:28
>>125
おまえ今日から2軍な。
0127デフォルトの名無しさん2005/08/16(火) 02:39:51
つか玉拾い&玉磨き
0128デフォルトの名無しさん2005/08/16(火) 02:51:50
それって肉便器の事?
0129デフォルトの名無しさん2005/08/16(火) 05:22:27
88氏のを改良し入力可能な人数を(メモリの許す限り)無限にしてみました
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/866.c
汎用の動的配列構造体はいろんな場面で使えると思います
あと、大きな改良ポイントはユーザー(もしくはテストベクタ)からの入力データを
どのように正規化するかかな
0130デフォルトの名無しさん2005/08/16(火) 07:15:42
取り敢えず88はあんまり関係無いという事は分かった。
01311192005/08/16(火) 09:30:29
ナチュラルに間違えていたんだけど、88 ≠ 119 です。
マジゴメン。吊ってくる。ってか、>>129の解読が出来ない… orz
01321292005/08/16(火) 09:50:13
おれも間違えた.. 88ってのは宿題出してきた奴だった。こんなの提出しないだろうなぁ
866.cの修正点として2点
1)PERSON_INIT_NUMを0に設定するとセグフォがでるのを修正
2)引数なしで起動なら標準入力からで、コマンドラインからファイル名を入力したら
それを読み込むように変更しました.要望があればうpします

あとは、気が向いたら読み込んだデータをsqliteを使って保存するように変更してみますか
0133デフォルトの名無しさん2005/08/16(火) 22:40:34
>>88
kumikoさんがあり得ないほど太っている件
0134デフォルトの名無しさん2005/08/16(火) 22:50:03
>>88
体重と平均体重が一緒の場合はどうすればいい?
0135デフォルトの名無しさん2005/08/17(水) 01:34:12
#include<stdio.h>

double menseki(double,double);

int main()
{
double a,b,c;
c=menseki(a,b);


printf("底辺--");
scanf("%lf",&a);

printf("高さ--");
scanf("%lf",&b);

printf("面積は%.2fです\n",c);

return 0;
}

double menseki(double a,double b)
{
double c;

c=a*b/2;

return c;
}


面積が0.00になるんですが、どうしてでしょうか?
0136デフォルトの名無しさん2005/08/17(水) 01:36:26
>>135
0.00になるだけまし
a, bが不定なのに参照している
未定義動作。ハードディスクをフォーマットされてな
0137デフォルトの名無しさん2005/08/17(水) 01:39:18
そんなプログラムを動かすなら、パソコンが壊れたときの責任は免責させてください。
0138デフォルトの名無しさん2005/08/17(水) 01:41:52
>>137日本語変だよ
0139デフォルトの名無しさん2005/08/17(水) 01:42:45
>>136
自分でa,bを自分で入力して面積をだしたいと思ったのです
0140デフォルトの名無しさん2005/08/17(水) 01:43:53
「自分で」使いすぎちまった
0141デフォルトの名無しさん2005/08/17(水) 01:46:02
>>139 だから何なんだ?w

1. 自分でa,bを自分で入力して
2. 面積をだしたい

その順序で組めよ
なぜa, bが不定なのか考えたのか?
0142デフォルトの名無しさん2005/08/17(水) 01:58:41
>>141
お、できた  順序か

サンクスです
0143デフォルトの名無しさん2005/08/17(水) 02:01:53
プログラミング言語を数学的に解釈していると思われる。
cは関数mensekiで定義される・・・とかかんがえてるんじゃなかろーか。

この手の説明をキチンとするには、プログラミングの代入ってどんなんとか、
関数は定義と呼び出しがあるんだとか、順番だとか、副作用だとか。のーみそがおかしくなる。
0144デフォルトの名無しさん2005/08/17(水) 02:07:11
>>143
>cは関数mensekiで定義される
なんかそんな感じです。
本見ながらやってるんだけど
面積を求める関数を作れみたいな問題でした
0145デフォルトの名無しさん2005/08/17(水) 02:17:36
>>144
プログラムでは数学で混用されている(という認識はないかもしれないが)
3種類のイコールが区別される。3種類のイコールとは、恒等(==)、代入(=)、
定義(関数の定義によって行う)。
0146デフォルトの名無しさん2005/08/17(水) 02:39:07
エディタでプログラムを書いてセーブする
→ソースファイルが出来る
ソースファイルをコンパイルする
→実行ファイルが出来る
実行ファイルを実行する
→メモリにプログラムが読み込まれ、下準備した後main()から実行される。

メモリにはコード領域、スタック、ヒープがある。
ソースコードにはコード領域とヒープ領域の一部を書く。

実行時にはコード領域の内容を順次実行する。

なんか、上手な説明がないかなぁ。
0147デフォルトの名無しさん2005/08/17(水) 11:53:46
そこまでディープに説明したらフォンノイマン型コンピューターの
仕組みとか解説する勢いだな。
0148デフォルトの名無しさん2005/08/17(水) 15:39:49
・main関数の上から順に実行される
・自動変数は最初はゴミが入っているので代入して綺麗にしないといけない
・変数は演算、代入で値が変わる
で、最後に
これらを踏まえた上でアルゴリズムを組みましょう

最初のうちはこんなもんでいいんじゃない?
0149デフォルトの名無しさん2005/08/18(木) 19:09:39
やっぱりスレタイにぼるじょあが入ってないと人が寄ってこないな
0150デフォルトの名無しさん2005/08/18(木) 19:23:05
いや、普通に夏休みだからだろ。
0151デフォルトの名無しさん2005/08/18(木) 19:39:20
>>149
頭悪いな。
0152デフォルトの名無しさん2005/08/18(木) 22:18:48
夏だな。

他のスレでは別の意味で使うが(^^;;
0153デフォルトの名無しさん2005/08/19(金) 23:28:15
ftpやnslookpuコマンドで使われているような
簡易シェルを作れと言われているんですが、
こんな感じですか? 問題点があったら教えてください。

int main()
{

  char buffer[0x100];

  for(;;)
  {
    printf(">");

    if( gets(buf)==NULL)
    {
      break;
    }

    printf("入力されたコマンドは%sです\n",buffer);
  }

  return 0;
}
0154デフォルトの名無しさん2005/08/19(金) 23:31:45
>>153
gets 関数は境界チェックが無くて危険なので fgets 推奨。
あとは特に問題はないと思う。
01551292005/08/20(土) 00:33:51
特に問題ないというか・・・
まだ他人に評価してもらうほどのものじゃないぞ・・・
printf(">");のあとにfflush(stdout);するのがいいんじゃないか

気をつけるべき点は>>154が言ってるようにユーザからの入力部分だな
バッファオーバーフローの話はいつまでたってもなくならんね
readline()使うとか。。プラットフォームに依存しちゃうか
0156デフォルトの名無しさん2005/08/20(土) 00:35:26
あ、アンカーミス 155≠129です スマソ
0157デフォルトの名無しさん2005/08/20(土) 09:57:50
[1] 授業単元:知識工学
[2] 問題文(含コード&リンク):
縦64bit×横64bit、0と1の二値画像データを縦64bit×横64bitのまま細線化し、出力する。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC++
 [3.3] 言語: C
[4] 期限: 2005年9月1日8:50まで]
[5] その他の制限:読み込むデータは「01.txt」とする。出力するデータの名前は任意とする。

いつもお世話になっております。
文字認識のプログラムをCで制作するにあたり、データの拡大&細線化する作業をしています。
しかし、肝心の細線化がうまくいかず、つまっております。
こんな、クソミソなへたれですがお力添えいただければうれしいです。

プログラム↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/868.txt

読み込むデータ↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/869.txt
0158デフォルトの名無しさん2005/08/20(土) 10:18:42
>>157
どういう細線化のアルゴリズムを採用したか。
どういう結果になるつもりか。
実際にはどういう結果になったか。

これらの情報があるとヒントが出せると思う。
0159デフォルトの名無しさん2005/08/20(土) 11:41:19
>>155
fflushは必要ない
getsの段階でflushされる
0160デフォルトの名無しさん2005/08/20(土) 13:36:53
文字の配列に平仮名を格納して一文字ずつ取り出し、
あ〜おはアルファベットに直し、それ以外は 'N' を表示するプログラムを作れ、という問題で
とりあえず 'あ' だけ処理してみようと以下のルーチンを作成してみたのですが 'N' しか表示されません。
どうすれば正しく表示されるのでしょうかorz

#include <windows.h>
#include <stdio.h>

void main() {
WCHAR* temp = L"あいうえおかきくけこ";

for(int i = 0; i < wcslen(temp); i++) {
switch (temp[i]) {
case 'あ':
printf("%c", 'A');
break;
default:
printf("N");
}
}
}
0161デフォルトの名無しさん2005/08/20(土) 13:44:08
>>160
case L'あ':
0162デフォルトの名無しさん2005/08/20(土) 14:57:51
>>161
ああああ!Lが抜けてたのか!
申し訳ない。orz
無事解決しました。ありがとうございました。
0163デフォルトの名無しさん2005/08/20(土) 16:11:26
ところで>>160を作っていてふと思ったのですが、>>160のようにあ〜おだけでなく
ひらがな全てをアルファベットに直す場合はどうするのでしょう?
地道に全てのひらがなに対応したswitchを用意するものなんですか?
0164デフォルトの名無しさん2005/08/20(土) 17:34:34
変換テーブルでも使え。
0165デフォルトの名無しさん2005/08/20(土) 17:49:16
変換テーブルですか。調べてみます。
0166デフォルトの名無しさん2005/08/22(月) 00:09:47
うう。夏が終わる。
がむばってlisp組みます。はい。
0167デフォルトの名無しさん2005/08/22(月) 00:19:07
いきなり何を言い出すんだ
0168デフォルトの名無しさん2005/08/22(月) 00:38:02
夏休みの宿題に言語を作れって言われてた奴とちゃう?
0169デフォルトの名無しさん2005/08/22(月) 00:40:46
前スレで報告済みでありますが、夏休みの宿題を出されたのであります。
とりあえず、アトムとconsセルをどーやって表現するか決めるであります。
0170デフォルトの名無しさん2005/08/22(月) 00:46:49
なんでもいいから言語を作れって宿題だけど、言語として空集合というのは
どうでしょうか?
するとそれをコンパイルするコンパイラは次のような仕様になるはずです。
1. 入力が空ならなにも出力せずに正常終了。
2. 入力になにかあったら"Syntax Error" を出力して終了。
これなら Hello World に毛の生えたようなプログラムでコンパイラが作れるはずです。
0171デフォルトの名無しさん2005/08/22(月) 00:53:26
しかし問題はそれをプログラミング言語として認めてもらえるかが問題。
最低限、何らかの制御構造があるべきだと思う。
0172デフォルトの名無しさん2005/08/22(月) 00:58:00
ごめん、再度書きます。
[1] 授業単元: 夏休みの宿題
[2] 問題文(含コード&リンク):
コンパイラまたはインタプリタを設計/実装せよ。以下の機能をつけること。
変数、式、配列、関数定義/呼び出し、組み込み関数、制御構造
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン): MinGW
 [3.3] 言語:C
[4] 期限:9月1日まで
[5] その他の制限:文法はひととおり
0173デフォルトの名無しさん2005/08/22(月) 00:59:58
PostScriptインタープリタ書いてみるとかw
0174デフォルトの名無しさん2005/08/22(月) 01:08:50
うーん。そこまでばっちり書いてあると逃げようがないね。
Smalltalk なんか制御構造無いっていえばないのに。
まあ式は代入だけで演算子なしでおっけーだろうけど。
組み込み関数は +1 と =0? と出力命令位でいいのかな?
マシン語みたいに配列は一個固定、1 byte だけ入れられるにして、
変数も一個だけ
制御構造は変数が0の時だけ次の命令を実行しないと、goto文でも付けておけば
いいかな?
関数定義はめんどくさいね。スタック作らないとだめなのかな?
■ このスレッドは過去ログ倉庫に格納されています