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

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

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

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

Q&A

解決済

2回答

846閲覧

c言語の課題が解けなくて困っています

fukario

総合スコア1

C

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

0グッド

1クリップ

投稿2021/07/08 10:13

編集2021/07/08 14:46

大学で出された課題が解けなくて困っています。
課題文は次の通りです。

変数amountには貯金の合計額(最初は0円)が入っている.
以下のような3回貯金できるプログラムを作成せよ.
また①②の2つの処理をそれぞれユーザ定義関数として定義して,これを使うようにせよ.
①一回の貯金の処理
・現在の貯金額の表示
・ 貯金額の問い合わせと入力受付
・入金処理を行い、処理後の貯金額を円単位で整数として返す
②金額の表示(金額を整数で受け取って,?万?円表示.例:64万5120円)
・この金額の表示関数は,1つ目のユーザー定義関数でも使用する.
金額の入力は千円単位とすること(例:1.5 = 1500円).

現在の貯金高は,0万0円です.
今回はいくら貯金しますか?(単位:千円):10.5/貯金する金額はscanfを使って入力できるようにする/

現在の貯金額は,1万500円です.
今回はいくら貯金しますか?(単位:千円):0.03/上と同様に/

現在の貯金額は,1万530円です.
今回はいくら貯金しますか?(単位:千円):100.0/上と同様に/

全部で11万530円貯まりました.
よくがんばりました.

###自分のコード(うまく動作しない)

#include <stdio.h> int cal_man(int amount) { int man; man = amount / 10000; return man; } int cal_en(int amount) { int en; en = amount % 10000; return en; } void display_saving(int amount) { int en, man; double saving; amount = amount + 0; man = cal_man(amount); en = cal_en(amount); printf("現在の貯金額は、%d万%d円です.\n", man, en); printf("今回はいくら貯金しますか? (単位:千円) :"); scanf("%lf", &saving); amount = amount + (saving * 1000); } int main(void) { int i, man, en, amount = 0; for (i = 0; i < 3; i++) { display_saving(amount); } return 0; }

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

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

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

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

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

y_waiwai

2021/07/08 10:16

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください また、うまく動かないとは、どういうふうに動くんでしょうか
jimbe

2021/07/08 10:21

一応、teratail に課題を質問して良いのかどうかをお調べになっては如何でしょうか。
fukario

2021/07/08 14:48

プログラミングを学びだして1ヶ月しか経っておらず、右も左もわからないので丁寧に説明してもらえるとありがたいです。
退会済みユーザー

退会済みユーザー

2021/07/09 00:12 編集

エンジニアの問題解決のためのサイトで、そういう用途のサイトではないです。 課題の疑問なら、教官なり先生なりに聞きましょう。 [推奨していない質問] https://teratail.com/help/avoid-asking
guest

回答2

0

ベストアンサー

diff

1-void display_saving(int amount) 2+int display_saving(int amount) 3 4 amount = amount + (saving * 1000); 5+ return amount; 6 7- display_saving(amount); 8+ amount = display_saving(amount);

この 3行を修正して、あとは、「よくがんばりました.」ですね。
なぜこの修正が必要なのかをよく考えてコメントに書いてください。

投稿2021/07/08 15:47

kazuma-s

総合スコア8224

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

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

kazuma-s

2021/07/08 17:14 編集

なぜ、元のコードが思い通りに動かなかったのか、 なぜ、修正したコードが思い通りに動くのかを理解しないと解決ではありません。 分からないのなら、説明しますから、どこが分からないのかを具体的に書いてください。
退会済みユーザー

退会済みユーザー

2021/07/09 00:23

課題の直接的な回答を示すのは非推奨質問の助長に繋がり悪影響があると考え、低評価しました。
BeatStar

2021/07/09 00:32

同上。 直接的な回答より、曖昧な回答の方がいいかもしれません。(流れで説明するとか)
guest

0

まず基礎から出来ていない。

関数の基本構造は ( "■" を半角スペースと見立てて )

関数の型■関数名(引数){ // 何らかの処理 return■戻り値; }

です。

関数の型 = 戻り値の型

です。

そもそも関数は『呼び出し側(main関数とか)』から「こういう処理をしてくれ」と引数(対象データ)を渡されて処理し、呼び出し側にその結果を返す

この呼び出し側に返すデータのことを戻り値と言い、これを返すことを、

戻り値を返すと言います。

ですが、質問にあるコードのcal_en関数やcal_man関数は「戻り値を返していない」です。

returnなんちゃらが戻り値です。


[追記1]

ご自分のコードを読んでください。

コードを読むときは、「一行レベルで、この行が何をしているのかを考えながら読む」です。

main関数だけに着目したら、

int main(void) {   // 変数宣言 int i, man, en, amount = 0;   // 3回繰り返す for (i = 0; i < 3; i++) {     // display_saving関数を呼び出す display_saving(amount); }   // 戻り値を0として返す return 0; }

的な感じで。

これを現実世界で手作業でやってみる。(display***を3回繰り返すとかそういうのを)
脳内でもいいです。

関数を呼び出している所はその関数内にも潜り込む。

C言語の場合はmain関数から始まります。

なので main関数 -> main関数内で呼ばれた関数 -> その関数から呼ばれた関数 ...

のように潜っていきます。

そしてその処理を追う。

変数とかが使われているのならその値を考えながら読む。

i = 0 のときどうなるか。i = 1 のときどうなるか。i = 2 のとき... とかみたいに。

具体的な数字や文字列等のデータを入れて考えてみる。

そうするとロジック違反をしていれば気づくはずです。

つまりデバッグぐらいはしましょうです。

投稿2021/07/08 10:54

編集2021/07/09 00:34
BeatStar

総合スコア4962

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

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

fukario

2021/07/08 14:31

ありがとうございます!戻り値の入力をすっかり忘れてました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問