C言語の練習問題で文字列を反転して並び替える関数を作る処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
samusu0905
記事: 336
登録日時: 6年前

C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#1

投稿記事 by samusu0905 » 6年前

件名に書いたとおりなんですが、文字列abcを反転してcbaに並び替える関数を作る処理ってどうやれば宜しいですか?ヒントかアドバイスをお願いします。
まだコードを書いてません。関数を作らずに文字列を反転させる処理はできますが、関数を作って関数に文字列を反転させる処理をやったことがありません。
多分、この練習問題は応用問題をさせようとしていると思います。
私も色々と考えましたが、うまくいきそうにないです。

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#2

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

samusu0905 さんが書きました:関数を作らずに文字列を反転させる処理はできますが
では、まずそのコードを書いて貼ってください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

hide

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#3

投稿記事 by hide » 6年前

では、ただ単に作った関数を呼び出すだけのコードはかけますか?

更に、文字列を受け取ってそのまま返すだけのコードはかけますか?


頭のなかでこねこねするよりもプログラムとして書くと気付くことがたくさんあるはずなので
まず、出来る部分をやってみましょう。

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#4

投稿記事 by samusu0905 » 6年前

みけCATさん>>回答有難うございます。
了解しました。ではコードを載せます。

コード:

#include <stdio.h>
#include <string.h>


int main()
{
	int a=0, b=0, c=0;
	char str[] = "abc";

	printf("反転前:%s\n", str);

	str[0] = 'c';
	str[1] = 'b';
	str[2] = 'a';

	printf("反転後:%s\n", str);

	while( c == 0)
	{
		scanf("%c", &c);
		getchar();
		return 0;
	}
}
これが関数を作らずに反転させる処理です。
これらの処理を関数を使って応用して処理を行う。
それが練習問題で問われている事なんじゃないかと思われます。

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#5

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

samusu0905 さんが書きました:了解しました。ではコードを載せます。
(略)
これが関数を作らずに反転させる処理です。
これらの処理を関数を使って応用して処理を行う。
それが練習問題で問われている事なんじゃないかと思われます。
わかりました。
あくまで「文字列abcを反転してcbaに並び替える関数を作る処理」を作るのが課題であって、
「文字列defを反転してfedに並び替える」ことはできなくてもいいのですね。
だとしたら、strをそのまま関数に投げて、そこで結果を生成するだけです。
(だとしなくても、strのみを関数に投げて(引数として渡して)結果を生成できます)

コード:

#include <stdio.h>
#include <string.h>

void hanten(char str[]) {
    /* ここで結果を生成する */
}

int main()
{
    int a=0, b=0, c=0;
    char str[] = "abc";
 
    printf("反転前:%s\n", str);

    hanten(str);

    printf("反転後:%s\n", str);
    return 0;
}
これでほぼ答えを書いてしまいましたね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1617
登録日時: 7年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#6

投稿記事 by usao » 6年前

オフトピック

コード:

    str[0] = 'c';
    str[1] = 'b';
    str[2] = 'a';
さすがに冗談なのだろうと思うけど,
これは 「並び替え」 と称される処理ではないよね.
「aの値を初期値の倍にする」とかいうのを

コード:

int a = 10; //初期値
a = 20;  //倍にしました!OK!
みたいな…

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#7

投稿記事 by samusu0905 » 6年前

みけCATさん>>回答有難うございます。
わざわざすみませんね。
確かにほぼ回答ですね。とりあえずコード参考にして書いてみます。

usaoさん>>回答有難うございます。
>これは「並び替え」と称される処理ではないよね.
このように仰ってますが、教材には実際にそのように書いてありましたよ。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#8

投稿記事 by asd » 6年前

オフトピック
その教材が何物かわからないのであくまで推測ですが、その教材の例はあくまで説明のために文字列は決め打ち、文字数3文字固定の例を書いているだけで、
そのうち文字列読み込みや繰り返し構文を使って、文字列を読み込ませたり文字数を可変に変えて一般化した処理の説明が出てくるのだと思います。

