Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Гаряка Асмик
Статус: Профессионал
Рейтинг: 4467
∙ повысить рейтинг »
lamed
Статус: Профессионал
Рейтинг: 2783
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2483
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1559
Дата выхода:12.07.2010, 16:00
Администратор рассылки:Verena, Профессионал
Подписчиков / экспертов:360 / 168
Вопросов / ответов:1 / 2
IRC-канал по теме:#C

Вопрос № 179431: Помогите пожалуйста решить следующую задачу: Дан линейный массив целых чисел. Установить, все ли элементы этого массива различны? Выписать из линейного массива различные числа по одному разу. (Ввод/вывод осуществляется через соответствующие файлы ...



Вопрос № 179431:

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

Отправлен: 07.07.2010, 15:16
Вопрос задал: Викол Василий, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает amnick, Профессионал :
Здравствуйте, Викол Василий.

Вот решение задачи с использованием ввода/вывода в стиле 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; // повторяющихся элементов в массиве пока нет
// каждый элемент массива, начиная со второго, сравниваем со всеми предыдущими
f or( 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).

Успехов!

Ответ отправил: amnick, Профессионал
Ответ отправлен: 07.07.2010, 18:37
Номер ответа: 262446

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262446 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Отвечает Micren, Профессионал :
    Здравствуйте, Викол Василий.
    Программа. 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 r eadFile()
    {
    // Открываем файл
    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<<"бла-бла-бла";
    // Ленивый я
    clas s 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

    Ответ отправил: Micren, Профессионал
    Ответ отправлен: 07.07.2010, 19:40
    Номер ответа: 262452

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо огромное за ответ!!!!!!!!!!!

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262452 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное