アプリ版:「スタンプのみでお礼する」機能のリリースについて

学校の課題で出たプログラムなのですが、いまいちわかりません。
(1)1000円を500円、100円、50円、10円を使って両替する全てのパターンを出力するプログラム。

(2)整数を入力し、上位の桁から順に各桁の英語読みを出力するプログラム。配列使用。

(3)0~100までの任意の値を複数入力して、入力された値の個数、平均値、最大値、最小値を出力するプログラム。


(2)については、315と入力するとthree one fiveと出力されるプログラムです。
(3)については、複数入力と入力された値の個数の部分がわかりません。

コードを全て記述して教えてくれればうれしいですが、考え方、ヒントだけでも結構です。
非常に困っています。助けてください。

A 回答 (5件)

学校の課題なので、テキストや授業ノートにヒントは必ずある。



全てコードを提示してもらってとりあえず解決したとして、そのアルゴリズムを説明できなければ丸写しがバレバレだが、それって課題を正解できない以上の問題にならないか?

一度に3つというのは、頼りすぎ。

自分でどこまで考えたのか?

コード化の前に、日本語で処理の流れ手順を整理すべし。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/08 22:45

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/08 22:52

みなさん手厳しいですね。


(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)は妙に難しい気がします。
がんばって!
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/08 22:45

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_COUNT100
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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/08 22:45

(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.

とはいえ疲れた.
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/08 22:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!