На основе исходного файла создать массив удвоенных нечетных чисел. Упорядочить его по возрастанию элементов

Рейтинг: 0Ответов: 1Опубликовано: 20.06.2023

Не пойму, где ошибка, возникает одна, исправляю, возникает другая и не запускается программа. Мое условие: Сформируйте текстовый файл, содержащий n целых чисел. На основе исходного файла создать массив удвоенных нечетных чисел. Упорядочить его по возрастанию элементов. Моя программа:

#include <fstream>
#include <iostream>
#include <sstream>
#include <windows.h>
 
using namespace std;
 
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    const int n = 10;
    int chislo, i, j, a[n], b[n], c, d;
    ifstream f1;
    ofstream f2;
 
    f1.open("C:\\Users\\Я\\source\\repos\\f11.txt");
    if (!f1)
    {
        cout << "Файл f11 не открывается\n";
        return 1;
    }
    if (f1.is_open())
    {
        for (i = 0; i < n; i++)
        {
            if (chislo / 2 != 0)
            {
                b[i] = a[i]*a[i];
            }
        }
        f1.close();
    }
    for (i = 0; i < n; i++) // упорядочиваем по возрастанию
    {
        c = i;
        for (j = i; j < n; j++)
            if (b[j] < b[c]) c = j;
        d = b[i];
        b[i] = b[c];
        b[c] = d;
    }
    cout << "Массив, упорядоченный по возрастанию:" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << b[i] << "\t";
    }
    cout << endl;
    return 0;
}

исправила, но выдает не верно

#include <fstream>
#include <iostream>
#include <sstream>
#include <windows.h>

using namespace std;

int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    const int n = 10;
    int chislo, i, j, a[n], b[n], d;
    ifstream f1;
    ofstream f2;

    f1.open("F:\\repos\\f11.txt");
    if (!f1)
    {
        cout << "Файл f11 не открывается\n";
        return 1;
    }
    int k = 0;
    while ((f1 >> chislo) && k <= n)
    {
        if (chislo / 2 != 1)
        {
            a[k] = chislo * 2;
        }
        else
            b[k] = chislo;
       k++;
    }

    for (i = 0; i < n - 1; i++) // упорядочиваем по возрастанию
    {
        for (j = i + 1; j < n; j++)
        {
            if (a[i] > a[j])
            {
                d = a[j];
                a[j] = a[i];
                a[i] = d;
            }
        }
    }
    cout << "Массив, упорядоченный по возрастанию:" << endl;
    for (i = 0; i < n; i++)
    {
        cout << a[i] << "\t";
    }
    cout << endl;
    return 0;
}

Ответы

▲ 0

Ваши ошибки:
1 - когда вы вводите числа из файла увеличивать счетчик нужно только при записи в массив a[]. Массив b[] вообще не нужен.
2 - четность числа определяют при помощи оператора остаток от деления %, а не делением.
3 - в цикле проверка должна быть && k < n, иначе если в файле будет более 10 нечетных чисел - будет ошибка

    int k = 0; // счетчик количества введенных чисел
    while ((f1 >> chislo) && k < n)
        if (chislo % 2 != 0) // остаток от деления на 2 
        {    
            a[k] = chislo * 2;
            k++;  // увеличивать счетчик нужно только при записи в массив a[]
        }

Сортировка в принципе написана верно, только одна ошибка - нужно перебирать не до конца массива, а до количества чисел в массиве, которое посчитали в предыдущем цикле. Иначе у вас в сортировке будут принимать участие числа, которые лежали в незанятых ячейках массива.
Ну и вместо ручной замены элементов проще использовать функцию swap()

    // упорядочиваем по возрастанию
    for (i = 0; i < k - 1; i++) // i < k - 1
        for (j = i + 1; j < k; j++)   // j < k  а не j < n
            if (a[i] > a[j])
                swap( a[i], a[j] ); // проще для понимания, сложнее допустить ошибку

Ну и при выводе массива в консоль цикл также должен быть до k

    cout << "Массив, упорядоченный по возрастанию:" << endl;
    for (i = 0; i < k; i++)  //  а не i < n
        cout << a[i] << "\t";