こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

プログラムの修正お願いします。

レンタルビデオを借りる。
1本150円。
5本借りると100円引き。
5本を越えると5本目以降は1本100円。
どこが間違ってるでしょうか??
教えてください。

#include<stdio.h>
void main(void)
{
int i,money;

printf("借りる本数を入力 ---> ");
scanf("%d",&i);

if(i < 5){
money = i * 150;
}
else if(i == 5){
money = money - 100;
}
else{
money = money + (i-5)*100;
}
printf("合計金額は%d円です。\n",money);
}

投稿日時 - 2003-11-27 14:05:00

QNo.716162

暇なときに回答ください

このQ&Aは役に立ちましたか?

11人が「このQ&Aが役に立った」と投票しています

回答(25)

ANo.25

盛り上がってるなぁ笑

頑張って補足を読み解いてみましたが、欲しいのはこの回答では?

money = i * 150;

if( i == 5 ) {
  money = money - 100;
}
if( i >= 5 ) {
  money = money - (i - 4) * 50;
}

投稿日時 - 2003-11-28 20:23:07

お礼

みなさんどうもありがとうございました。

投稿日時 - 2003-11-28 23:06:02

ANo.24

こんなのはどうでしょう。
左部が0~5本の場合、真中が5本以上の場合の値引き
右部が6本以上の場合を別々に求めて加算します。

#define MAX(a,b) ((a>b)? a:b)
#define MIN(a,b) ((a<b)? a:b)

money=(150*MIN(i,5)) + ((5<=i)? -100:0) + (100*MAX(0,i-5));

投稿日時 - 2003-11-28 19:27:44

ANo.23

