具有动态确定大小

时间:2015-12-16 06:42:58

标签: c++ arrays sorting bubble-sort

我正在尝试对具有动态确定大小的数组使用冒泡排序方法。这是代码:

#include <iostream>

using namespace std;

int main()
{
    int n;
    cout<<"Enter n";
    cin>>n;
    int arr[n],swap;
    cout<<"Enter number"<<endl;
    cin>>arr[n];
    for(int i=0;i<n-1;i++)
    for(int j=0;i<n-i-1;j++)
        if(arr[j]>arr[j+1])
    {
        swap=arr[j];
        arr[j]=arr[j+1];
        arr[j+1]=swap;
    }
    for(int k=0;k<n;k++)
        cout<<"arr["<<k<<"]="<<arr[k]<<endl;
    return 0;
}

当我以这种方式定义数组的元素时,程序可以工作:

const n=5;
int arr[n]={1,2,3,4,5)

但我需要从键盘输入数组(n)及其元素的大小。但是当我运行我的代码时,程序在输入第一个数字后崩溃了。有办法解决吗?

4 个答案:

答案 0 :(得分:3)

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n, swap, temp;
    vector<int> arr;
    cout<<"Enter n";
    cin>>n;

    // Loop and accept the n values.
    // You may need to take care of the new line.
    for(int i = 0; i < n; ++i)
    {
        cout << "Enter a number : ";
        cin >> temp;
        arr.push_back(temp);
    }

    for(int i=0;i<n-1;i++)
    for(int j=0;j<n-i-1;j++)
        if(arr[j]>arr[j+1])
    {
        swap=arr[j];
        arr[j]=arr[j+1];
        arr[j+1]=swap;
    }
    for(int k=0;k<n;k++)
        cout<<"arr["<<k<<"]="<<arr[k]<<endl;
    return 0;
}

注意如何使用循环从用户中提取n值。同样使用std::vector可以使您无法使用newdelete为运行时大小的数组编写代码。

此外,您的内部循环正在检查i<n-i-1并递增j,而j<n-i-1应该j,否则INT_MAX将无限增加,直到cond = {'notified':'100','token':'123','usage':'kart_user'} sql = "UPDATE {} set notified = %(notified)s where token = %(token)s".format(cond['usage']) result = self.cur.execute(sql,cond) result = self.dbconn.commit() return res

答案 1 :(得分:3)

关键词是动态分配。在C中,函数是malloc。在Cpp中,它可以是new和delete。虽然矢量可以很好地工作,但它只是STL的一种方法。请注意,我的代码可能存在安全问题。

#include <iostream>

using namespace std;

int main()
{
    int n,temp;
    cout<<"Enter n:";
    cin>>n;
    //dynamic allocation
    int *arr=new int[n];
    cout<<"Enter number."<<endl;
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    //bubble sort
    for(int i=0;i<n;i++){
        for(int j=i;j<n;j++){
            if(arr[i]>arr[j]){
                temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
            }
        }
    }
    //output the array
    for(int i=0;i<n;i++){
        cout<<"arr["<<i<<"]="<<arr[i]<<endl;
    }
    delete [] arr;
    return 0;
}

答案 2 :(得分:1)

你不能像这样采用整数数组,你需要运行一个循环。你可以像这样$(function() { location.href = "#page1" var goToNextPage = null; function updatePage(event) { console.log(event) var currentPage = Number(location.hash.slice(-1)); // if `currentPage` is less than 4 if (currentPage !== 4) { goToNextPage = setTimeout(function() { if ((currentPage + 1) <= 4) { // set `location.href` to `#page` + `currentPage` + `1` location.href = "#page" + (currentPage + 1); console.log(location.hash); // reset event handlers $(document).one("mousemove keypress", updatePage); } }, 3000); } else { clearTimeout(goToNextPage) } } $(document).one("mousemove keypress", updatePage); }); 。冒泡排序逻辑中也存在很多错误,请尝试下面的代码片段。它应该工作正常。您需要为string

动态分配数组
arr

包括:int n,r,swap,i,*arr; cout<<"Enter n\n"; cin>>n; arr = (int *)malloc((n)*sizeof(int)); cout<<"Enter numbers\n"<<n<<endl; for(i=0;i<n;i++) { cin>>arr[i]; } for(i=0;i<n;i++) { for(int j=0;j<n-1;j++)//You're checking for i. you need to check for j { if(arr[j+1]<arr[j]) { swap=arr[j]; arr[j]=arr[j+1]; arr[j+1]=swap; } } } //now print your arr

答案 3 :(得分:0)

正如我在评论中所提到的,你不能用C ++动态声明数组的大小(如果你愿意,可以使用std::vector)。

然后你可以这样做:

....
cin >> n;
vector<int> arr(n); // reserves space for `n` integers in the memory
....