ページ 11

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

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

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

Posted: 2014年6月29日(日) 11:37
by みけCAT
samusu0905 さんが書きました:関数を作らずに文字列を反転させる処理はできますが
では、まずそのコードを書いて貼ってください。

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

Posted: 2014年6月29日(日) 11:42
by hide
では、ただ単に作った関数を呼び出すだけのコードはかけますか?

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


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

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

Posted: 2014年6月29日(日) 11:56
by samusu0905
みけ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;
	}
}
これが関数を作らずに反転させる処理です。
これらの処理を関数を使って応用して処理を行う。
それが練習問題で問われている事なんじゃないかと思われます。

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

Posted: 2014年6月29日(日) 11:59
by みけCAT
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;
}
これでほぼ答えを書いてしまいましたね。

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

Posted: 2014年6月29日(日) 13:05
by usao
オフトピック

コード:

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

コード:

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

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

Posted: 2014年6月29日(日) 14:30
by samusu0905
みけCATさん>>回答有難うございます。
わざわざすみませんね。
確かにほぼ回答ですね。とりあえずコード参考にして書いてみます。

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

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

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

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

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

Posted: 2014年6月29日(日) 16:18
by 初級者
とりあえず、その課題「だけ」はクリアできるコード。
他の文字列を反転させたいときにどうするかは、知らない。

コード:

#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;
}

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

Posted: 2014年6月29日(日) 16:36
by samusu0905
みけ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
このように並び替えは出来ました。

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

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

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

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

Posted: 2014年6月29日(日) 16:45
by 初級者
では、反転したい文字列が

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

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

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

Posted: 2014年6月29日(日) 16:55
by samusu0905
その場合は
str = "-------";みたいな感じでコードを書けばいいのでは?
(あるいはstr = '-----';かな)

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

Posted: 2014年6月29日(日) 17:02
by amehirune
初めまして。素人考えですが、こういうのはどうでしょうか?

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

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

編集:入れる=代入というイメージがついてしまいそうなので、(追加)←連結という意味の文章を追加しました。

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

Posted: 2014年6月29日(日) 17:07
by みけCAT
samusu0905 さんが書きました:このコードが果たして適切かどうかわかりませんが。
適切とは言えませんが、致命的な間違いは無さそうです。
・18行目: scanfの%cはchar*型の引数を要求しますが、&cはint*型です。
 int型のサイズがchar型のサイズ以上ならば、バッファオーバーランにはなりません。
・rranges関数が戻り値を返す必要は、今のところないはずです。
・32行目でstr[3]を返しており、ぱっと見範囲外のように見えますが、
 ここは範囲外ではなく、'\0'が入っているはずなので大丈夫です。

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

Posted: 2014年6月29日(日) 17:09
by みけCAT
samusu0905 さんが書きました:では私がやろうとしている課題の答えを書いてもらえませんか?
これ以上時間かけたくないので。
それに後もう少しでうまくいきそうなんですよ。どうすればいいですか?「自分で考えろ」って言いたいんですか?
この練習問題が載っている書籍/サイトなど(の後ろの方?)に模範解答は載っていないのですか?
確認してみてください。

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

Posted: 2014年6月29日(日) 17:30
by 初級者
さっきの冗談コードじゃなくって、もっとまともなのを…。

コード:

#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;
}

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

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

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

Posted: 2014年6月29日(日) 18:24
by みけCAT
「そのプログラムの番号が何ページを示しているのか」というのがよくわからないのですが、
『猫でもわかるC言語プログラミング』という書籍をお使いでしたら、
http://www.sbcr.jp/products/4797372786.htmlの下にある
『猫でもわかるC言語プログラミング 第3版』ソースコードと練習問題解答」でDLできるファイルの中の、
「NekoC_Answer/Chap08/program83/program83.c」がそれっぽい内容でした。

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

Posted: 2014年6月29日(日) 18:25
by samusu0905
教材を参考にしてコードを打ち込んだらできました。
皆さんお世話になりました。特に、みけCATさん有難うございます。

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

Posted: 2014年6月29日(日) 20:15
by softya(ソフト屋)
自分に応用力や発想力を付けるために問題をやっているのか、単に答えが合っていればよいのかで話は変わりますが
では私がやろうとしている課題の答えを書いてもらえませんか?
これ以上時間かけたくないので。
それに後もう少しでうまくいきそうなんですよ。どうすればいいですか?「自分で考えろ」って言いたいんですか?
課題じゃないのなら、何のためにやっているか考えたほうが良くないですか? 自分で自分の発想力を広げるチャンスを潰している気がします。

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

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

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

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

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

ただしそれはプログラミングではなくコピペです。
プログラミングという観点からみると一切あなたの糧にはなりません。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Posted: 2014年7月10日(木) 19:24
by usao
……であれば,
「答えもそうなっていたので」
「答えの通りに書いたら動いたので」
といって終わらせるのでは何も得るものがない,という話が理解できそうなものですけど.

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

