c ++ аргументы вызова сортировать arg c, argv [] - PullRequest
0 голосов
/ 14 марта 2020

Напишите программу:

a) Напишите программу, которая принимает аргументы вызова (как действительные числа) и указывает, формируют ли они отсортированную последовательность (не по возрастанию, например, 5, 5, 4, 3, 1, 1 или нисходящий, например, 1, 1, 2, 3, 3, 4),

b) если ответ из пункта a) отрицательный, выведите эту строку на консоль после сортировки .

Когда я добавляю номера консоли, например: 8 5 0 9, она сортируется хорошо -> 0 5 8 9, но когда я ставлю более 9 номеров, например 8 5 0 9 14 13, она сортируется неправильно -> 0 14 13 5 8 9.

Что не так с моим кодом?

int main(int argc, char **argv) {
    for (int i = 0; i < argc - 1; i++) {
        int pos = i;
        for (int j = i + 1; j < argc; j++) {
            if (argv[j][0] < argv[pos][0]) {
                pos = j;
            }
        }
        char *tmp = argv[i];
        argv[i] = argv[pos];
        argv[pos] = tmp;
    }
    for (int i=0; i<argc-1 ; i++) {
        cout << argv[i] << " ";
    }
    return 0;
}

Как проверить, отсортированы они или нет?

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Используйте STL <algorithm> s и std::vector всякий раз, когда можете:

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdarg.h>

bool func(int argc,...)
{
    va_list ap;
    va_start(ap, argc);
    std::vector<double> vec;

    for(int i=0; i<argc; ++i)
    {
        double dd = va_arg(ap,double);
        vec.push_back(dd);
    }
    va_end(ap);

    std::vector<double> w1(vec.begin(),vec.end());
    std::sort(w1.begin(), w1.end());

    std::vector<double> w2(w1.begin(),w1.end());
    std::reverse(w2.begin(),w2.end());

    if (vec == w1 || vec == w2)
    {
        std::cout << "sorted sequence" << std::endl;
        return true;
    }
    else
    {
        std::cout << "no sorted sequence, sorted reads: ";
        for(auto v:w1) std::cout << v << " ";
        std::cout << std::endl;
        return false;
    }
}

int main() {

    func(3,1.0,6.0,9.0); 
    func(3,7.0,6.0,9.0);
    func(3,9.0,7.0,2.0); 

    return 0;
}

Вы можете запустить код онлайн , чтобы увидеть следующий вывод:

sorted sequence
no sorted sequence, sorted reads: 6 7 9 
sorted sequence
0 голосов
/ 14 марта 2020

Я думаю, что проблема в том, что вы пытаетесь сравнивать числа, но на самом деле вы сравниваете символы.

if ( argv[j][0] < argv[pos][0] )
{
    pos = j;
}

В приведенном выше коде вы сравниваете первые символы строк в таблице ASCII. Так что, если вы сравните 5 < 14 -> оценивает значение true - это фактически сравнит 5 < 1 -> который оценивает значение false. Следовательно, вы получите неправильный вывод: 0 14 13 5 8 9 ('0' <'1' <= '1' <'5' <'8' <'9' в ASCII-коде). </p>

Решить проблема, вы должны разобрать строки (аргументы командной строки) в целые числа, а затем сравнить целые числа.

int number = std::stoi(argv[1]); //converts first string / argument in a integer

Это должно сработать сейчас.

int* nums = new int[argc - 1];

//converts strings into integerarray
for ( int i = 0; i < argc - 1; i++ )
{
    nums[i] = std::stoi( argv[i + 1] );
}

//sorts the array
std::sort( nums, nums + argc - 1 );

//prints the array
for ( int i = 0; i < argc - 1; i++ )
{
    std::cout << nums[i] << std::endl;
}
return 0;

Для сортировки я будет использовать std::sort() или что-либо готовое.

Чтобы проверить, отсортирован ли массив, также будут предопределенные функции. Я нашел std::is_sorted() например. Вы можете использовать свои собственные функции, но я бы посоветовал вам использовать проверенные и популярные функции, они сделают ваш код менее подверженным ошибкам.

bool sortedAsc( int* arr, int len )
{
    for ( int i = 0; i < len; i++ )
    {
        if ( arr[i] > arr[i] + 1 )
            return false;
    }
    return true;
}

bool sortedDesc( int* arr, int len )
{
    for ( int i = 0; i < len; i++ )
    {
        if ( arr[i] < arr[i] + 1 )
            return false;
    }
    return true;
}

В вашем коде вызовите его с помощью

int argLength = argc - 1;

if ( sortedAsc( nums, argLength ) )
{
    std::cout << "sorted ascending" << std::endl;
}
else if ( sortedDesc( nums, argLength ) )
{
    std::cout << "sorted descending" << std::endl;
}
...