moneyの計算式を一行にしてみました。
プログラムのお勉強には向きません。(^^;

money=((i<=4)? 150*i: 650) + ((5<i)? 100*(i-5): 0);

もしくは
money=((i<=5)? 150*i: 150*5) + ((5<=i)? -100:0) + ((5<i)? 100*(i-5): 0);

投稿日時 - 2003-11-28 18:59:06

ANo.22

5度目の投稿になります。

> if(i < 5){
> money = i * 150;
> }
> else if(i == 5){
> money = 5*150 - 100;
> }
> 5*150のところを上で使ったmoney(=i*150)に置き換えて考えたいんです。

#2で答えてますが、「上で使ったmoney」とありますが、elseに入る時には使ってないです。
なので置き換えてもmoneyは初期値、もしくはそれ以前に初期化した値しか入ってません。
もしかしたら貴方の悩んでいる個所は「if文の考え方」以前のプログラムの考え方が間違っているかもしれません。
ここで答えている人たちは私も含めてプログラムを書ける人たちで、プログラムを理解した上での回答しかできないので
あなたの理解度が分からない以上、これ以上よい回答は得られないと思います。
「まず、プログラムというのは~」・・・とまで親切に教えてくれる人なんていません。
この質問の趣旨がプログラムを覚えたいというところにあれば、自分で勉強してください。
仕様さえわかれば算数レベルです。コンパイラと根気さえあれば、一日で十分解決するでしょう。
プログラムに興味が無く、課題として出されて仕方なくこなすための質問であるなら
せめて、不明確な仕様の部分のフォローをしてください。
・「5本で100円引き」は5本のときだけか、5本以上のときも含むか、それか5本毎で100円ずつ引くのか?
・「5本を超えると」の表現は5本の時点で適応か、6本以上で適応か?
このあたりの情報さえあれば、ここで回答している方ならみんな、5分もあれば組めるレベルです。
(私みたいに凡ミスはあるでしょうけど)

投稿日時 - 2003-11-28 17:45:20

ANo.21

らあごです。連続投稿で申し訳ありませんが、
#17の補足の意図を汲んでも……

money = i * 150;
if ( i > 4 )
{
money = money - 100;    // \100引き
money = money - (i-5)*(150-100)  //1本当たり\50引き
}
としかできないんですが……

投稿日時 - 2003-11-28 13:36:38

ANo.20

らあごです。間違いがあったので訂正と…

ふと……過去の質問をみていたら……
2、レンタルビデオの本数を入力して、金額を出力する。
1本¥150。
5本で合計金額の¥100引き。
5本を超えると超えた分は1本¥100。
となっていましたが。。。。この問題でしょうか……
○○以降というと、○○がはいってしまいますので
問題が変わってしまいますが……
この問題をみると、6本以上のとき\100引きはあるのかな?

ちなみに、
#18の
  money = i*5; // 5本分の料金をいれておく

  money = i*150; // 5本分の料金をいれておく
の間違いです。

6本目以降100円引きがあるなら、
   money = money + (i-5)*100;
に-100を入れてください。

投稿日時 - 2003-11-28 13:28:12

ANo.19

#6,#10 です.まだ締め切られてないので

1本では150円 (1x150)
2本では300円 (2x150)
3本では450円 (3x150)
4本では600円 (4x150)
5本では600円 (4x150)-100+(1x100) 4本と同じ
6本では700円 (4x150)-100+(2x100)
7本では800円 (4x150)-100+(3x100)
8本では900円 (4x150)-100+(4x100)

となりますので else 以降

money = 4 * 150 - 100 + ( i - 4 ) * 100;

簡単にすると

money = i * 100 + 100;

です

投稿日時 - 2003-11-28 12:46:10

ANo.18

もし、元のプログラムの式をかえずにプログラムを正しくするなら

#include<stdio.h>
void main(void)
{
int i,money;

printf("借りる本数を入力 ---> ");
scanf("%d",&i);

if(i < 5)
  {
  money = i * 150;
  }
else{
  money = i*5; // 5本分の料金をいれておく
  if(i == 5)
   {
   money = money - 100; //5本だったら\100引き
   }
  else
   {
   money = money + (i-5)*100;
   }
  }
printf("合計金額は%d円です。\n",money);
}

でしょうか。。。インデントが…
6本の時100円割引はなくなるけど…いいのかな?

投稿日時 - 2003-11-28 12:18:45

ANo.17

No.4のarukamunです。

No.4の回答はできるだけプログラムをいじらずに間違っているところを訂正する形でアドバイスしました。

もし、自分が最初からコーディングしたとしたら、

#include<stdio.h>

void main(void)
{
  int i,money ;

/* エラーになるような範囲のiは入力されたくないので、仕様にはありませんが、101本以上借りないとしましたが、仕様がはっきりしていれば、この辺はもう少し考慮が必要です */
  do {
    printf("借りる本数を入力 ---> ");
    scanf("%d",&i);
  } while ( i < 1 || i > 100 );

/* とりあえず、単価150円で計算する */
  money = i*150 ;

/* 割引として計算する */
  if ( i > 4 ){
    money -= i*50 - 150 ;
  }

  printf("合計金額は%d円です。\n",money);
}

ちょっと、money -= i*50 - 150 ;の部分はトリッキーかも知れませんが、いかがでしょうか?

投稿日時 - 2003-11-27 22:18:19

補足

if(i < 5){
money = i * 150;
}
else if(i == 5){
money = 5*150 - 100;
}
5*150のところを上で使ったmoney(=i*150)に置き換えて考えたいんです。
else{
money = 5*150 - 100 + (i-5)*100;
}
の5*150-100の部分もmoney(=5*150-100)に置き換えて考えたいんです。
よろしくお願いします。

投稿日時 - 2003-11-28 11:37:15

ANo.16

仕様が明確でない部分があるので自信はありません。
こんなのではどうでしょうか?
1~4本:本数*150円
5本:5*150円 - 100円
6本以上:5本分の値段 + (本数-5)*100円
と解釈しました。

実行結果は4本のとき 600円
        5本    650円
        6本    750円
       20本   2150円  とでます


#include<stdio.h>
void main(void)
{
  int i, money, j, waribiki ;

  printf("借りる本数を入力 ---> ");
  scanf("%d",&i);

  if (i < 5) {
    j = i ;
    i = 0 ;
    waribiki = 0 ;
  }
  else {
    j = 5 ;
    i = i - 5 ;
    waribiki = 100 ;
  }

  money = (j * 150 - waribiki) + (i * 100) ;

  printf("合計金額は%d円です。\n",money);
}

投稿日時 - 2003-11-27 17:58:29

ANo.15

>> こんなのはどうかな?
>→意味がわかりません。
俺にいってるのかな?
こんな考え方(書き方)もあるかなぁという事ですが……
もちっと書くと
main()
{
int i,j,money;

printf("借りる本数を入力 ---> ");
scanf("%d",&i);

j=money=0;
while(j<i){
money +=150
if ( j==4 )   // 5本の時
money -=100;  //5本目から\100ならここは150
if (j>4)
money -=50;
j++;
}
printf("合計金額は%d円です。\n",money);
}
としたほうがきれいかな…
if でなくて case のほうがきれいかなぁ

投稿日時 - 2003-11-27 17:27:13

ANo.14

> こんなのはどうかな?
→意味がわかりません。

投稿日時 - 2003-11-27 16:01:48

ANo.13

ちょっと茶々いれ
こんなのはどうかな?
for(j=0;j>i;j++)
{
money = money + 150
if (j>=5)
money = money - 50;
if (j=5)
money = money -50;
}

仕様書の書き方とは違いますが、結果は同じになりますよね……
5本目以降一本当たり50円引き
但し5本目は100円引き(もう50円引き)
と読み替えたかきかたです

投稿日時 - 2003-11-27 15:53:03

ANo.12

あ、すいません、、、問題読み違えてました…。
仕事片手間に回答するもんじゃないですね…。

> 専門家やら経験者やらがこれほど集まって間違いだらけの回答…(^^;
これは私のこととして肝に銘じます…。

しかし
> 5本借りると100円引き。
> 5本を越えると5本目以降は1本100円。
この条件は同時に満たされるのでしょうか?
また10本借りた時は2回目の「100円引き」はあるのでしょうか?
その仕様が疑問ではありますが
同時に満たされる、かつ5本毎に100円引きというのであれば

if (i<5){
 money = i * 150;
}else{
 money = ( 5 * 150 ) + ((i-5) * 100) - (100*((i-(i%5))/5));
}

もしくは
int j;
for(j=0;j<i;j++){
 if (j<4){
  money = money + 150;
 }else{
  money = money + 100;
 }
 if (i%5==0){
  money = money -100;
 }
}

(もう、PG引退したほうがいいかもなぁ…。)

投稿日時 - 2003-11-27 15:41:15

ANo.11

#2です…。#5の訂正も間違ってたようで…。
しかし、専門家やら経験者やらがこれほど集まって間違いだらけの回答…(^^;
ちょっと苦笑いしてしまいました。
(そういう私もコレで飯食ってるはずなのに…w)

正解(今度こそ)は
money = (i*150) + (i-4)*100;
でしょうか。

でも私はこの課題があったら個人的には
------------
int j;
money = 0;
for (j=0;j<i;j++){

money = money + 150;
if (j>4){
money = money -100;
}

}
------------
こう組んでしまうでしょう。
実際の手順と処理順が等しいのでこうすれば保守する人もわかりやすいかと。
演算回数が増えるので、時と場合によりけりですが。

投稿日時 - 2003-11-27 15:10:17

ANo.10

#6 です,間違いました

else if(i == 5){
money = money - 100;
}
else{
money = money + (i-5)*100;
}

の部分を下記に置き換える


else {
money = 4 * 150 - 100 + ( i - 4 ) * 100;
}

に訂正して下さい

投稿日時 - 2003-11-27 14:34:37

ANo.9

ああっ、#8さんまで・・・
#4さんの後半のが正解。

投稿日時 - 2003-11-27 14:34:02

ANo.8

iに具体的な数字を入れて考えるといいでしょう。

まずi=5本だったとします。
すると・・・
i==5の文しか実行されません。
つまりMONEYは-100円です。
あくまでも5本でかける150円払った上で100円引きなんですから、
i*150-100
ですかな・・??
となります。
5本より大きい場合も
4本は150円それ以降を100円と考えて
4*150+(i-4)*100
でいいんじゃないでしょうか?

投稿日時 - 2003-11-27 14:29:33

ANo.7

○ money = (4*150) + (i-4)*100;
あぁ・・・発想はすごいっ!と思ったらi=5の時違わないですか?

投稿日時 - 2003-11-27 14:23:51

ANo.6

else if(i == 5){
money = money - 100;
}
else{
money = money + (i-5)*100;
}

の部分を下記に置き換える

else {
money = 5 * 150 - 100;
if(i > 5){
money = money + (i-5)*100;
}
}

理由は,5本以上の時,100円引きされない

投稿日時 - 2003-11-27 14:23:23

ANo.5

#2です。失礼しました。間違いです。

× money = (i*150) + (i-5)*100;
○ money = (4*150) + (i-4)*100;

投稿日時 - 2003-11-27 14:20:19

ANo.4

まちがっているのは、if-else文のところでのmoneyの扱い方ですね。
else ifやelseで式の右辺にmoneyがありますが、この変数には値が設定されていません。
また、5本目以降は1本100円ではなくて、6本目以降は1本100円ですよね。

#include<stdio.h>
void main(void)
{
int i,money;

printf("借りる本数を入力 ---> ");
scanf("%d",&i);

if(i < 5){
money = i * 150;
}
else if(i == 5){
money = 5*150 - 100;
}
else{
money = 5*150 - 100 + (i-5)*100;
}
printf("合計金額は%d円です。\n",money);
}

とりあえず、解りやすいようにしましたが、手計算出来る部分は出来るだけ計算しておくことが望ましいので、

#include<stdio.h>
void main(void)
{
int i,money;

printf("借りる本数を入力 ---> ");
scanf("%d",&i);

if(i < 5){
money = i * 150;
}
else if(i == 5){
money = 650 ;
}
else{
money = i * 100 + 150 ;
}
printf("合計金額は%d円です。\n",money);
}

投稿日時 - 2003-11-27 14:19:20

ANo.3

> どこが間違ってるでしょうか??

ほとんどすべて間違っています。
もう一度最初から考えましょう。

投稿日時 - 2003-11-27 14:18:38

ANo.2

#include<stdio.h>
void main(void)
{
int i,money;

//変数初期化
i=0;
money=0;

printf("借りる本数を入力 ---> ");
scanf("%d",&i);

// 本数が5本未満の場合
if(i < 5){
money = i * 150;
}
// 本数が5本以上の場合
else{
money = (i*150) + (i-5)*100;
}
printf("合計金額は%d円です。\n",money);
}

-------------
アドバイス
1) 変数は初期化すること。
2) if文の考え方の見直し。

<処理1>
if (条件){
<処理2>
}else{
<処理3>
}
<処理4>

条件が真の場合は<処理1><処理2><処理4>
条件が偽の場合は<処理1><処理3><処理4>

投稿日時 - 2003-11-27 14:18:24

ANo.1

moneyはどこで初期化されてますか?
money-100
のmoneyの値は決まってますか?

投稿日時 - 2003-11-27 14:07:28

補足

if(i < 5){
money = i * 150;
}
のmoneyを
else if(i == 5){
money = money - 100;
}
のmoney-100のmoneyに当てはめて考えたいのです。
お願いします。

投稿日時 - 2003-11-28 11:25:38