Консультация № 179431
07.07.2010, 15:16
0.00 руб.
0 2 2
Помогите пожалуйста решить следующую задачу:
Дан линейный массив целых чисел. Установить, все ли элементы этого массива различны? Выписать из линейного массива различные числа по одному разу. (Ввод/вывод осуществляется через соответствующие файлы in.txt/out.txt)
Заранее огромное спасибо за помощь.

Обсуждение

Неизвестный
07.07.2010, 18:37
общий
это ответ
Здравствуйте, Викол Василий.

Вот решение задачи с использованием ввода/вывода в стиле C:
Код:
/*
Дан линейный массив целых чисел. Установить, все ли элементы этого
массива различны. Выписать из линейного массива различные числа по
одному разу. (Ввод/вывод осуществляется через соответствующие файлы
in.txt/out.txt)
*/

#include <stdio.h>

const char szInName[] = "in.txt";
const char szOutName[] = "out.txt";

const int iMaxCount = 100;

int main()
{
// открываем файл
FILE* f = fopen( szInName,"rt" );
if( !f ) {
printf( "Ошибка при открытии файла "%s"\n", szInName );
return 1;
}

int a[iMaxCount];
int count = 0; // кол-во элементов в массиве

// читаем целые числа из файла до тех пор, пока не заполнен массив
// и не достигнут конец файла или не встретился недопустимый символ
// (в обоих случаях fscanf() вернет значение, отличное от 1, а именно, EOF или 0)
while( count < iMaxCount && fscanf( f, "%d", a+count ) == 1 )
++count;

fclose( f ); // закрываем исходный файл

if( !count ) {
printf( "Нет данных.\n" );
return 2;
}

// создаем результирующий файл
f = fopen( szOutName,"wt" );
if( !f ) {
printf( "Ошибка при создании файла "%s"\n", szOutName );
return 3;
}

fprintf( f, "%d ", a[0] ); // Первый элемент

bool bRepeated = false; // повторяющихся элементов в массиве пока нет
// каждый элемент массива, начиная со второго, сравниваем со всеми предыдущими
for( int i = 1; i < count; ++i ) {
bool bMatch = false; // текущий элемент пока не совпал ни с одним из предыдущих
int ai = a[i];
for( int j = 0; j < i; ++ j ) // сравниваем с предыдущими элементами
if( a[j] == ai ) {
bMatch = true; // совпадение
break; // дальше можно не продолжать
}

if( bMatch ) // в массиве есть повторяющиеся элементы
bRepeated = true;
else // элемент встретился первый раз
fprintf( f, "%d ", ai );
}

fprintf( f,
bRepeated ? "\nВ массиве есть повторяющиеся элементы.\n"
: "\nВсе элементы массива различны.\n" );

fclose( f ); // закрываем результирующий файл
return 0;
}

Пример исходных данных (in.txt):
Код:
1 2 3 4 5 6
12 13 14 29845 0930 20 848 58 9028 0 183
-23 -223 -89 284 902 17
20 183 -852 15

Программа протестирована в MSVC++ 6.0 и Code::Blocks 10.05 (gcc).

Успехов!
Неизвестный
07.07.2010, 19:40
общий
это ответ
Здравствуйте, Викол Василий.
Программа. C++. Тестировал MS VS 2010.
Код:
#include <locale>
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <vector>
#include <iterator>
#include <algorithm>
#include <conio.h>

using namespace std;

// Входной и выходной файлы. Укажите правильный путь для себя
const char* const IN_FILE = "./in.txt";
const char* const OUT_FILE = "./out.txt";

// Тип целые числа
typedef int data_t;
typedef vector<data_t> data_vec_t;

data_vec_t data;

// Читает файл и возвращает true если нет одинаковых

bool readFile()
{
// Открываем файл
ifstream in(IN_FILE);
if (in)
{
bool result = true;
insert_iterator<data_vec_t> ins = inserter<data_vec_t > (data, data.begin());
data_t value;
in >> value;
// Пока не конец файла
while (!in.eof())
{
// Если ошибка - исключение
if (in.fail())
{
throw runtime_error("Во входном файле встретились не верные данные.");
}
// Если нет таких
if (find(data.begin(), data.end(), value) == data.end())
{
// То добавим
ins = value;
}
else
{
result = false;
}
in >> value;
}
return result;
}
else
{
throw runtime_error("Не могу открыть входной файл.");
}
}

// Чисто для вывода в файл и на stdout
// Чтоб не писать каждый раз:
// out<<"бла-бла-бла"; cout<<"бла-бла-бла";
// Ленивый я
class out_helper
{
public:
out_helper(const char* const fileName = OUT_FILE)
{
out.open(fileName, ios_base::out | ios_base::trunc);
if (!out)
{
throw runtime_error("Не могу открыть файл для вывода.");
}
out.imbue(locale("C"));
}

template<class T>
out_helper & operator<<(const T& right)
{
out << right;
cout << right;
return *this;
}
private:
ofstream out;

out_helper(const out_helper&);
out_helper& operator=(const out_helper&);
};

int main()
{
locale::global(locale(""));

try
{
out_helper out;
out << "В файле " << (readFile() ? "нет повторяющихся элементов" : "есть повторяющиеся элементы") << "\n"
<< "Не повторяющиеся элементы:\n";

for (data_vec_t::const_iterator it = data.begin(), end = data.end(); it != end; ++it)
{
out << *it << " \t";
}
out << "\n";
}
catch (exception& ex)
{
cerr << ex.what() << endl;
}

_getch();

return 0;
}

Файл in.txt
Код:
23 12    324 45 33333354 123 23

Вывод:
Код:
В файле есть повторяющиеся элементы
Не повторяющиеся элементы:
23 12 324 45 33333354 123
5
Спасибо огромное за ответ!!!!!!!!!!!
Форма ответа