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

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

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

#31

投稿記事 by asd » 11年前

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

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

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

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

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

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

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#32

投稿記事 by usao » 11年前

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

アバター
asd
記事: 319
登録日時: 15年前

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

#33

投稿記事 by asd » 11年前

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

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

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

#34

投稿記事 by samusu0905 » 11年前

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

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

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

#35

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

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

アバター
asd
記事: 319
登録日時: 15年前

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

#36

投稿記事 by asd » 11年前

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

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

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

#37

投稿記事 by samusu0905 » 11年前

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 かずま » 11年前

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

コード:

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

アバター
asd
記事: 319
登録日時: 15年前

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

#39

投稿記事 by asd » 11年前

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

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

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

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

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

#40

投稿記事 by box » 11年前

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

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

アバター
asd
記事: 319
登録日時: 15年前

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

#41

投稿記事 by asd » 11年前

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

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

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

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

#42

投稿記事 by samusu0905 » 11年前

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

コード:

#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
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#43

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

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

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

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

#44

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

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

アバター
asd
記事: 319
登録日時: 15年前

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

#45

投稿記事 by asd » 11年前

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

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

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

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

#46

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

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

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

アバター
asd
記事: 319
登録日時: 15年前

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

#47

投稿記事 by asd » 11年前

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

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

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

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

#48

投稿記事 by samusu0905 » 11年前

私の説明やプログラムで間違いがかなりあったため、このように質問攻めされていると思います。
それでは丁寧に、簡潔に説明します。
まず、自作関数として、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
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#49

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

ごめんなさい。せっかく説明を書いていただけたのであまり文句はつけたくないのですが、
どうしても気になるので、指摘させていただきます。
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
記事: 319
登録日時: 15年前

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

#50

投稿記事 by asd » 11年前

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

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

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

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

#51

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

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

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#52

投稿記事 by usao » 11年前

>> 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言語何でも質問掲示板” へ戻る