質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

Q&A

解決済

3回答

457閲覧

データの昇順について:コードの一部の意味を教えてください。

za-to

総合スコア7

C

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

0グッド

0クリップ

投稿2021/06/29 05:57

データの昇順についてです。 **で囲まれている部分の意味が理解できません。 ➀n=0から始まり、入力されたデータを読み込める間、nに+1し続ける  という部分は分かるのですが、その後の ➁k=n-1から始まり~~の部分からが分かりません。 データの数?だと思うのですが、いまいち理解できず、困っています。 どなたか教えていただけますでしょうか。よろしくお願いいたします。 #include<stdio.h> #include<string.h> int main(int argc, char *argv[]){ #define TABLESIZE 10000 int x; int table[TABLESIZE]; int n; int k; **for(n= 0; scanf("%d",&x)==1; n++){ for(k= n-1; k>=0 && x<table[k]; k--){ table[k+1]= table[k]; } table[k+1]= x;** } for(k= 0; k!=n; k++){ printf("%d\n",table[k]); } return 0; }

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

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

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

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

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

guest

回答3

0

ベストアンサー

**で囲まれている部分の意味が理解できません。

そういうときは,落ち着いて,

n=0, 1, 2, ... のときの入力値を適当に { 5, 80, 11, ... } とかした時にどのように動いていくのか?
を紙とペンで追ってみればよいです.

要は,そのコードをあなたが忠実に実行(シミュレート)してみる.
そうすればやってることが見えてくるでしょう.
一個データが入力されるたびに,配列をどのように更新しているのか,というのが.
(まぁ,「どのように」=「昇順」なわけだが)


コードが読めない(?)とのことなので,
件の2重forの部分を処理順が分かりやすい(つもりの)形に書き換えてみました.

  • ループをwhileに置き換えて,for(A; B; C) の{A,B,C}の処理順を明確化
  • ループ条件をwhileに書くのではなく,ループ内で「ループを抜ける条件」としてbreakする形に書いた.

C

1n=0; 2while( 1 )//※とにかく無条件にループ 3{ 4 if( scanf("%d",&x) != 1 )break; //※このループを抜ける条件 5 6 //-----↓内側のforの部分↓ 7 k = n-1; 8 while( 1 )//※とにかく無条件にループ 9 { 10 if( k<0 )break; //※この内側ループを抜ける条件(1) 11 if( x>=table[k] )break; //※この内側ループを抜ける条件(2) 12 13 table[k+1]= table[k]; 14 15 k--; 16 } 17 //-----↑内側のforの部分↑ 18 19 table[k+1] = x; 20 21 n++; 22}

投稿2021/06/29 06:31

編集2021/06/30 01:21
fana

総合スコア11996

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

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

za-to

2021/06/29 22:26

申し訳ございません。 紙の上に書いて考えたのですが、考え方はわかりました。 しかし、コードと考え方が一致せず、根本的に理解できていない状態です。 コードが読めないという初歩的なつまづきです。。 お手数ですが、コードの詳細を教えて頂けたらと思います。 重ね重ね申し訳ございません。
fana

2021/06/30 01:22

とりあえず読みやすいと思う形に書き替えてみたコードを追記したが,どうかな.
fana

2021/06/30 01:38 編集

本当にちまちまとみていけば良いよ. 最初は n=0 で,とりあえずxに5が入力されたとして, そうすると k=n-1 だから kの値は-1で,内側のループは if(k<0)break; ですぐに抜けて, そうすると table[k+1] = x; というのは table[0]に5を代入するわけだ. なので,この時点での table[] の中身は { 5, 不明, 不明, ... } という状態になるわけだ. その後 n++; で nの値は1になる. で,次はxに80がが入力されたとして, 今回は nの値は1なんだから,kの値は0. 内側のループの1個目のifの条件には引っかからない. 2個目のifについてはどうだろうか? xは80で,table[k]ってのはtable[0]であり,この値は今は5だから,条件を満たす.だから内側ループを抜ける. table[k+1]=x; ってのは table[1]にxを代入するんだから, table[] の中身は { 5, 80, 不明, ... } という状態になる. nを2にして,以下繰り返し… という形で. で,内側のループの2つのifの条件を満たさない入力の場合に何が起こるのか? というのも コードに忠実に table の中身がどうなるのかを追っていけばいい. nが5とか6くらいになるあたりまで見てみれば意味がつかめるんじゃないかな?
za-to

