課題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ksa

課題

#1

投稿記事 by ksa » 11年前

大学の課題なのですがどうしてもわからないものがありましたので力をお貸しいただけないでしょうか

scanfを用いて正の整数を入力し、その数値中の特定の数字を置換するプログラムを作成し、置換結果を出力しなさい。

実行例
数を入力してください
>1020304050 (入力)

対象の数を入力してください
>0 (入力)

置換先の数を入力してください
>9 (入力)

結果:1929394959

というものです。予習などもしているのですがさっぱりわかりません、よろしくおねがいします。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 課題

#2

投稿記事 by beatle » 11年前

では、まず簡単なプログラムから作ってみましょう。与えられた課題に結びつく簡単な問題を出しますので解いてみて下さい。
問題1:文字列「1929」を出力せよ。

これが出来たら、次の問題。
問題2:scanfで文字列を読み込み、それをそのまま出力せよ。

もし問題1でも詰まるのなら教科書を最初から読み返す作業が必要でしょう。

box
記事: 2002
登録日時: 13年前

Re: 課題

#3

投稿記事 by box » 11年前

何だかどこかで見たことがある話だなぁ、と思ったら、似たような話が
別の掲示板にありました。
あちらでは、入力を促すメッセージが英語だったり、
プログラムの仕様として配列を使ってはいけない、というような条件があったりしますが、
まあ本質的なところは同じでありましょう。

http://okwave.jp/qa/q8105916.html
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Haru
記事: 2
登録日時: 11年前

Re: 課題

#4

投稿記事 by Haru » 11年前

大雑把ですが...

1.scanfによる整数の入力を計3回行う。
2.sprintfもしくはitoaで入力した整数を文字列に変換。
3.初めに入力された文字列に対して2番目に入力された文字列と一致するか配列の初めから順番に確認する。
4.もし、一致した場合その場所の配列を3番目に入力された文字列と入れ替える。
5.入れ替え終了後、atoiを用いて整数に変換して返値として出力

どうでしょうか

box
記事: 2002
登録日時: 13年前

Re: 課題

#5

投稿記事 by box » 11年前

ksa さんが書きました: 正の整数を入力し
という条件があります。
beatle さんが書きました: 問題1:文字列「1929」を出力せよ。
問題2:scanfで文字列を読み込み、それをそのまま出力せよ。
文字列を使ってしまうと、減点されそうな気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 課題

#6

投稿記事 by box » 11年前

Haru さんが書きました: 5.入れ替え終了後、atoiを用いて整数に変換して返値として出力
整数に変換する必要性はさほどないような気がします。
文字列のまま出力したり戻り値として返したりして何ら問題ないと思います。

いちばん最初に入力を受けるところは「正の整数」というしばりがあるようですけれど。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Haru
記事: 2
登録日時: 11年前

Re: 課題

#7

投稿記事 by Haru » 11年前

box さんが書きました:
Haru さんが書きました: 5.入れ替え終了後、atoiを用いて整数に変換して返値として出力
整数に変換する必要性はさほどないような気がします。
文字列のまま出力したり戻り値として返したりして何ら問題ないと思います。

いちばん最初に入力を受けるところは「正の整数」というしばりがあるようですけれど。
確かにそうかもしれませんね。
ただ入力が正の整数で、それに対する出力が正の整数でないのは違和感があったので変換したほうがいいかと考えました。
また、特に難しいプログラムでもないので、なおさらその傾向は強まるかと。

それと、beatleさんのレスは課題の答えを直接教えようとはしてないとおもいます。(違っていたらすみません)
私には課題を考えさせようとするための良い文章であると思えますが...

ただの屍のようだ

Re: 課題

#8

投稿記事 by ただの屍のようだ » 11年前

while(整数/10)桁数++; //*デフォルトは1;
int before = 置き換える数字,after = 置き換え先数字;
for(int i=桁数;i;i--) if((今の桁=整数/10のi乗) == before) 整数 = 整数 - 今の桁*10のi乗 + after*10のi乗;

脳内イメージだけで組んでみた、あくまで整数として扱ってるし、これで満点ですか?

ただの屍のようだ

Re: 課題

#9

投稿記事 by ただの屍のようだ » 11年前

今の桁を出す式が間違ってました。
訂正: 今の桁 = 整数/10のi乗%10

