0

私はデータ構造を扱うことを学んでいて、Insertion_Sortsが整数の配列を作成するプログラムを書いたところです。並べ替えは完全に機能するため、それに取り組む必要はありません。しかし、ソートされた配列で特定の番号を検索する方法をユーザーに提供したいと思います。より具体的には、Win7x64UltimateでMSVS2010に次のコードをコンパイルしましたが、「検索する番号を指定してください」と書き込んだ後、クラッシュし、デバッガーに「アクセス違反」と表示されます。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <vector>
using namespace std;


int swap(int x, int y)
{
if(x != y)
  {
       _asm
      {
        mov eax,x;
        mov ebx, y;
        mov y,eax;
        mov x, ebx;
      }

  }
return 0;
}

int insertion_sort()
{
int or_size = 2;
int i,j,k,h, size, temp;
char answ;
int xx;
char query [20];


printf("Specify array size\n");
scanf_s("%d", &size);
printf(" Now, input all elements of the array \n");

vector<int> Array(size, 0);
if (size > or_size)
    Array.resize(size);

for (int i = 0; i < size; i++)
{
    scanf_s("%d\n", &temp);
    Array[i] = temp;
}

printf ("Your array appears to be as follows: \n");
for (int i = 0; i < size; i++)
    printf("%d  ", Array[i]);


for (i =0; i < size; i++)
    for (j = 0; j < i; j++)
        if (Array[j] > Array[i])
        {
        temp = Array[j];
        Array[j] = Array[i];
        for (k = i ; k > j ; k-- )
                    Array[k] = Array[k - 1] ;

        Array[k + 1] = temp ;
        }
printf ("\n Your Array has been insertion_sorted and should know look like this: \n");
for (int i = 0; i < size; i++)
    printf("%d ", Array[i]);

printf("\n Would you like to search for a specific value? (Yy/Nn) \n");
answ = _getch();
if (answ == 'Y' || answ == 'y')
{
    printf("Specify number to be searched \n");
    scanf_s("%s", query);
    xx = atoi(query);
    printf("Searching for %d ", query);
    for(h = 0; h < sizeof(Array); h++)
        if (Array.at(h) == xx)
            printf("%d\n", h); 
        else
            printf("No such number was found in a sorted array\n");
}    

Array.clear();

return 0;
}

int main()
{
    insertion_sort();
    return 0;
}

PSは_asm部分を無視します:それは機能しますが、まだ使用されていません:-)

4

1 に答える 1

1

printf("Searching for %d ", query);queryは の配列として宣言されているため、符号付き整数の出力に使用される指定子をchar使用しないでください。またはに変更してください。これはC++なので、でも使用します。%d%d%squeryxxstd::cout

sizeof(Array)あなたがしたいことをしません。Array.size()代わりに使用してください。

C++ では、関数の先頭ですべての変数を宣言する必要はありません。それは私が信じているC89の古い部分でした。for(int h = 0; h < Array.size(); h++)これは、たとえば次のように for ループを宣言できることを意味します。

ベクトルで何かを見つけようとする良い例を次に示します。

if(std::find(Array.begin(), Array.end(), xx) != Array.end())
    std::cout << "found" << std::endl;
else
    std::cout << "not found" << std::endl;

C と C++ コードを混在させています。1 つの言語を選択し、その言語のみを使用することをお勧めします。

于 2012-08-20T03:22:57.593 に答える