…そうでないと別の練習問題で「文字列を1000文字にしてやってみよう」なんて出たときに、
str[0]~str[999]に代入する処理が書かれることになってしまいますから(ノ∀`)
さらに文字列が可変になった時点でハードコーディングはできなくなりますから。
► スポイラーを表示
Advanced Supporting Developer
無理やりこじつけ(ぉ

初級者
記事: 200
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#9

投稿記事 by 初級者 » 6年前

とりあえず、その課題「だけ」はクリアできるコード。
他の文字列を反転させたいときにどうするかは、知らない。

コード:

#include <stdio.h>

void hanten(char *s)
{
   s[0] = 'c';
   s[1] = 'b';
   s[2] = 'a';
}

int main(void)
{
   char str[] = "abc";

   printf("反転前:%s\n", str);
   hanten(str);
   printf("反転後:%s\n", str);
   return 0;
}

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#10

投稿記事 by samusu0905 » 6年前

みけCATさん>>こんな感じでコードを書きました。

コード:

#include <stdio.h>

int rranges(char str[]);

int main()
{
	int a=0, b=0, c=0;
	char str[] = "abc";

	printf("反転前:%s\n", str);

	rranges(str);

	printf("反転後:%s\n", str);

	while( c == 0)
	{
		scanf("%c", &c);
		getchar();
		return 0;
	}
}


int rranges(char str[])
{
	//char c;
	str[0] = 'c';
	str[1] = 'b';
	str[2] = 'a';

	return str[3];
}
このコードが果たして適切かどうかわかりませんが。
実行結果は
abc→cba
このように並び替えは出来ました。

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#11

投稿記事 by samusu0905 » 6年前

asdさん>>回答有難うございます。
>そうでないと別の練習問題で「文字列を1000文字にしてやってみよう」なんて出たときに、
>str[0]~str[999]に代入する処理が書かれることになってしまいますから
それはわかってますよ。では私がやろうとしている課題の答えを書いてもらえませんか?
これ以上時間かけたくないので。
それに後もう少しでうまくいきそうなんですよ。どうすればいいですか?「自分で考えろ」って言いたいんですか?

初級者さん>>それは私が書いたコードと同じですよ。
そのコードでもう一工夫が必要なんですが、私にはできないんです。

初級者
記事: 200
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#12

投稿記事 by 初級者 » 6年前

では、反転したい文字列が

"abcdefghijklmnopqrstuvwxyz0123456789@+-*/;:!#$%&'()\<>?[]{}"

だったら、どうしましょうか。

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#13

投稿記事 by samusu0905 » 6年前

その場合は
str = "-------";みたいな感じでコードを書けばいいのでは?
(あるいはstr = '-----';かな)

アバター
amehirune
記事: 181
登録日時: 7年前
住所: どっか
連絡を取る:

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#14

投稿記事 by amehirune » 6年前

初めまして。素人考えですが、こういうのはどうでしょうか?

1、まず反転させる文字列の文字数を取得する。
(for文を使って1文字ずつ調査。ヌル文字が出てくるまで繰り返す)
2、文字数を変数aとする。
3、反転用文字型配列に、文字列[a]をいれる(追加)。
4、aの値を1減らす。
5、3→4の繰り返し。aがゼロになったら終了。

という者ですが…。
考えが間違っていたら申し訳ありません><

編集:入れる=代入というイメージがついてしまいそうなので、(追加)←連結という意味の文章を追加しました。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#15

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

samusu0905 さんが書きました:このコードが果たして適切かどうかわかりませんが。
適切とは言えませんが、致命的な間違いは無さそうです。
・18行目: scanfの%cはchar*型の引数を要求しますが、&cはint*型です。
 int型のサイズがchar型のサイズ以上ならば、バッファオーバーランにはなりません。
・rranges関数が戻り値を返す必要は、今のところないはずです。
・32行目でstr[3]を返しており、ぱっと見範囲外のように見えますが、
 ここは範囲外ではなく、'\0'が入っているはずなので大丈夫です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#16

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

samusu0905 さんが書きました:では私がやろうとしている課題の答えを書いてもらえませんか?
これ以上時間かけたくないので。
それに後もう少しでうまくいきそうなんですよ。どうすればいいですか?「自分で考えろ」って言いたいんですか?
この練習問題が載っている書籍/サイトなど(の後ろの方?)に模範解答は載っていないのですか?
確認してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

初級者
記事: 200
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#17

投稿記事 by 初級者 » 6年前

さっきの冗談コードじゃなくって、もっとまともなのを…。

コード:

#include <stdio.h>
#include <string.h>

void hanten(char *s)
{
   int i, j;

   for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
       char t;

       t = s[i], s[i] = s[j], s[j] = t;
   }
}

int main(void)
{
   char str[] = "abc";
   char str2[] = "abcdefghijklmnopqrstuvwxyz0123456789@+-*/;:!#$%&'()\\<>?[]{}";

   printf("反転前:%s\n", str);
   hanten(str);
   printf("反転後:%s\n", str);

   printf("反転前:%s\n", str2);
   hanten(str2);
   printf("反転後:%s\n", str2);
   return 0;
}

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#18

投稿記事 by samusu0905 » 6年前

解答はサイトに載っているんですが、コードではなく、「教材の中のプログラムの番号を参照」みたいな感じで書いてあったので、そのプログラムを探しましたが、そのプログラムの番号が何ページを示しているのか分からないんです。program82.cとか書いてありましたが、それに当てはまるページが無かったです。今は教材の第8章の最終問題をやってます。

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#19

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

「そのプログラムの番号が何ページを示しているのか」というのがよくわからないのですが、
『猫でもわかるC言語プログラミング』という書籍をお使いでしたら、
http://www.sbcr.jp/products/4797372786.htmlの下にある
『猫でもわかるC言語プログラミング 第3版』ソースコードと練習問題解答」でDLできるファイルの中の、
「NekoC_Answer/Chap08/program83/program83.c」がそれっぽい内容でした。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#20

投稿記事 by samusu0905 » 6年前

教材を参考にしてコードを打ち込んだらできました。
皆さんお世話になりました。特に、みけCATさん有難うございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#21

投稿記事 by softya(ソフト屋) » 6年前

自分に応用力や発想力を付けるために問題をやっているのか、単に答えが合っていればよいのかで話は変わりますが
では私がやろうとしている課題の答えを書いてもらえませんか?
これ以上時間かけたくないので。
それに後もう少しでうまくいきそうなんですよ。どうすればいいですか?「自分で考えろ」って言いたいんですか?
課題じゃないのなら、何のためにやっているか考えたほうが良くないですか? 自分で自分の発想力を広げるチャンスを潰している気がします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#22

投稿記事 by asd » 6年前

samusu0905 さんが書きました:asdさん>>回答有難うございます。
>そうでないと別の練習問題で「文字列を1000文字にしてやってみよう」なんて出たときに、
>str[0]~str[999]に代入する処理が書かれることになってしまいますから
それはわかってますよ。では私がやろうとしている課題の答えを書いてもらえませんか?
これ以上時間かけたくないので。
スポイラー部分に書いておきましたが、それがあなたの本音ですね。
「プログラミングなんてどうでもいいから、動くプログラムを自分の代わりに書け。私は時間を無駄にしたくない。」
最初に書き込んだ時点であなたの過去の質問からまともに相手にするリスクがあることが明白でしたから
あえてオフトピックのみの書き込みにした次第です。
#回答者の方々が割いた時間は知ったこっちゃないですか?

苦言だけだとあれなのでさらに申し上げておくと、
アナタは何も分かってないですよ。
わかっていたらusaoさんのオフトピックに対して、
samusu0905 さんが書きました: usaoさん>>回答有難うございます。
>これは「並び替え」と称される処理ではないよね.
このように仰ってますが、教材には実際にそのように書いてありましたよ。
こんな返答はしないはずです。
(これは並べ替えではないという指摘に対して、教材に記載されている並び替え処理だと言い張ったわけです)
samusu0905 さんが書きました: それに後もう少しでうまくいきそうなんですよ。どうすればいいですか?「自分で考えろ」って言いたいんですか?
ご自分で考えるのは嫌なんですか?
何のためにあなたはプログラミングをなさっているのですか?

・プログラムを作りたいのですか?
・プログラムを動かしたいのですか?
・動くプログラムを眺めたいだけですか?
・プログラミングをしたつもりになりたいだけですか?
samusu0905 さんが書きました:教材を参考にしてコードを打ち込んだらできました。
皆さんお世話になりました。特に、みけCATさん有難うございます。
あと少しでうまくいきそうだったのに回答丸写しで解決したんですか?

いずれにせよ、使用している教材の回答はみけCATさんが提示しているので、
今後は何も考えずにそちらからコピペすればいいですよ。
そうすれば時間を無駄にせずに済みます。

ただしそれはプログラミングではなくコピペです。
プログラミングという観点からみると一切あなたの糧にはなりません。
Advanced Supporting Developer
無理やりこじつけ(ぉ

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#23

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

asd さんが書きました:いずれにせよ、使用している教材の回答はみけCATさんが提示しているので、
今後は何も考えずにそちらからコピペすればいいですよ。
そうすれば時間を無駄にせずに済みます。

ただしそれはプログラミングではなくコピペです。
プログラミングという観点からみると一切あなたの糧にはなりません。
一切糧にならない作業をしている=その分時間を無駄にしている と考えることもできますね。
samusu0905さんは自分が何がしたいのかをよく考え、それに向けて(効率的に)行動しようとするべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#24

投稿記事 by asd » 6年前

みけCAT さんが書きました:
asd さんが書きました:いずれにせよ、使用している教材の回答はみけCATさんが提示しているので、
今後は何も考えずにそちらからコピペすればいいですよ。
そうすれば時間を無駄にせずに済みます。

ただしそれはプログラミングではなくコピペです。
プログラミングという観点からみると一切あなたの糧にはなりません。
一切糧にならない作業をしている=その分時間を無駄にしている と考えることもできますね。
samusu0905さんは自分が何がしたいのかをよく考え、それに向けて(効率的に)行動しようとするべきです。
確かにプログラミングを効率的に学ぼうとする人ならそのような考えになってくれると思いますが…。

samusu0905さんが何をしたいのかはみなさんの問いに対する回答次第とは思いますが、今までの書き込みから本人にはプログラムの動作仕様を理解するつもりは毛頭なく、
動けばそれで満足なんじゃないでしょうか。
# プログラミングをしたいわけじゃないので、プログラミングの糧になることが時間の無駄だと言ってしまうわけで。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
usao
記事: 1617
登録日時: 7年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#25

投稿記事 by usao » 6年前

オフトピック
ゲームとかでも攻略情報の通りに「なぞるだけ」の作業を楽しむ人たちもいるみたいですし
そういうタイプ?
その感覚は全く理解できないけれども.

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#26

投稿記事 by samusu0905 » 6年前

皆さん返信遅れてすみませんでした。
まだC言語を学んで一年も経たないので、プログラミングの経験を積む途中です。
>動けばそれで満足なんじゃないでしょうか。
># プログラミングをしたいわけじゃないので、プログラミングの糧になることが時間の無駄だと言ってしまうわけで。

私はプログラムがただ動けばいいとは思ってません。そのような考えは全くありません。ですが、本当に
分からない問題が出てきたときに皆さんに色々とヒントやアドバイスを貰いたいだけです。

>・プログラムを作りたいのですか?
>・プログラムを動かしたいのですか?
>・動くプログラムを眺めたいだけですか?
>・プログラミングをしたつもりになりたいだけですか?
プログラムを作りたいが本音です。 そして、習得したプログラムをゲーム制作に役立てたいと思ってます。
動くプログラムをただ眺めたいだけなら,プログラムを作りたいとも思いませんよ。
ただ眺めるなんてつまらないですよ。

アバター
usao
記事: 1617
登録日時: 7年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#27

投稿記事 by usao » 6年前

……であれば,
「答えもそうなっていたので」
「答えの通りに書いたら動いたので」
といって終わらせるのでは何も得るものがない,という話が理解できそうなものですけど.

オフトピック
このトピックの表題を読めば,

・なにかしら文字列があります.
・(問題を簡単にするために文字数はN文字です,とかいうのがわかっている前提であっても最初はまぁよい)
・この文字列の文字の並びが逆順になるように,文字列の内容を入れ替える関数を書きなさい

といった話だと捉えるのが普通の感覚だと思います.
例えば

コード:

void InvertStr( char *str, size_t str_length )
{
  //ここの中身を考えよう!
}

void main()
{
  char str[100];  //※とりあえずこれが十分なサイズなのだと仮定した上で
  scanf( "%s", str );

  printf( "input : %s\n", str );
  InvertStr( str, strlen(str) );
  printf( "output : %s\n", str );

  return 0;
}
という感じの問題ですね.
「元がabcだから cbaってダイレクトに書けばOK」という内容だと捉えるのは,
何かが決定的にずれている ように思います.個人的に.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#28

投稿記事 by softya(ソフト屋) » 6年前

これなどゲームだとアイテムの並び替えなど操作に通じるすごく基礎的な練習問題です。
つまり、これを自分で考えつけないとしたらゲームを作るのは非常に困難だということです。
安易に妥協することで、考えるクセを付けることを排除しているようにしか見えないので、これを続けると段々と目的から逸れていくと思います。

プログラムとして大事な要素である「よく考える・アイデアをひねり出す」が嫌いなんじゃないかと思えてくるのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#29

投稿記事 by samusu0905 » 6年前

usaoさん>>
>「答えもそうなっていたので」
>「答えの通りに書いたら動いたので」
答え通りには書いてませんよ。というより、私が見たのは答えともいえませんから。むしろ、参考にして教材に載っているプログラムを自分なりに変えただけですよ。答えとは言えません。参考程度です。

softyaさん>>
確かにそうですね。文字を並び替えるプログラムを覚えておけば、アイテムの並び替えの際にとても便利ですね。

>プログラムとして大事な要素である「よく考える・アイデアをひねり出す」が嫌いなんじゃないかと思えてくるのです。
私はよく考えてアイデアをひねり出すのは好きなほうですよ。ただ、いくら考えてもアイデアが思いつかない
時がゲーム制作でもあります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#30

投稿記事 by softya(ソフト屋) » 6年前

>教材を参考にしてコードを打ち込んだらできました。
>皆さんお世話になりました。特に、みけCATさん有難うございます。

そのままじゃないのなら、そのコードを提示するのが掲示板のルールと成っています。
何処をどのように考えたコードなのか、コードが物語ってくれます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#31

投稿記事 by asd » 6年前

samusu0905 さんが書きました:皆さん返信遅れてすみませんでした。
まだC言語を学んで一年も経たないので、プログラミングの経験を積む途中です。
>動けばそれで満足なんじゃないでしょうか。
># プログラミングをしたいわけじゃないので、プログラミングの糧になることが時間の無駄だと言ってしまうわけで。

私はプログラムがただ動けばいいとは思ってません。そのような考えは全くありません。ですが、本当に
分からない問題が出てきたときに皆さんに色々とヒントやアドバイスを貰いたいだけです。
あえて強い言い方をさせていただければ、申し訳ありませんがその言葉は信用なりません。
ヒントやアドバイスをもらいたいだけのはずなのに私に対しての一つ目の回答が以下でした。
samusu0905 さんが書きました:asdさん>>回答有難うございます。
>そうでないと別の練習問題で「文字列を1000文字にしてやってみよう」なんて出たときに、
>str[0]~str[999]に代入する処理が書かれることになってしまいますから
それはわかってますよ。では私がやろうとしている課題の答えを書いてもらえませんか?
これ以上時間かけたくないので。
この書き込みは「時間をかけたくないから答えを出せ」以外の意味には取れませんでした。
とてもプログラムを勉強しようという人の言葉とは思えません。
ヒントやアドバイスではなく「答え」を求めているからです。
samusu0905 さんが書きました: >・プログラムを作りたいのですか?
>・プログラムを動かしたいのですか?
>・動くプログラムを眺めたいだけですか?
>・プログラミングをしたつもりになりたいだけですか?
プログラムを作りたいが本音です。 そして、習得したプログラムをゲーム制作に役立てたいと思ってます。
動くプログラムをただ眺めたいだけなら,プログラムを作りたいとも思いませんよ。
ただ眺めるなんてつまらないですよ。
回答者の方々もあなたの「解決しました」だけのコメントを眺めてもつまらないですよ。
softyaさんも仰っている通り、解決したプログラムをきちんと貼り付けたうえで、
どういう処理を行ったことで解決に導いたのかを説明してもらわないと。
プログラムを作るためにはプログラムを理解する必要があります。
プログラムを理解していればプログラムを説明できるはずです。

このプロセスをそっちのけにしているから「プログラムを作りたい」ようには見えなかったわけです。

現状では、
1.みけCATさんが回答プログラムのありかを提示
2.打ち込んだらできましたのみの解決コメント
で終わっているので、プログラムを作成した証がなにもない状態なのです。

プログラミング初心者であっても構いませんが、そろそろ質問初心者は卒業しませんか?
回答をつけてくれている方たちは、少しでも質問者さんに自分で考えられるよう、
プログラミングの内容以外にも直したほうがいいことやお願いを書き込んでいます。
(質問時のソース提示、解決時のソース提示・説明などなど)

質問初心者のままでは本題であるプログラムの質問も正しくやり取りができなくなってしまいますよ。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
usao
記事: 1617
登録日時: 7年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#32

投稿記事 by usao » 6年前

まぁ,何をどうしたか みたいなことよりも,
ご自身で得るものがあったということであれば それでいいと思います.
オフトピック
例えば,今回の練習問題に取り組んだ結果として,
私が先に書いたような例題なんて朝飯前になった という話であれば無駄ではなかったと言えるでしょう.
そうでないならば,どうにも残念なお話という感じになっちゃうかな,と…

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#33

投稿記事 by asd » 6年前

オフトピック
usao さんが書きました:まぁ,何をどうしたか みたいなことよりも,
ご自身で得るものがあったということであれば それでいいと思います.
本人が得るものがあったならば本人はいいかもしれませんが、「できました、解決しました」だけで終わられると
本人だけのサポートセンターと化してしまう気がします(´・ω・`)
プログラムの内容は説明できなくとも、本人が納得した最終プログラムの提示くらいはしてほしいものです。
Advanced Supporting Developer
無理やりこじつけ(ぉ

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#34

投稿記事 by samusu0905 » 6年前

わかりました。
色々とご迷惑をお掛けしました。解決すれば大丈夫かなとばかり思ってました。このサイトのルールに違反していることが今回の皆さんの回答で良くわかりました。次からはコードを提示していきたいと思います。
>プログラムの内容は説明できなくとも、本人が納得した最終プログラムの提示くらいはしてほしいものです。
では、コードの内容を説明できなくても、納得したプログラムを提示すればいいわけですね?
了解しました。次からそのようにします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#35

投稿記事 by softya(ソフト屋) » 6年前

言葉尻を捕らえて、
>では、コードの内容を説明できなくても、納得したプログラムを提示すればいいわけですね?
というのは自分では理解できていない。
つまり、やったことに意味が無いと言っている様なものなので、そんなことを言うのはやめておきましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#36

投稿記事 by asd » 6年前

samusu0905 さんが書きました:わかりました。
色々とご迷惑をお掛けしました。解決すれば大丈夫かなとばかり思ってました。このサイトのルールに違反していることが今回の皆さんの回答で良くわかりました。次からはコードを提示していきたいと思います。
>プログラムの内容は説明できなくとも、本人が納得した最終プログラムの提示くらいはしてほしいものです。
では、コードの内容を説明できなくても、納得したプログラムを提示すればいいわけですね?
了解しました。次からそのようにします。
次からといわず、このトピックからルール違反を改めていきませんか?
結局どのようなコードで思った通りに動いたと判断されたのでしょうか?
動作するプログラムを張り付けてみてください。
softya(ソフト屋) さんが書きました:言葉尻を捕らえて、
>では、コードの内容を説明できなくても、納得したプログラムを提示すればいいわけですね?
というのは自分では理解できていない。
つまり、やったことに意味が無いと言っている様なものなので、そんなことを言うのはやめておきましょう。
確かにプログラムを提示してそれ以降トピックには来なくなってしまったら質問者本人としてはそこで終わりですが、
プログラムを提示してもらって、それに対して回答者さんたちから回答がついて、プログラムを理解するきっかけにになればと
思っています。
またプログラムの提示さえあれば、(反面教師的な使い方であっても)有用なトピックに持っていくことはできるのかなと。
Advanced Supporting Developer
無理やりこじつけ(ぉ

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#37

投稿記事 by samusu0905 » 6年前

softyaさん>>すみませんでした気を付けます::
>つまり、やったことに意味が無いと言っている様なものなので、そんなことを言うのはやめておきましょう。
では、これからは、私が書いたコードを出来る限り丁寧に説明したいと思います。多少説明不足でもそこは勘弁してください。
asdさん>>
>次からといわず、このトピックからルール違反を改めていきませんか?
>結局どのようなコードで思った通りに動いたと判断されたのでしょうか?
>動作するプログラムを張り付けてみてください。
そうします。ルール違反には気をつけます。

コード:

#include <stdio.h>
#include <string.h>

void rranges(char *str);

int main()
{
	int c=0;
	char str[256] = {"io"};
	//char str2[] = "cba";
	printf("文字列を入力してください------\n");
	scanf("%s", &str);

	printf("反転前:%s\n", str);
	rranges(str);
	printf("反転後:%s\n", str);

	while( c == 0)
	{
		scanf("%c", &c);
		getchar();
	}
	return 0;
}


void rranges(char *str)
{
	int i,j;
	for( i=0, j = strlen(str)-2; i < j; i++, j--)
	{
		char t;
		t = str[i], str[i] = str[j], str[j] = t;
	}
}
コードはこんな感じですね。
これでルール違反していないことになりますね。
もうここのトピックは大丈夫そうですが。。

かずま

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#38

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

samusu0905 さんが書きました: コードはこんな感じですね。
これでルール違反していないことになりますね。
もうここのトピックは大丈夫そうですが。。
本当に大丈夫ですか?
実行結果

コード:

文字列を入力してください------
abc
反転前:abc
反転後:bac
反転していません。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#39

投稿記事 by asd » 6年前

samusu0905 さんが書きました:softyaさん>>すみませんでした気を付けます::
>つまり、やったことに意味が無いと言っている様なものなので、そんなことを言うのはやめておきましょう。
では、これからは、私が書いたコードを出来る限り丁寧に説明したいと思います。多少説明不足でもそこは勘弁してください。
早速説明なしですが。
また、かずまさんが指摘しているように、反転できていません。
さらにいうとどこからか湧いてきた文字列読み込み処理が増えています。

これらをまとめると、
・プログラムを組んだのではなく、どこからかコピーしてきただけ
 →プログラムの動作については考える気なし
・出来上がったプログラムが仕様を満たしていない
 →コンパイルが通ってなんとなく動いたらそれでOKと思っている

本当にプログラムを学ぶ気があるのならば、
・なぜかずまさんの提示しているような結果になるのかを、ソースを追って解明してください
・出来上がったプログラムの動作確認は十分に行ってください
 →正常系はもちろんのこと、余力があれば異常系(わざと変な値を入力するなど)のテストも行い、
  正常系であればどんな入力でも正しく反転されるかを確認してください
samusu0905 さんが書きました: コードはこんな感じですね。
これでルール違反していないことになりますね。
もうここのトピックは大丈夫そうですが。。
すでに指摘のある通り、反転する関数ができていません(バグがあります)
そして文字列の入力処理など、当初は一切記載されていなかった部分について、
どのように調べ、入力したのかを説明してもらえませんか?
Advanced Supporting Developer
無理やりこじつけ(ぉ

box
記事: 1758
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#40

投稿記事 by box » 6年前

asd さんが書きました: さらにいうとどこからか湧いてきた文字列読み込み処理が増えています。
それは単に、自分で入力した任意の文字列を反転させたいと思ったからで、
取り立てて問題視する必要はないと思います。

固定の文字列を反転させるだけでは物足りないと思われたのでありましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#41

投稿記事 by asd » 6年前

box さんが書きました:
asd さんが書きました: さらにいうとどこからか湧いてきた文字列読み込み処理が増えています。
それは単に、自分で入力した任意の文字列を反転させたいと思ったからで、
取り立てて問題視する必要はないと思います。

固定の文字列を反転させるだけでは物足りないと思われたのでありましょう。
ご指摘ありがとうございます。
もちろん質問者さんがきちんとその処理を理解した上で改良したというのであれば、
特に問題視するつもりはありませんでしたが、そのあたりの説明がなかったのであえて指摘しています。
そのあたりの説明も含め、質問者さんの補足を待ちたいと思います。
Advanced Supporting Developer
無理やりこじつけ(ぉ

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#42

投稿記事 by samusu0905 » 6年前

かずまさん>>すみません。多分それ、プログラムの入力ミスです。

コード:

#include <stdio.h>
#include <string.h>

void rranges(char *str);

int main()
{
	int c=0;
	char str[256] = {"io"};
	//char str2[] = "cba";
	printf("文字列を入力してください------\n");
	scanf("%s", &str);

	printf("反転前:%s\n", str);
	rranges(str);
	printf("反転後:%s\n", str);

	while( c == 0)
	{
		scanf("%c", &c);
		getchar();
	}
	return 0;
}


void rranges(char *str)
{
	int i,j;
	for( i=0, j = strlen(str)-1; i < j; i++, j--)
	{
		char t;
		t = str[i], str[i] = str[j], str[j] = t;
	}
}
訂正しました。
私なりには理解しました。

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#43

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

samusu0905 さんが書きました:私なりには理解しました。
何も根拠を提示せずに「理解しました」とだけ言われても、申し訳ないですが信じられません。
asd さんが書きました:本当にプログラムを学ぶ気があるのならば、
・なぜかずまさんの提示しているような結果になるのかを、ソースを追って解明してください
・出来上がったプログラムの動作確認は十分に行ってください
 →正常系はもちろんのこと、余力があれば異常系(わざと変な値を入力するなど)のテストも行い、
  正常系であればどんな入力でも正しく反転されるかを確認してください
samusu0905 さんが書きました: コードはこんな感じですね。
これでルール違反していないことになりますね。
もうここのトピックは大丈夫そうですが。。
すでに指摘のある通り、反転する関数ができていません(バグがあります)
そして文字列の入力処理など、当初は一切記載されていなかった部分について、
どのように調べ、入力したのかを説明してもらえませんか?
こう指摘されている通り、コードの説明を行ってください。
それとも、asdさんに「解明」「説明」の定義を示してもらった方がいいですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#44

投稿記事 by softya(ソフト屋) » 6年前

最大の疑問は「多分それ、プログラムの入力ミスです。」とあるのに解決していたことですかね。
前回のコードはバグが有り、今回の問題はバグが直っているとして、バグの有るコードで解決していたのはなぜか? 疑問は尽きません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#45

投稿記事 by asd » 6年前

みけCATさんの投稿にもあったように、具体的に何をすればいいのかわからなかったかもしれないので、
以下、具体的にやってほしいことを書き出してみました。
本当にプログラムを勉強するつもりであれば、最低限抑えてほしい内容ばかりです。
samusu0905 さんが書きました: 訂正しました。
私なりには理解しました。
では、以下説明をお願いします。
本当に理解できているかどうかの確認です。

・当初存在していなかった文字列入力処理の説明
 →どうやってユーザーからの入力を実現し、どこにどのように格納されるのか?(制限事項があれば合わせて記しておくといいですね)
・期待する動作(何を入力するとどう出力されるのが正しいのか)
・訂正した箇所
・訂正前のプログラムでの問題点(訂正前は○○がXXだったのでこう直した)
・訂正後のプログラムで検証に用いた入力データと期待する出力(実行前に考えた内容)、および実際の実行結果(実行前の期待した結果と一致したのか)
 →正常系と異常系に分けて提示されているとよりいいですね。abc以外の入力についても当然確認してほしいと思っています。
samusu0905 さんが書きました:softyaさん>>すみませんでした気を付けます::
>つまり、やったことに意味が無いと言っている様なものなので、そんなことを言うのはやめておきましょう。
では、これからは、私が書いたコードを出来る限り丁寧に説明したいと思います。多少説明不足でもそこは勘弁してください。
できる限り丁寧な説明を期待しています。
現状では説明不足というレベルではなく、説明皆無ですよ。
有言実行でお願いします。
Advanced Supporting Developer
無理やりこじつけ(ぉ

初級者
記事: 200
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#46

投稿記事 by 初級者 » 6年前

常連さんたちからの波状攻撃は
いつまで続くのでしょうか。

もうそろそろお開きにして
いい頃合いのような気がします。

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#47

投稿記事 by asd » 6年前

オフトピック
初級者 さんが書きました:常連さんたちからの波状攻撃は
いつまで続くのでしょうか。

もうそろそろお開きにして
いい頃合いのような気がします。
質問攻めにしてしまったのは申し訳ないと思いますが、それだけ疑問に残るようなやり取りで終わってしまったということではないでしょうか。
Advanced Supporting Developer
無理やりこじつけ(ぉ

samusu0905
記事: 336
登録日時: 6年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#48

投稿記事 by samusu0905 » 6年前

私の説明やプログラムで間違いがかなりあったため、このように質問攻めされていると思います。
それでは丁寧に、簡潔に説明します。
まず、自作関数として、void rranges(char *str)をプロトタイプ宣言します。(文字列を反転させる関数)
次にmain()関数でローカル変数宣言でchar str[256];を宣言します。
次に文字列を入力させるようにユーザーに命令します。入力する際はscanf()関数を利用して文字列を習得し、strに文字列を格納します。
printf()関数で反転前の文字列を描画 →abc
その次に、プロトタイプ宣言した自作のrranges()関数を呼び出します。
このときに自作関数では文字列を反転させる処理を行わせるようにします。
最後に反転後の文字列を描画 →cba
以上がプログラムを組み込んだ手順です。

ここからさきは直した場所と、自作関数についての説明です。皆さんが望む説明になればいいかなと思っています。

自作関数のrranges()関数は、まず、引数にchar *strを渡します。
次に関数の中身の処理を説明します。
int i,j;の変数を宣言します。
for文で、iを0に初期化、jに初期値としてstrlen(str)-1を代入します。
i < jなら、iを1ずつ加算、jを1ずつ減算します。
その後にfor文の中の処理で、まずchar tを宣言しておきます。ここでtを宣言する理由は文字列を反転させるために、空の文字列が必要だからです。
空のtにstrを代入します(ここではstrの添え字iは、ユーザーが入力した先頭の文字を表します。)。
次に、空のstrにstr[j]を代入します。(ここで言うstr[j]はabcのcの文字)
最後に、一番最初に代入した。ユーザーが入力した先頭文字(ここではa)を空のstr[j]に代入して終了です。
かなり長くなってしまいましたが、いかがですか?私の説明で皆さんは納得しましたか?
これ以上の説明は出来ませんので、勘弁してください。
以上です。

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#49

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

ごめんなさい。せっかく説明を書いていただけたのであまり文句はつけたくないのですが、
どうしても気になるので、指摘させていただきます。
samusu0905 さんが書きました:int i,j;の変数を宣言します。
for文で、iを0に初期化、jに初期値としてstrlen(str)-1を代入します。
ここは大丈夫だと思います。
samusu0905 さんが書きました:i < jなら、iを1ずつ加算、jを1ずつ減算します。
初期化した直後に減算するわけではありません。
samusu0905 さんが書きました:その後にfor文の中の処理で、まずchar tを宣言しておきます。ここでtを宣言する理由は文字列を反転させるために、空の文字列が必要だからです。
空の文字列は必要ありませんし、tは文字列ではなく文字(を入れる変数)です。
samusu0905 さんが書きました:空のtにstrを代入します(ここではstrの添え字iは、ユーザーが入力した先頭の文字を表します。)。

添え字がユーザーが入力した先頭の文字を表す、というのはおかしいと思います。
たしかにi==0の時はstrは先頭の文字になりますが、iの値は(多くの場合)変化します。

samusu0905 さんが書きました:次に、空のstrにstr[j]を代入します。(ここで言うstr[j]はabcのcの文字)

strは空ではありません。C言語である変数の値を別の変数に代入しても、元の変数の値が消えることはありません。
さらに、C言語の変数には「空」を示すnullのようなものは無く、未初期化の変数は「空」ではなく「ゴミが入っている」と言えます。
(NULLはポインタの一種であり、nullとは違うと思います)

samusu0905 さんが書きました:最後に、一番最初に代入した。ユーザーが入力した先頭文字(ここではa)を空のstr[j]に代入して終了です。

上と同様に、str[j]は空ではありません。
さらに、ここでいきなり終了するというのも不自然です。
例えば、ユーザーの入力が"abcde"だったらどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
asd
記事: 318
登録日時: 10年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#50

投稿記事 by asd » 6年前

オフトピック
波状攻撃になるといけないので、私はこのトピックでの指摘はやめにします。
というか私の質問には一切触れていただけなかったのと、「勘弁してください」と自ら学習するのを放棄されてしまったのでこれ以上は無駄と思います。

別に放棄していただいても私は一向にかまいませんが、困るのは質問者さん自身ですよ。
Advanced Supporting Developer
無理やりこじつけ(ぉ

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

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#51

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

samusu0905 さんが書きました:これ以上の説明は出来ませんので、勘弁してください。
今は説明できなくても、じっくり学習していつか説明できるようになればいいのですが…。
できるようになるかならないか、samusu0905さんができるようになりたいかは、私にはわからないですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1617
登録日時: 7年前

Re: C言語の練習問題で文字列を反転して並び替える関数を作る処理について

#52

投稿記事 by usao » 6年前

>> i < jなら、iを1ずつ加算、jを1ずつ減算します。

>初期化した直後に減算するわけではありません。


指摘や質問だけだと 攻撃 と捉えてしまう方もおられるようですので
とりあえず上記引用の件(iやjが加減算されるタイミング)については
こんな感じですよー,という.

コード:

void rranges(char *str)
{
    int i,j;
    for( i=0, j = strlen(str)-1; i < j; i++, j--)
    {
        char t;
        t = str[i], str[i] = str[j], str[j] = t;
    }
}
↓whileで書くとこうなる

コード:

void rranges( char *str )
{
    int i,j;

    //↑コードでのfor( α; β; γ ) のαの部分 
    i=0;
    j=strlen(str)-1;

    while( i<j ) //判定式βの部分
    {
        char t;
        t = str[i], str[i] = str[j], str[j] = t;

        //γの部分
        i++;
        j--;
    }
}
オフトピック
まぁ,このfor()を実際に書いていることと,(失礼ながら)これまでの質問者様の文章の具合 から想像するに,
そういうことはわかっているけど 説明の文面の方がおかしい ということになっているのではないかと思いますが…

閉鎖

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