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

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

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

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

Q&A

1回答

384閲覧

挿入ソート c言語 プログラム

haru102626

総合スコア0

C

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

0グッド

0クリップ

投稿2023/01/14 14:57

前提

挿入ソートのcプログラムなのですが実行結果が0から始まる理由がわかりません。
よろしくお願いします。

発生している問題・エラーメッセージ

i: 0 1 2 3 4 5 6 7 8 9
a[i]: 21 32 8 11 23 66 31 72 0 92

i: 0 1 2 3 4 5 6 7 8 9
a[i]: 0 0 8 11 21 23 31 32 66 72

該当のソースコード

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 10
int a[100];

void set_array(void);
void print_array(void);
void swap(int *x, int *y);

void set_array (void) { //100未満の乱数 N個生成して、配列にセット
int i;

srand((unsigned)time(NULL)); for(i = 0; i < N; i++) a[i] = rand()%100;

}

void print_array() { // 配列をプリント
int i;

printf(" i:"); for(i=0; i < N; i++) { printf("%3d ",i); } printf("\n"); printf("a[i]:"); for(i=0; i < N; i++) { printf("%3d ",a[i]); } printf("\n"); printf("\n");

}
void swap(int *x, int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main(void){

int i,j; set_array(); // N個乱数を配列にセット print_array(); // ソート前プリント for(i=1;i<=N;i++){//先頭から順にソート j=i; while(a[j-1]>a[j]){//配列済みは処理しない swap(&a[j-1],&a[j]);//整列されていない要素を交換 j--; } } /* a[]をソートする */ print_array(); // ソート後プリント return 0;

}

試したこと

数字を変えてみてもできませんでした

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

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

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

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

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

jimbe

2023/01/14 15:55

とりあえず、先の質問が解決されたのであれば回答を書いてベストアンサーとして解決済みにしたり、コードをマークダウンで囲ったり、数字を変えるとかテキトウにせずにプログラムが動作するに従って各変数がどう変化しているのかを追ったりしては如何でしょう。
guest

回答1

0

以下の箇所ですが、問題点が2点あります。
問題点1.
i=1から開始するので、j=1から開始します。
a[j-1]>a[j] の判定は
a[1-1]>a[1] なので、これが成立すると,swapのあとjから1引かれます。
そのため、j=0となり、次の判定は
a[j-1]>a[j]なので
a[0-1]>a[0]となり、範囲外参照となります。
従って、j=0の場合は、判定をしないようにする必要があります。

問題点2.
for(i=1;i<=N;i++)なので
iは10まで実行されます。その時、jも10になります。
a[j-1]>a[j] の判定は
a[10-1]>a[10]なので、範囲外参照になります。(添え字が有効なのは0~9です)

C

1for(i=1;i<=N;i++){//先頭から順にソート 2j=i; 3 while(a[j-1]>a[j]){//配列済みは処理しない 4 swap(&a[j-1],&a[j]);//整列されていない要素を交換 5 j--; 6 } 7} 8

上記を踏まえて、以下のように修正してください。

C

1 for (i = 1; i < N; i++) { //先頭から順にソート 2 j = i; 3 while ( j > 0 && a[j - 1] > a[j] ) { //配列済みは処理しない 4 swap(&a[j - 1], &a[j]); //整列されていない要素を交換 5 j--; 6 } 7 } 8

投稿2023/01/15 01:44

tatsu99

総合スコア5462

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問