0

こんにちは、ファイルから取得した数値を整理する小さなプログラムに取り組んでいます。現時点で、私の現在の難問は、ファイルから数値を 1 つずつ整数として取り込む方法、またはそれらを文字列から分離する方法です。

sample input: 

3 4 6 60 9 10 2 20  
56 11 18
34

output:
3 4 6 60 9 10 2 20 56 11 /*prints out the first 10 numbers taken in then sorts it*/
3 4 6 9 10 11 18 20 56 60 /* after first 10 it looks at the next input then sorts it again*/
4 6 9 10 11 18 20 34 56 60
void Sortingnums(char *nums,int firsttime)
{
    //holds counter and temporary number//
    int i, k, temp;
    //holds temporary c string//
    char* wordnum;
    //just take in the first ten numbers and that is it.
    if(firsttime == 0)
    {
        wordnum = strtok(nums," "); 
        numbers[0] = atoi(wordnum);
        //take in the first 10 numbers in the string//
        for(i = 1; i < 10; i++)
        {
            wordnum = strtok(NULL," "); 
            numbers[i] = atoi(wordnum); //store the number//
        }
        // output the first 10 numbers//
        for(i = 0; i < 10; i++)
        {
            cout << numbers[i] << " " << endl;
        }
        firsttime++;
    }
    while(

サンプルの下には、cstring配列を取り込んでスペースで区切られた整数に分割するソートアルゴリズムがありますが、最初の10個の数字を前に出力する必要があるという事実がありました。

残りの入力をどのように整理しますか? (入力の 1 行目には 10 個以上の数字を含めることができます)

4

2 に答える 2

0

私は基本的でシンプルにしようとしていますが、実際にはC ++(および基本的なC関数)を使用しています。

  1. ファイル内のすべてのテキストをstd::stringに読み込みます。
  2. 文字列を区切り文字「\n」(または「\ r \ n」、入力によって異なります)で「std::vectorlines」に分割します。(std :: string :: find()、std :: string :: substr()を使用)。
  3. ループ行、および区切り文字''によって「std::vectorstring_numbers」に分割された各行。
  4. 「string_numbers」をループし、atoi()を使用して各string_numberをstd::vector番号に挿入します。
  5. ソート(ネット上の多くのアルゴリズム。バブルソートは非常に簡単ですが、効率的ではありませんO(n ^ 2)。より効率的な何かを実装したい場合は、マージソートO(nlogn)またはクイックソートO(nlogn)を見てください。 )平均的な場合、実装は困難ですが、はるかに高速です)。
于 2013-02-02T20:39:19.160 に答える
0

数値と並べ替えを制御するには、Standard Template Library を使用することをお勧めします。また、数値 2 と 3 が出力行の例のどこにあるのかわかりません...それはタイプミスであり、何らかの理由で並べ替えられたベクトルからこれらの数値を削除する必要はないと思います。

とにかく、私はこのようなことをします:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>

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

using namespace std;

bool mySort(int i, int j) 
{ 
    return (i < j); 
}

void printVector(vector<int> &v)
{
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";

    cout << endl;
}

void getNumbers(string &strNums)
{
    ifstream file("input.txt");
    string line;

    if (file.is_open())
    {
        while (file.good())
        {
            getline(file, line);
            strNums += line + " ";
        }

        file.close();
    }
}

void sortAndPrintNumbers(char *input)
{
    vector<int> vNums, vNumsSorted;
    char * strNum = strtok(input, " ");

    if (strNum)
        vNums.push_back(atoi(strNum));

    while (strNum)
    {
        strNum = strtok(NULL, " ");

        if (strNum)
            vNums.push_back(atoi(strNum));
    }

    // Get first 10 numbers, print them, then sort.
    for (int i = 0; i < 10 && i < vNums.size(); i++)
        vNumsSorted.push_back(vNums[i]);

    printVector(vNumsSorted);
    sort(vNumsSorted.begin(), vNumsSorted.end(), mySort);

    for (int i = 10; i < vNums.size(); i++)
    {
        vNumsSorted.push_back(vNums[i]);
        sort(vNumsSorted.begin(), vNumsSorted.end(), mySort);
        printVector(vNumsSorted);   
    }

    cout << endl;
}

int main()
{
    string strNums;

    getNumbers(strNums);

    char * pNums = new char[strNums.size() + 1];
    strcpy(pNums, strNums.c_str());

    sortAndPrintNumbers(pNums);
    delete [] pNums;
}

文字配列と文字列の交換は少し面倒ですが、Boost を使用したいのか、単に strtok ソリューションを見たいだけなのかわかりませんでした。また、並べ替えたいベクター アイテムの範囲のみを指定できるため、より洗練されたソリューションでそれを利用できます。

乾杯

于 2013-02-04T07:39:41.333 に答える