На основе исходного файла создать массив удвоенных нечетных чисел. Упорядочить его по возрастанию элементов
Не пойму, где ошибка, возникает одна, исправляю, возникает другая и не запускается программа. Мое условие: Сформируйте текстовый файл, содержащий 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;
}
Ответы (1 шт):
Ваши ошибки:
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";