non
記事: 1097
登録日時: 13年前

Re: 課題

#10

投稿記事 by non » 11年前

当事者はどこ行った?
non

ksa

Re: 課題

#11

投稿記事 by ksa » 11年前

遅くなってしまい申し訳ありません、多数の返信ありがとうございました。
今日時間が取れると思いますので参考にさせていただきたいと思います。

書き忘れてしまっていたのですが、恐らくは直近の授業で扱ったif for while文を主として組めるのだと思います。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 課題

#12

投稿記事 by みけCAT » 11年前

http://judge.u-aizu.ac.jp/onlinejudge/d ... sp?id=0570
この問題では、10の500乗までの整数を扱います。
もちろん、こんな整数はint型にもlong long型にも入りませんので、文字列として扱います。
このような表現もあるので、整数を文字列として読み込んでもいいのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 課題

#13

投稿記事 by box » 11年前

そりゃまあ文字列で受けた方がわかりやすいのかもしれませんが、
ksa さんが書きました: scanfを用いて正の整数を入力し
この条件が明記してある以上、それに反することはできないような気がするのであります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

non
記事: 1097
登録日時: 13年前

Re: 課題

#14

投稿記事 by non » 11年前

本人の明確な回答を待っているのだけど、ksaさんわかっているのかな?
ksa さんが書きました:恐らくは直近の授業で扱ったif for while文を主として組めるのだと思います。
この文章から推察すると、まだ制御構造までしか習っていないので、関数や配列、文字列はこの後という気もします。
別のフォーラムにあった、再帰なんてわかるはずがない。

しかし、ただの屍のようだ さんが示している内容に食いついてくればそう確信しますがね。
non

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 課題

#15

投稿記事 by みけCAT » 11年前

scanfの%dは整数を入力するものであり、正の整数という縛りはありません。
確かに%xなら(16進数の)正の整数の入力を受けられますが、
それよりも%sで入力して、後の処理で正の整数になっているかチェックしたほうがいいのではないでしょうか?

さっき提示した問題にも
入力は 3 行からなり,1 行に 1 つずつ正の整数が書かれている.
と書いてあり、入力するものは明らかに正の整数です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 課題

#16

投稿記事 by ISLe » 11年前

ksaさんの課題では、配列を使用して良いのかどうかをはっきりさせるべきでしょう。

配列が使用禁止ならば、文字の配列である文字列を使うのも禁止でありましょう。

かずま

Re: 課題

#17

投稿記事 by かずま » 11年前

Haru さんが書きました: ただ入力が正の整数で、それに対する出力が正の整数でないのは違和感があったので変換したほうがいいかと考えました。
1020304050 の 0 を 9 に変えて、1929394959 を出力する場合は
いいのですが、
2030405060 の 0 を 9 に変えて、2939495969 を出力する場合、
2030405060 は int の範囲に収まっていても、
2939495969 は 2147483647 を超えているので、
ダメということもあり得ます。

さて、課題には、「scanf を用いて」とあるだけで、
「scanf の "%d" を用いて」とはなっていませんから、
文字として入力してもよいのではないでしょうか?

配列を使ってはいけないという縛りがあるのかないのか
わかりませんが、あったほうが面白いので、次のような
冗談プログラムを書いてみました。

コード:

#include <stdio.h>
#include <stdlib.h>
 
struct T { char c; struct T *next; };

void print(const struct T *p, char a, char b)
{
    if (!p) return;
    print(p->next, a, b);
    putchar(p->c == a ? b : p->c);
}

void proc(struct T *p)
{
    struct T t;
    if (scanf("%c", &t.c) != 1) exit(1);
    if (t.c == '\n') {
        char a, b;
        printf("対象の数を入力してください\n>");
        if (scanf(" %c", &a) != 1) exit(1);
        printf("置換先の数を入力してください\n>");
        if (scanf(" %c", &b) != 1) exit(1);
        print(p, a, b);
        putchar('\n');
    } else {
        t.next = p;
        proc(&t);
    }
}

int main(void)
{
    printf("数を入力してください\n>");
    proc(NULL);
    return 0;
}
配列の代わりにリストを使ってみましたが、malloc は使っていません。

閉鎖

“C言語何でも質問掲示板” へ戻る