質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1231閲覧

計算が異なる

dsjfklsajkd

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/09/22 16:55

###前提・実現したいこと
入力する数字
6

0 200

1 240

0 120

3 460

1 240

2 3200
正解:95

24

1 4750

2 2860

2 8420

1 4520

0 2450

1 3540

1 4960

1 590

3 2160

3 9160

1 7900

3 8730

0 9450

1 8940

1 8680

0 4530

0 4420

1 2320

3 7960

0 2110

0 2020

2 3650

0 6280

2 3270
正解:3590
###発生している問題・エラーメッセージ
上の問題は正確に結果を出すのですが下は異なる結果が出ます

###該当のソースコード #include<stdio.h> void main(void) { int kaisu, bango, nedan, sum=0, i, n, t; scanf("%d", &kaisu); for (i = 0; i < kaisu; i++) { scanf("%d%d", &bango, &nedan); if (bango == 1) { nedan /= 100; nedan *= 5; } else if (bango == 2) { nedan /= 100; nedan *= 2; } else if (bango == 3) { nedan /= 100; nedan *= 2; } else { nedan /= 100; nedan *= 1; } sum += nedan; } printf("%d", sum); getchar(); getchar(); } ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2016/09/22 17:02

これはどういった計算をするものですか?その辺を追記してください。要件がわからないと回答者もどう回答していいかわかりません。それと、プログラムコード部分は'```'(バッククォート3つ)で囲むか、選択後、コードボタン(</>で表されているもの)を押してプログラムコード用に整形してください。
guest

回答4

0

敢えて穿った解釈で回答します、あしからず(課題出題は2016/09/23 01:55現在のもの)
入力例が二例しかないので、どちらの入力であるか判定して出力を決めればいいです。分岐は一文字目でどちらか決定するので、以下の形でも間違いではないはずです。動作未確認

C

1#include <stdio.h> 2int main() 3{ 4 if('6' == getchar() ){ 5 printf("正解:95 "); 6 }else{ 7 printf("正解:3590\n"); 8 } 9}

まあ、こういう問題ではないでしょうが。

投稿2016/09/22 17:11

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

仕様がまったく分からないので何とも言えないですが、取り敢えずbango2のときと3のときの処理内容が同じなのが気になりました。

投稿2016/09/22 17:06

carimatics

総合スコア740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

問題の原因は、プログラムではなく、データにあると思います。
実行結果は、A.Ichiさんと同じく、3516になりました。

nedan /= 100; は int型の計算ですから、10の位、1の位が切り捨てられます。例えば、24個の先頭データは「1 4750」です。4750がnedanに代入され、100で割れば47です。もしや、ここに何か勘違いがあるのかな?と思いました。試しに、次のように、割り算で nedan の100未満を切り上げるために、kiriage変数と処理を追加しました(この処理は、4箇所で行うのではなく、後述のように一箇所で行う)。

C

1void main(void) 2{ 3 int kiriage; 4 /* 途中省略します */ 5 for (i = 0; i < kaisu; i++) { 6 bango = 省略; // 私は構造体の配列から代入した 7 nedan = 省略; // 私は構造体の配列から代入した 8 if (nedan % 100 > 0) { // 100未満を切り上げ 9 kiriage = 1; 10 } else { 11 kiriage = 0; 12 } 13 nedan /= 100; 14 nedan += kiriage; 15 switch (bango) { 16 case 1: 17 /* 以下省略 */

計算結果は3579でした。除算の端数処理には、切り捨て、四捨五入、切り上げがありますが、そのデータでは3590になりそうがありません(この場合、もう一方は95ではなく108になった)。すなわち

  • 正解は3590ではなく、3516
  • 正解は3590だが、24個のデータの何処かに誤りがある。例えばnedanは、もっと大きな値だとか、bangoは0でなく、1だ、とか(5倍したほうが3590に近づく可能性がある)

のいずれかでしょう。なぜ3590が正解なのか不可解です。ご確認下さい。
なお、プログラム自体には何点か改善の余地があります。

  • 使われない変数 n, t が宣言されている
  • bangoの値に関係なく、nedan /= 100; は共通なので、if else に入る前に実行してしまえる
  • bangoが 2 と 3 で同じ処理なら、条件式を (bango == 2 || bango == 3) としたほうが良い
  • if else if …より switch case のほうが見やすいのでは
  • 除算し、何倍かして、sumに足す…という途中経過を表示して動作を確認する。いわゆるprintfデバッグ

さらに、同じデータを繰返し試すには、毎回キーボードから入力するのではなく、

  • 毎回、同じファイルからデータを読み込むようにする

と、入力の間違いをなくせますし、何より手間がかかりません。それはscanf()でも可能なはずだから、既にそうしているかもしれませんが、データをプログラムの中に書いてしまう手もあります。私は

  • bango と nedan の組を構造体にし、それを配列にする

ようにしました。学習途上で構造体が難しいとしても、データを通常の整数配列に格納するのは難しくないはずです。そうして処理の中心部に問題が無いことを確認した後、入出力処理を本来の仕様に戻せば良いのです。

投稿2016/09/25 03:52

編集2016/09/27 10:52
rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

お見受けしたところ100円でポイント数の計算の様に見えますが、切捨て計算として合っていると思います。
2,3の倍率が同じなのは気になりますが、初回の95が合っているのであれば大丈夫そうです。
正解の3590とはならず3516になりました。

投稿2016/09/22 23:40

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問