[英]Merge sort error - Expression must have a constant value
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
#include <vector>
using namespace std;
void merge(int A[], int p, int q, int r) {
int i;
int j;
int k;
int n1 = q - p + 1;
int n2 = r - q;
vector<int> L(n1), R(n2);
for (i = 0; i < n1; i++)
L[i] = A[p + i - 1];
for (j = 0; j < n2; j++)
R[j] = A[q + j];
i = 1;
j = 1;
for (k = p ; k < r; k++) {
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
}else{
A[k] = R[j];
j++;
}
}
}
void merges(int A[], int p, int r) {
if (p < r) {
int q = (p + r) / 2;
merges(A, p, q);
merges(A, q + 1, r);
merge(A, p, q, r);
}
}
void prin(int A[], int n) {
int j;
for (j = 0; j < n; j++)
printf("%d ", A[j]);
printf("\n");
}
int main(){
fstream infile;
infile.open("number.txt");
if (infile.is_open()) {
int i;
int A[20];
int n = sizeof(A) / sizeof(*A);
int p = 0;
for (int i = 0; i < n; i++) {
infile >> A[i];
}
for (int j = 0; j < n; j++) {
if (A[j] > p)
p = A[j];
}
merges(A, 0, n);
prin(A, n);
}
return 0;
}
我用 int L[n1],R[n2]; 得到了這個合並排序程序。 Visual Studio 給了我“表達式必須具有恆定值”。 我不知道該怎么做。 我也嘗試使用向量,但出現“表達式:向量下標超出范圍”錯誤。 文本文件中的數字是從 5 到 900 未排序的 20 個隨機數。 關於如何放置數組大小的任何指針都有一個非常數?
旁注:我將數組 int main 設置為 20,因為我知道該文件有 20 個數字。 有沒有辦法為文件設置數組大小,我不知道其中有多少個值?
您不必預先分配您的向量。 您可以繼續添加內容,直到完成。
int main()
{
std::ifstream file;
file.open("TextFile1.txt");
std::string str;
std::vector< std::string > strs;
for( ; std::getline( file, str ); )
strs.push_back( str );
std::cout << "the number of entries: " << strs.size( ) << std::endl;
return 0;
}
請注意, std::vector
size()
是從文件中讀取的內容。
補充:當你開始使用標准庫中的東西時,使用這個站點來看看你可以用 std::vector 做些什么。 它解釋了push_back
和size
以及所有其他成員以及功能概述。
正如戴維斯洛指出的那樣。 養成不using namespace
與標准庫一起using namespace
的習慣。 這是不值得的。 在 stackoverflow 上谷歌一下以獲取更多信息。
你不能在 C++ 中使用n1
或n2
作為數組邊界,除非它們是編譯時已知的常量。 如果它們是constexpr
變量,這將起作用。
在 C 中,這些表達式將聲明可變長度數組,這是一項可選功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.