2021/06/30 02:05

丁寧な説明ありがとうございます。 とてもわかりやすくて、感動しました。 おかげさまで、最初のコードの何がどの部分を表して処理しているのか理解することが出来ました。 自分もfanaさんのように、分かりやすく説明できるようになりたいと思います! ありがとうございました!
fana

2021/06/30 02:15 編集

「このコードは何をやってるんだろう? どう動くんだろう?」となった場合には, 誰でも多かれ少なかれ,このような感じで脳内(だけで無理なら紙上とか)でシミュレーションを行うんじゃないかな,と思います. また,実際に動作させることができるならば,例えば各所にprintfを仕込んでその時々の変数の値とか,そのprintfを書いた場所をいつ通るのか?等を観察してみる等してみると理解の助けになるかもしれません. (これは,自分の書いたコードがうまく動かない場合にやることと一緒.「うまく動かん=どう動いてるのかわからん」なので)
guest

0

for(k= n-1; k>=0 && x<table[k]; k--){
table[k+1]= table[k];
}
table[k+1]= x;

k=n-1にてtableの末尾(前回までに入力した数-1)を取得します。
このとき、table[k]は現在入力されている最大の数になります。
これよりもxが小さいのであればtable[k]を後ろにズラす必要があります。
kを小さくしていき先頭までズラすか、xよりtable[k]が小さいのであればその次にxを挿入します

投稿2021/06/29 06:11

asm

総合スコア15149

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

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

za-to

2021/06/29 22:23 編集

回答ありがとうございます。 初歩的で申し訳ないのですが、kを小さくしていき、table[k]を後ろにずらすとは、どういう仕組みでしょうか? 日本語で説明していただくとわかるのですが、コードが説明のどの部分を表しているのか分からず、根本的に理解できていないです。。 お手数ですが、詳細を教えて頂けたらと思います。
asm

2021/06/29 22:49

> for(k= n-1; k>=0 && x<table[k]; k--){ 初期化式: k=n-1 訳: kを現在入力済みの領域の末尾に設定 (末尾から) 条件式: k>=0 && x<table[k] 訳: kが0よりも大きく、かつ、xがtable[k]よりも小さい間は 更新式: k-- 訳: 1ずつ減らしながら(先頭へ向かって) > table[k+1] = table[k]; table[k]のデータをtable[k+1]へコピー (ひとつ後ろへずらす) > table[k+1] = x; table[k+1]へxを入れる 注: k+1はループ最終段でのk
za-to

2021/06/30 02:11

回答ありがとうございます。 一つずつ減らして更新、一つ後ろにずらすという意味の違いを理解することが出来ました。 申し訳ないのですが、ベストアンサーは、自分の文章理解に、しっくりきたということで、別の方にしました。 回答して頂いたのに申し訳ございません。本当にありがとうございます。
guest

0

なかなか壮絶に意味不明なコードですね。
tableが初期化されてないなど、致命的な間違いがあるのでこのコードを理解しようとするのはやめときましょう

投稿2021/06/29 06:02

y_waiwai

総合スコア88042

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

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

fana

2021/06/29 06:46

> tableが初期化されてないなど、致命的な間違いがある 配列 table[] は入力された値を格納していく場所っぽいので,別に中身が初期化されてなくてもよいのでは.
kazuma-s

2021/06/29 09:34

このコードは挿入ソートのコードであり、意味不明なコードではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問