プログラムの課題について

このQ&Aのポイント
  • 学校の課題で出されたプログラムについてわからない部分があります。
  • 315と入力すると英語読みが出力されるプログラムについて、考え方やヒントが欲しいです。
  • 複数の値を入力し、個数や平均値、最大値、最小値を出力するプログラムについて、考え方やヒントが欲しいです。
回答を見る
  • ベストアンサー

両替プログラムなど

学校の課題で出たプログラムなのですが、いまいちわかりません。 (1)1000円を500円、100円、50円、10円を使って両替する全てのパターンを出力するプログラム。 (2)整数を入力し、上位の桁から順に各桁の英語読みを出力するプログラム。配列使用。 (3)0~100までの任意の値を複数入力して、入力された値の個数、平均値、最大値、最小値を出力するプログラム。 (2)については、315と入力するとthree one fiveと出力されるプログラムです。 (3)については、複数入力と入力された値の個数の部分がわかりません。 コードを全て記述して教えてくれればうれしいですが、考え方、ヒントだけでも結構です。 非常に困っています。助けてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.3

みなさん手厳しいですね。 (3)は分からない部分が明確ですので、回答してもいいですかね。 まず、複数個の値をどのように受け付けるのかを決めないといけません。 宿題であれば、それは先生が言ってませんでしたか? 自由に決めてよしということであれば、宿題レベルでは一般的に以下のどれかだと思います。 1. 引数として複数個受け付ける(argc) 2. 対話的に複数個受け付ける(scanfなど) 3. データファイルを渡す(csvなど) 最大長が100って決まっているので、先生は2.あたりを想定していますでしょうか。 であれば、以下のように作ればいいのではないでしょうか。 int i; int nums[100]; for(i=0; i<100; i++){ // ユーザに終了するか確認、終了ならbreak // scanfで数値取得し、nums[i]に代入 } // ここで取得件数はi件なので、nums[0]からnums[i-1]までの // 個数、平均値、最大値、最小値を計算して出力 日本語で書いた部分をC言語化すれば動くと思います。 ちなみに、上記1.のパターンで作る場合、 int main(int argc, char *argv[]){ ここのargcに引数の件数が格納されますので、 個数分だけargvを読んであげればいいと思います。 詳しくはお手元の教本のどっかに書いてあるはず。 あと、(2),(3)に比べて(1)は妙に難しい気がします。 がんばって!

murasame-alk
質問者

お礼

回答ありがとうございました。 友人や先輩に聞いてなんとかできました。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

(1) #include <stdio.h> #include <stdlib.h> int main() { printf("# of 500/100/50/10 yen coins:\n"); printf( "2/0/0/0\n" "1/5/0/0\n" "1/4/2/0\n" "1/4/1/5\n" "1/4/0/10\n" "1/3/4/0\n" "1/3/3/5\n" "1/3/2/10\n" "1/3/1/15\n" "1/3/0/20\n" "1/2/6/0\n" "1/2/5/5\n" "1/2/4/10\n" "1/2/3/15\n" "1/2/2/20\n" "1/2/1/25\n" "1/2/0/30\n" "1/1/8/0\n" "1/1/7/5\n" "1/1/6/10\n" "1/1/5/15\n" "1/1/4/20\n" "1/1/3/25\n" "1/1/2/30\n" "1/1/1/35\n" "1/1/0/40\n" "1/0/10/0\n" "1/0/9/5\n" "1/0/8/10\n" "1/0/7/15\n" "1/0/6/20\n" "1/0/5/25\n" "1/0/4/30\n" "1/0/3/35\n" "1/0/2/40\n" "1/0/1/45\n" "1/0/0/50\n"); printf( "0/10/0/0\n" "0/9/2/0\n" "0/9/1/5\n" "0/9/0/10\n" "0/8/4/0\n" "0/8/3/5\n" "0/8/2/10\n" "0/8/1/15\n" "0/8/0/20\n" "0/7/6/0\n" "0/7/5/5\n" "0/7/4/10\n" "0/7/3/15\n" "0/7/2/20\n" "0/7/1/25\n" "0/7/0/30\n" "0/6/8/0\n" "0/6/7/5\n" "0/6/6/10\n" "0/6/5/15\n" "0/6/4/20\n" "0/6/3/25\n" "0/6/2/30\n" "0/6/1/35\n" "0/6/0/40\n" "0/5/10/0\n" "0/5/9/5\n" "0/5/8/10\n" "0/5/7/15\n" "0/5/6/20\n" "0/5/5/25\n" "0/5/4/30\n" "0/5/3/35\n" "0/5/2/40\n" "0/5/1/45\n" "0/5/0/50\n" "0/4/12/0\n" "0/4/11/5\n" "0/4/10/10\n" "0/4/9/15\n" "0/4/8/20\n" "0/4/7/25\n" "0/4/6/30\n" "0/4/5/35\n" "0/4/4/40\n" "0/4/3/45\n" "0/4/2/50\n" "0/4/1/55\n" "0/4/0/60\n" "0/3/14/0\n" "0/3/13/5\n" "0/3/12/10\n" "0/3/11/15\n" "0/3/10/20\n" "0/3/9/25\n" "0/3/8/30\n" "0/3/7/35\n" "0/3/6/40\n" "0/3/5/45\n" "0/3/4/50\n" "0/3/3/55\n" "0/3/2/60\n" "0/3/1/65\n" "0/3/0/70\n" "0/2/16/0\n" "0/2/15/5\n" "0/2/14/10\n" "0/2/13/15\n" "0/2/12/20\n" "0/2/11/25\n" "0/2/10/30\n" "0/2/9/35\n" "0/2/8/40\n" "0/2/7/45\n" "0/2/6/50\n" "0/2/5/55\n" "0/2/4/60\n" "0/2/3/65\n" "0/2/2/70\n" "0/2/1/75\n" "0/2/0/80\n" "0/1/18/0\n" "0/1/17/5\n" "0/1/16/10\n" "0/1/15/15\n" "0/1/14/20\n" "0/1/13/25\n" "0/1/12/30\n" "0/1/11/35\n" "0/1/10/40\n" "0/1/9/45\n" "0/1/8/50\n" "0/1/7/55\n" "0/1/6/60\n" "0/1/5/65\n" "0/1/4/70\n" "0/1/3/75\n" "0/1/2/80\n" "0/1/1/85\n" "0/1/0/90\n" "0/0/20/0\n" "0/0/19/5\n" "0/0/18/10\n" "0/0/17/15\n" "0/0/16/20\n" "0/0/15/25\n" "0/0/14/30\n" "0/0/13/35\n" "0/0/12/40\n" "0/0/11/45\n" "0/0/10/50\n" "0/0/9/55\n" "0/0/8/60\n" "0/0/7/65\n" "0/0/6/70\n" "0/0/5/75\n" "0/0/4/80\n" "0/0/3/85\n" "0/0/2/90\n" "0/0/1/95\n" "0/0/0/100\n"); return EXIT_SUCCESS; } どこか難しいところはありますかね>#3. とはいえ疲れた.

murasame-alk
質問者

お礼

回答ありがとうございました。 友人や先輩に聞いてなんとかできました。 質問の仕方が悪かったですね。 単純に手打ちでパターンを全て出力するのではなく、アルゴリズムを用いたプログラムを作らなければいけない問題でした。 お手数を掛けまして申し訳ありません。

回答No.4

3つ全部どうぞ /***** (1)のプログラム *****/ #include "stdio.h" #include "stdlib.h" #include "string.h" /*コインの枚数情報*/ struct CoinGroup { const int coin; /*コイン種別*/ int count; /*枚数(組み合わせ毎に書き換える)*/ }; static CoinGroup coinGroup[] = { { 500, 0 }, { 100, 0 }, { 50, 0 }, { 10, 0 }, { 0, 0 }, }; void exchange( CoinGroup* group, int money ) { int size = money / group->coin; group->count = 0; while( group->count <= size ) { int amount = group->coin * group->count; /*まだ小さい硬貨がある?*/ if( 0 < ( group + 1 )->coin ) { /*次の硬貨で枚数の組み合わせを計算する*/ exchange( group + 1, money - amount ); } /*最大枚数に達した?*/ if( !( money - amount ) ) { /*これ以上小さい硬貨がない時は 全ての硬貨の枚数を出力する*/ if( 0 >= ( group + 1 )->coin ) { CoinGroup* temp = coinGroup; while( 0 < temp->coin ) { printf( "[%d]%d\t", temp->coin, temp->count ); ++temp; } printf( "\n" ); } break; } ++( group->count ); } } int main() { exchange( coinGroup, 1000 ); return 0; } /***** (2)のプログラム *****/ #include <stdio.h> int main() { const char* str[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; char buffer[ 64 ]; printf( "%d桁までの整数を入力してください:", sizeof( buffer ) - 1 ); scanf( "%s", buffer ); for( char* ptr = buffer; '\0' != *ptr; ptr++ ) { int ix = *ptr - '0'; if( 0 <= ix && 9 >= ix ) printf( "%s ", str[ ix ] ); } return 0; } /***** (3)のプログラム *****/ #include <stdio.h> #include <stdlib.h> #define MAX_INPUT_COUNT 100 int main() { int count = 0; int total = 0; int min = 0; int max = 0; while( true ) { /*数値以外が入力されたら抜けるように -1で初期化しておく*/ int input = -1; printf( "整数を入力してください(0~100):" ); scanf( "%d", &input ); /*0~100以外の値が入力されたら終了*/ if( 0 > input || 100 < input ) break; /*最小値を記憶*/ if( !count || min > input ) min = input; /*最大値を記憶*/ if( !count || max < input ) max = input; /*総和を記憶*/ total += input; /*個数を加算*/ ++count; } printf( "個数 =%d\n", count ); if( 0 < count ) { printf( "平均値=%.1f\n", ( double )total / count ); printf( "最大値=%d\n", max ); printf( "最小値=%d\n", min ); } return 0; }

murasame-alk
質問者

お礼

回答ありがとうございました。 友人や先輩に聞いてなんとかできました。 詳細に書いていただいたので、このプログラムも試してみたいと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「いまいちわからない」なら, わかることは全部書いてください.

murasame-alk
質問者

お礼

回答ありがとうございました。 友人や先輩に聞いてなんとかできました。 質問者としてのマナー違反ですね。 申し訳ありませんでした。 今後、質問をする際は気をつけます。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

学校の課題なので、テキストや授業ノートにヒントは必ずある。 全てコードを提示してもらってとりあえず解決したとして、そのアルゴリズムを説明できなければ丸写しがバレバレだが、それって課題を正解できない以上の問題にならないか? 一度に3つというのは、頼りすぎ。 自分でどこまで考えたのか? コード化の前に、日本語で処理の流れ手順を整理すべし。

murasame-alk
質問者

お礼

回答ありがとうございました。 友人や先輩に聞いてなんとかできました。 確かに焦っていたとはいえ甘えすぎでした。 忠言ありがとうございます。

関連するQ&A

  • 3つほどプログラムをおしえてください。

    (1)100までの整数をいくつか入力し、10刻みでの個数を表示し、負の数が入力されると整数の入力を終わるプログラムです。各範囲の個数は配列に格納する。 実行結果 65 30 21 95 5 -1 0--- 9 : 1 10--- 19 : 0 20--- 29 : 1 30--- 39 : 1 40--- 49 : 0 50--- 59 : 0 60--- 69 : 1 70--- 79 : 0 80--- 89 : 0 90---100 : 1 (2)数字の文字列を入力し、その文字列に含まれる各数字(文字)'0','1',~'9'の個数を表示するプログラムの作成。 実行結果 1231234567 0: 0 1: 2 2: 2 3: 2 4: 1 5: 1 6: 1 7: 1 8: 0 9: 0 (3) 変数xは、0~1までの0.01刻みの値(101個)を取るとする。このとき、2次関数 f(x)=3x^2+2x+1の値が2.0<f(x)<3.0となるxの値をの個数を求めるプログラムの作成。ただし、xを引数としf(x)の値を返す関数を作成して、それを使用する。 実行結果 number=21 やってるうちにわけがわからなくなってしまいます。どなたかよろしくおねがいします。

  • ★C言語の問題です★

    C言語のプログラムの問題なんですが、どなたか以下の問題の1問でも解ける方がいればご回答おねがいします! または、アドバイスだけでもいいのでよろしくお願いします。 【問題】 1 西暦1868年から2007年までの年号を入力して和暦に変更して出力するプログ  ラムを作成するプログラム。  例 入力 1868  出力 明治元年       2007     平成19年 2 整数配列が-32768から32767の範囲の数しか扱えないとしたとき、10桁の整数同士  の足し算を行うプログラム。 3 3桁の整数の値を入力していき、-9999が入力されたところで、それまでに入力  された数の個数と合計を整数で、平均を浮動小数点数で出力するプログラム。 4 3つの文字列”Happy”と“New”と“Year”をつないで1つの文字列として出力する  プログラム。 5 学籍番号、氏名、出席からなる10人分のデータがある。出席の悪いものから並び替  えて表示するプログラム。  例  CA180002 山田太郎 70  CA170001 山田次郎 60  データは、適当なものを使います。

  • 色々なメソッドを宣言することについて・・・

    /*引数で指定された範囲内のランダム整数値を取得し返す*/ /*キーボードから入力を受け付け、整数に変換後その値を返す*/ /*キーボードから入力された複数の文字列を配列に編集し返す*/ /*キーボードから入力された複数の整数を配列に編集し返す*/ /*引数で渡されたint型配列を指定された順(昇順または降順)にソートする*/ /*引数で渡されたint型配列中の最大値及び最小値を求め返す*/ /*引数で渡されたint型配列中の最大値及び最小値を求め画面に出力する*/ /* 引数で渡された8桁の年月日を、年、月、日に分割し返す 例  : 20050521が引数で渡されたら      2005 05 21 に分割しStringの配列を作成し返す */ /* 引数で渡された8桁の年月日を、年、月、日に分割し返す 例  : 20050521が引数で渡されたら      2005年05月21日 と出力する。 */ /* 引数で渡された10桁の年月日(YYYY/MM/DD)から'/'を削除し8桁で返す */ /* 引数で渡された10桁の年月日(YYYY/MM/DD)から'/'を削除し8桁で表示する */ /*引数で渡された3つのint型の平均を求めdouble型で返す*/ /*引数で渡された3つのint型の平均を求めdouble型で表示する*/ /*●●●●●●●●●●●●●●●●●●●●*/ /*●●●●●●●●●●●●●●●●●●●●*/ /*●●●●●●●●●●●●●●●●●●●●*/ /*●●●●●●●●●●●●●●●●●●●●*/ /*●●●●●●●●●●●●●●●●●●●●*/ } } /* このクラスを利用するクラスを作成する /*●●*/は自分でメソッドを考えて作成する */ というプログラムを作成したいのですがどのようにしたらいいかわかりません!!ところどころはわかるのですが…。

  • プログラム

    「一行に書かれた式(文字列)の値を求めるプログラム」 少なくとも2つの2桁までの正の整数値の加減乗除ができること。 このプログラムのやりかたがわかりません、教えてください。。

  • 【JAVA】配列の要素の平均について

    JAVAで質問となります。 以下のプラグラムを教えていただきたいです。 ____________________ n 個の要素で構成される int 型の配列を引数として受け取り,配列内の全要素の平均値を返すメソッドを作成してください. また,コマンドライン入力に整数値を入力すると,作成したメソッドを使用して,入力した整数値の平均値を求め,結果を標準出力に出力するプログラムを作成してください. このプログラムを作成する際は,以下の要件を満たすように作成してください:  【メソッド】 配列内の全要素の平均値を求めるメソッドは,以下の仕様とする: メソッド名:calcAverage 引数:配列 - int 型の配列 戻り値:平均値 - double 型 内容:引数として受け取った配列のすべての要素の平均値を計算する.  【入力】 整数値のデータは,コマンドライン入力に入力する. その際,各整数値は,半角スペースで区切る.  【出力】 コマンドライン入力に1つ以上の整数値が入力された場合は,それらの平均値を出力する. コマンドライン入力に何も入力されなかった場合は,何も出力しない. 平均値の出力は,全体を左詰めで小数点以下2桁まで出力する. 行の先頭には空白を入れず,行の左端から出力する.

  • 閏年が何個含まれるか求めるプログラム

    3桁、あるいは4桁の整数を10個程度入力して、これらの中 に閏年が何個含まれるか求めるプログラムの書き方を教え てください。  お願いします。

  • C言語の質問です。

    プログラムを書こうとしているのですが、行き詰まるっているのでアドバイスください。 ○データ 0 0 1 2 2 3 4 5 5 5 8 8 10 10 ・ ・ ・ このような整数がだんだん増えていく(1万以上の整数まで増えていく)書式のデータがあるとします。 僕の作りたいプログラムは 一万個以上あるすべてのデータを読み込んで個数を出す。というものです。 言葉で表現するのが難しいので例を出しますと 最終的にほしいものは データをすべて読み込んで 同じ整数がない整数の個数 同じ整数が2つの整数の個数 同じ整数が3つの整数の個数      ・      ・ 同じ整数が10つの整数の個数      ・      ・    このような情報がほしいと考えています。 例のデータで考えますと 同じ整数がない整数 =3 同じ整数が2つの整数=4 同じ整数が3つの整数=1 になります。 私が考えているやり方の手順 (1) データを読み込む (2) 読み込んだ整数のそれぞれのすべての個数を出す。    例:1=2個 15=1個 289=3個  (3) 出した個数の数を数えて出力。 という流れです。 私が行き詰まっているプログラム int main(void) { int i, n, hako[?];  ←1万個以上あるので箱を何個用意すればいいかわかりません   // n は読み込んだデータ。 FILE *fp;         配列を使おうと思っているのですが。。。 fp=fopen("FILENAME","r"); ←データの読み込み if(fp==NULL) { printf("file open error!!\n"); exit(1); } for(i=1;i<?;i++);  ←すべての箱をゼロクリアしたいのですが箱の個数がわかりません hako[i]=0; while(fsacanf(fp, "%d\n", &n)!=EOF){ if(i>n){hako[i]++;}  if(i=n){ i++; hako[i]++; } printf("%d = %d\n", i ,hako[i]); } fclose(fp); return 0; } とりあえずは流れ(2)までのプログラムを書きたいと考えています。 配列が苦手なので混乱しています。 配列のhako[]のところで間違っていると思うのですがよくわからないので質問してみました どうぞよろしくお願いします。

  • switch文とwhile文を用いたプログラムに関して

    swich文とwhile文を用いたプログラムについて 授業の課題で、swich文とwhile文を用いたプログラムを作りなさい。いう課題が出ました。 5桁以上9桁以下の正の整数を入力し、4で割り切れたとき、何桁の数字かを出力。4でわって1余ったとき、すべての桁の合計を出力。3余ったとき、与えられた数の逆を変数に代入し、その変数を出力(単純に表示するわけではなく、数字として表示) といったものです。 途中からの授業参加で、C言語に関する知識はほとんどありません。do文を用いたプログラムは見つけれたのですが、while文とswich文を用いろということなので、do文は使えないです。 どなたか教えていただけませんか? 今日中にわからないとちょっとやばいです・・・。 よろしくお願いします

  • キーボードからの入力

    キーボードの1を使い、1を押した回数を配列に入れるというCプログラムを考えています。 例えば、キーボードから1を5回押せば配列[0]に数字の5を、次に1を10回押せば配列[1]に10を、30回押せば30を・・・と言う形です。 押した回数をどう配列に入れればいいのか私には思いつきません。 思いついた方法と言えば、入力した数字を10で割るという方法です。 例えば、1を5回押せばその値は11111ですから、それを10で割り、割った回数に1を足せば配列に5を入れられます。(めんどくさいやり方かもしれませんが。。。) しかしその方法だと、キーボードから入力した値が10桁を越えると長整数の範囲を超えオーバーフローを起こしてしまいます。 どなたか良い方法をご存知であればよろしくお願いします。

  • C言語プログラム

    こんな課題が出たのですが、さっぱりわかりません。 誰か解る人がいたら教えてほしいです。 1 3+5+7+…+nと奇数の和を求め、和が100を越えたときのnの値を求めて表示するプログラムをdo~whileを使って作成しなさい。 2  キーボードから3つの数を読み込み、最大値を求める処理を繰り返し行うプログラムを、do~whileを使って作成しなさい。繰り返しの終了は、計算のあとで、'S'(1文字)が入力されるまでとし、それ以外の文字では、処理を続行すること。 3  整数型1次元配列kに整数123,456,789をそれぞれ代入し、その内容を表示するプログラムを作成しなさい。 4  文字型1次元配列strに'u'を、'n'、'i'、'x'それぞれ代入し、その内容を文字列として出力するプログラムを作成しなさい。 5  要素数50の整数型1次元配列mの要素すべてに、その添字に対応した0~49の数値を代入し、その内容を表示するプログラムを作成しなさい。 3は #include <stdio.h> main() { int k[3]; k[0] = 123; k[1] = 456; k[2] = 789; printf("%d\n%d\n%d", k[0], k[1], k[2]); return 0; } と解いてみたんですが、やっぱ間違えてますよね?

専門家に質問してみよう