・なにかしら文字列があります.
・(問題を簡単にするために文字数は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」という内容だと捉えるのは,
何かが決定的にずれている ように思います.個人的に.

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

Posted: 2014年7月10日(木) 19:34
by softya(ソフト屋)
これなどゲームだとアイテムの並び替えなど操作に通じるすごく基礎的な練習問題です。
つまり、これを自分で考えつけないとしたらゲームを作るのは非常に困難だということです。
安易に妥協することで、考えるクセを付けることを排除しているようにしか見えないので、これを続けると段々と目的から逸れていくと思います。

プログラムとして大事な要素である「よく考える・アイデアをひねり出す」が嫌いなんじゃないかと思えてくるのです。

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

Posted: 2014年7月10日(木) 19:50
by samusu0905
usaoさん>>
>「答えもそうなっていたので」
>「答えの通りに書いたら動いたので」
答え通りには書いてませんよ。というより、私が見たのは答えともいえませんから。むしろ、参考にして教材に載っているプログラムを自分なりに変えただけですよ。答えとは言えません。参考程度です。

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

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

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

Posted: 2014年7月10日(木) 20:24
by softya(ソフト屋)
>教材を参考にしてコードを打ち込んだらできました。
>皆さんお世話になりました。特に、みけCATさん有難うございます。

そのままじゃないのなら、そのコードを提示するのが掲示板のルールと成っています。
何処をどのように考えたコードなのか、コードが物語ってくれます。

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

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

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

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

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

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

質問初心者のままでは本題であるプログラムの質問も正しくやり取りができなくなってしまいますよ。

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

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

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

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

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

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

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

Posted: 2014年7月11日(金) 11:01
by softya(ソフト屋)
言葉尻を捕らえて、
>では、コードの内容を説明できなくても、納得したプログラムを提示すればいいわけですね?
というのは自分では理解できていない。
つまり、やったことに意味が無いと言っている様なものなので、そんなことを言うのはやめておきましょう。

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

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

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

Posted: 2014年7月11日(金) 19:52
by samusu0905
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言語の練習問題で文字列を反転して並び替える関数を作る処理について

Posted: 2014年7月11日(金) 19:58
by かずま
samusu0905 さんが書きました: コードはこんな感じですね。
これでルール違反していないことになりますね。
もうここのトピックは大丈夫そうですが。。
本当に大丈夫ですか?
実行結果

コード:

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

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

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

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

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

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

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

固定の文字列を反転させるだけでは物足りないと思われたのでありましょう。

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

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

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

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

Posted: 2014年7月12日(土) 13:56
by samusu0905
かずまさん>>すみません。多分それ、プログラムの入力ミスです。

コード:

#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;
	}
}
訂正しました。
私なりには理解しました。

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

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

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

Posted: 2014年7月12日(土) 16:57
by softya(ソフト屋)
最大の疑問は「多分それ、プログラムの入力ミスです。」とあるのに解決していたことですかね。
前回のコードはバグが有り、今回の問題はバグが直っているとして、バグの有るコードで解決していたのはなぜか? 疑問は尽きません。

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

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

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

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

Posted: 2014年7月12日(土) 17:58
by 初級者
常連さんたちからの波状攻撃は
いつまで続くのでしょうか。

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

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

Posted: 2014年7月12日(土) 23:35
by asd
オフトピック
初級者 さんが書きました:常連さんたちからの波状攻撃は
いつまで続くのでしょうか。

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

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

Posted: 2014年7月14日(月) 20:11
by samusu0905
私の説明やプログラムで間違いがかなりあったため、このように質問攻めされていると思います。
それでは丁寧に、簡潔に説明します。
まず、自作関数として、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]に代入して終了です。
かなり長くなってしまいましたが、いかがですか?私の説明で皆さんは納得しましたか?
これ以上の説明は出来ませんので、勘弁してください。
以上です。

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

Posted: 2014年7月14日(月) 21:29
by みけCAT
ごめんなさい。せっかく説明を書いていただけたのであまり文句はつけたくないのですが、
どうしても気になるので、指摘させていただきます。
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"だったらどうなりますか?

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

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

別に放棄していただいても私は一向にかまいませんが、困るのは質問者さん自身ですよ。

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

Posted: 2014年7月15日(火) 08:31
by みけCAT
samusu0905 さんが書きました:これ以上の説明は出来ませんので、勘弁してください。
今は説明できなくても、じっくり学習していつか説明できるようになればいいのですが…。
できるようになるかならないか、samusu0905さんができるようになりたいかは、私にはわからないですね。

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

Posted: 2014年7月15日(火) 10:24
by usao
>> 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()を実際に書いていることと,(失礼ながら)これまでの質問者様の文章の具合 から想像するに,
そういうことはわかっているけど 説明の文面の方がおかしい ということになっているのではないかと思いますが…