int i;
int j;
for (i = 0, j = len -1; i < j; i = i + 1, j = j - 1) { c = array[i]; array[i] = array[j]; array[j] = c; }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
図式化とはおそらくフローチャートにすることを言っているのだと思いますが、パソコンで図を書くのはしんどいのでそれは省略します。
ソースコードをもとに図式化というよりは、図式化してからソースコードを書くという方が順序的には正しいような気もしますが。
端同士を交換するという発想でよいと思います。
配列の要素数が n だと分かっているのだから、配列の前から i 番目の要素と交換すべき要素は (n-i-1) 番目ですよね。
そして、この交換は真ん中までやればよいです。要素数が奇数のときのど真ん中については交換に含めても含めなくてもよいですが、 hichon さんのように xor 交換アルゴリズムを用いる場合は問題が出てしまいますし、含める必要もないので含めなくてよいかと思います。逆に真ん中を越えて行うとどうなるかはお分かりだと思いますので省略します。
これらをふまえると次のように書けます。
分かりやすさのため値を交換する SWAP(a,b) マクロは用意したとします。
直接ここに交換アルゴリズムを書いてももちろん大丈夫です。
c
1char str[] = "everyone"; 2 3// サイズ n を求める 4// sizeof(char) == 1 は固定なので本当はいらないですが。 5int n = sizeof(str) / sizeof(char); 6 7// (文字列の場合) 終端文字を含んでしまうのですが、 8// 終端文字をひっくり返して先頭にもってきてしまうと困るので、 9// 最後の終端文字を除外して反転させるために、長さを 1 引きます。 10// 最初から strlen() でもよいと思います。 11// 純粋に配列を反転させる場合はいりません。 12n--; 13 14// ここからが本題 15// 先の考察の通り、真ん中までループして、対応する要素同士を 16// 入れ替えます。真ん中は含まないことにしたので、条件は < です。 17for (int i = 0; i < n / 2; i++) { 18 // i 番目の要素と、 (n-i-1) 番目の要素を交換する 19 SWAP(str[i], str[n-i-1]); 20} 21 22// (おまけ) ひっくりかえした後の文字列を表示 23printf("%s\n", str);
投稿2018/01/28 10:47
総合スコア429
0
https://stackoverflow.com/questions/784417/reversing-a-string-in-c
https://stackoverflow.com/questions/40984728/invert-a-string-in-c
丁寧な説明付き。
https://cpprefjp.github.io/reference/algorithm/reverse.html
標準ライブラリ。
https://www.geeksforgeeks.org/quickly-reverse-string-c/
網羅的に。
https://stackoverflow.com/questions/228038/best-way-to-reverse-a-string
C#で。
Ekiさんのコードをhttps://code2flow.com/appに入れてみました。
イメージ
図が汚いのはきっとお金を払っていないせい……
投稿2018/01/28 10:17
編集2018/01/28 11:08総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。