🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

5回答

1090閲覧

[初心者] 配列の処理に困ってます。

SmaSTATION

総合スコア29

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/03/29 05:22

「int 型配列とその要素数を引数に受け取り、配列の要素を逆転させる(配列の中身を書き換える)関数 reverse() を繰り返しで作れ。」というのが条件です。
以下、正解コード。

#include<stdio.h> #define SIZE 10 void printarray(int a[],int n){ for(int i=0;i<n;i++){ printf("%d,",a[i]); } printf("\n"); } void reverse(int a[],int n){ int i,tmp; for(int i=0;i<n/2;i++){ tmp=a[i]; a[i]=a[n-1-i]; a[n-1-i]=tmp; } } int main(void){ int i, score[SIZE]; for(i = 0; i < SIZE; i++){ score[i] = (i*83+11)%101; } printarray(score, SIZE); reverse(score, SIZE); printarray(score, SIZE); return 0; }

void型のreverse節の処理について質問です。
・なぜ、for文の範囲のnを半分にするのか。

tmp=a[i]; a[i]=a[n-1-i]; a[n-1-i]=tmp;

の処理の2行目が紙に書いてみてもピンとこないので何かヒントをいただけるとうれしいです。
宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/03/29 05:33

とりあえず、初心者マーク付いてるのにタイトルに[初心者]と書く必要はないので消しましょう。
guest

回答5

0

なぜ、for文の範囲のnを半分にするのか

それだけやれば十分だから、それ以上やると「交換」にならないからです。

紙に書いてみてもピンとこない

なにを書いてみたのでしょう?描いてみた

投稿2021/03/29 22:54

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

紙に書いてみてもピンとこないので何かヒントをいただけるとうれしいです。

tmp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=tmp;

具体的に i=0 のとき,i=1のとき,i=2のとき… でどうなるのかを考えてみれば良いのでは.
それでもわからないならば,配列の内容も具体的な例で考えればよいでしょう.

例えば,配列aの内容が{1,2,3,4,5}の5要素だったらどうなるのか.

i=0のとき,

tmp = a[0]; //tmpの値は1になる a[0] = a[4]; //aの内容が,{5,2,3,4,5} になる. a[4] = tmp; //aの内容が,{5,2,3,4,1} になる.

結果として a[0] と a[4] の値が交換されました.

次は i=1 になるから… a[1] と a[3] の値が交換されて…

(以下略)

…と,忠実にシミュレートしてみれば良いでしょう.そのように見ていけば,

なぜ、for文の範囲のnを半分にするのか。

もわかるでしょう.

投稿2021/03/29 05:34

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

・なぜ、for文の範囲のnを半分にするのか。

一回のループで配列の要素を2個処理しているためです。

偶数個の要素を持つ配列の場合、例えば10個の要素を持つ配列であれば、一回のループで2個の要素を処理すれば5回のループで全要素を処理できることになります。

奇数個の要素を持つ配列の場合、例えば5個の要素を持つであれば、中央の要素(3つ目の要素)については順番の置き換え先が自身になるため置き換えが不要になるため、2回のループで全要素を処理できます。(intの除算は小数点以下切り捨て)

の処理の2行目が紙に書いてみてもピンとこないので何かヒントをいただけるとうれしいです。
宜しくお願いいたします。

どの様に紙に書いているかを追記されるとより良い回答が得られるかもしれませんね。
10個の要素を持つ配列があるとして、1-5周目のループでどの様に要素が入れ替わっているかを絵に書いてみると理解しやすいと思いますよ

投稿2021/03/29 05:36

tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列の先頭からi番目と、後尾からi番目の要素を入れ替えています
こうすると、配列の要素数の半分のループで、配列の中身を全部入れ替えることができますね

投稿2021/03/29 05:36

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

入れ替えは要素2個ずつ行うので、入れ替えのループ回数は半分になります。
具体的な例を挙げると、

要素数が6個だとしたら、
a[0]とa[5]、a[1]とa[4]、a[2]とa[3]の入れ替えをすれば良いので3回の入れ替えですみます。

要素数が5個だとしたら
a[0]とa[4]、a[1]とa[3]の2回の入れ替えですみます。a[2]は入れ替える必要がありません。

投稿2021/03/29 05:35

編集2021/03/29 05:37
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問