Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2014, 23:45   #1
filimoncc
 
Регистрация: 17.02.2014
Сообщений: 9
По умолчанию Дан одномерный массив элементов. Необходимо вывести все не повторяющиеся элементы

Дан одномерный массив элементов. Необходимо вывести все не повторяющиеся элементы.
Использовать можно библиотеки string, iostream.
filimoncc вне форума Ответить с цитированием
Старый 01.03.2014, 12:32   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Программа подсчета различных букв в слове: http://acmp.ru/article.asp?id_text=138
8Observer8 вне форума Ответить с цитированием
Старый 01.03.2014, 13:20   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Если речь идёт об удалении дубликатов, то вот этот пример с целыми числами посмотрите: http://www.cplusplus.com/reference/a...m/unique_copy/

Допустим у нас во входном файле хранится массив целых чисел:

input.txt
Цитата:
1 5 2 4 4 4
После работы программы в выходном файле буду только уникальные числа:

output.txt
Цитата:
1 5 2 4
Обработку данных делает эта функция:

Код:
/**
 * Возвращает массив с удалёнными дубликатами
 * 
 * @param inputArr Массив целых чисел
 * @param outputArr Возвращает массив с удалёнными дубликатами
 */
void uniques(const std::vector<int>& inputArr, std::vector<int>& outputArr) {
    outputArr.resize( std::distance(inputArr.begin(), inputArr.end()) );
    outputArr = inputArr;
    std::sort( outputArr.begin(), outputArr.end() );
    std::vector<int>::iterator it;
    it = std::unique_copy( inputArr.begin(), inputArr.end(), outputArr.begin() );
    outputArr.resize( std::distance(outputArr.begin(), it) );
}
8Observer8 вне форума Ответить с цитированием
Старый 01.03.2014, 13:20   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Вот весь код:

Код:
/* 
 * File:   main.cpp
 * Author: Ivan
 *
 * Created on March 1, 2014, 1:13 PM
 */

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm> // std::unique_copy, std::sort, std::distance

int readData(const std::string& iFileName, std::vector<int>& arr);
int writeResult(const std::string& oFileName, const std::vector<int>& arr);
int showError(int err, const std::string& fileName);
void uniques(const std::vector<int>& inputArr, std::vector<int>& outputArr);

int main(int argc, char** argv) {

    // Массив для хранения входных данных
    std::vector <int> inputArr;

    // Массив для хранения выходных данных
    std::vector <int> outputArr;

    // Имя входного файла
    std::string iFileName = "input.txt";

    // Читаем данные из файла
    int err = readData(iFileName, inputArr);
    if (err) return showError(err, iFileName);

    // Выполняем содержательную часть
    uniques(inputArr, outputArr);

    // Записываем выходной файл
    std::string oFileName = "output.txt";
    err = writeResult(oFileName, outputArr);
    if (err) return showError(err, oFileName);

    return 0;
}

/**
 * Читаем данные из файла
 * 
 * @param iFileName Имя входного файла
 * @param vec Массив, в который будут считаны входные данные
 * @return Код ошибки: 0 - если ошибок нет
 *                     1 - если файл не удалось открыть
 *                     2 - если в файле некорректные данные
 */
int readData(const std::string& iFileName, std::vector<int>& arr) {

    // Открываем файл с входными данными
    std::ifstream in;
    in.open(iFileName.c_str());
    if (!in.is_open()) {
        return 1;
    }

    // Читаем данные из файла
    int value, err = 0;
    std::string input;
    while (in >> input) {
        if (std::stringstream(input) >> value) {
            arr.push_back(value);
        } else {
            err = 2;
            break;
        }
    }

    // Закрываем файл и возвращаем код ошибки
    in.close();
    return err;
}

/**
 * Записываем результат выходной в файл
 * 
 * @param iFileName Имя выходного файла
 * @param vec Массив, который нужно записать в файл
 * @return Код ошибки: 0 - если ошибок нет
 *                     1 - если файл не удалось открыть
 *                     2 - если в файле не удалось записать
 */
int writeResult(const std::string& oFileName, const std::vector<int>& arr) {

    // Открываем файл для записи
    std::ofstream out;
    out.open(oFileName.c_str());
    if (!out.is_open()) {
        return 1;
    }

    // Записываем данные в файл
    for (int i = 0; i < arr.size(); ++i) {
        out << arr[i] << std::endl;
        if ( i < (arr.size()-1) ) {
            out << " ";
        } else {
            out << std::endl;
        }
    }

    // Закрываем файл и возвращаем код ошибки
    out.close();
    return 0;
}

/**
 * Выводит текст с ошибкой на экран
 * 
 * @param err Код ошибки
 * @param iFileName Имя файла, в котором произошла ошибка
 */
int showError(int err, const std::string& fileName) {
    switch (err) {
        case 1:
            std::cerr << "Error: could not open the file " << fileName.c_str() << std::endl;
            break;
        case 2:
            std::cerr << "Error: incorrect data in the file " << fileName.c_str() << std::endl;
            break;
        default:
            std::cerr << "Error code: " << err << "; file name: " << fileName.c_str() << std::endl;
            break;
    }

    return err;
}

/**
 * Возвращает массив с удалёнными дубликатами
 * 
 * @param inputArr Массив целых чисел
 * @param outputArr Возвращает массив с удалёнными дубликатами
 */
void uniques(const std::vector<int>& inputArr, std::vector<int>& outputArr) {
    outputArr.resize( std::distance(inputArr.begin(), inputArr.end()) );
    outputArr = inputArr;
    std::sort( outputArr.begin(), outputArr.end() );
    std::vector<int>::iterator it;
    it = std::unique_copy( inputArr.begin(), inputArr.end(), outputArr.begin() );
    outputArr.resize( std::distance(outputArr.begin(), it) );
}

Последний раз редактировалось 8Observer8; 01.03.2014 в 13:24.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дан массив X(11). Поделить все элементы данного массива на минимальный (включая его) и вывести результат в таком порядке в каком б Кан Паскаль, Turbo Pascal, PascalABC.NET 1 26.12.2013 09:29
Дан массив из n элементов. Удалить из массива все элементы, встречающиеся ровно два раза Koroleva_E Помощь студентам 0 02.05.2013 13:50
Дан одномерный массив. Удалить все элементы последовательности значения,которые кратны k Кристюша5 Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2012 21:46
1)Дан одномерный массив В,состоящий из 2n элементов.Переставить его элементы по следующему правилу b[1],b[n+1],b[2],b[n+2],.....b[ Vinam* Паскаль, Turbo Pascal, PascalABC.NET 4 24.12.2011 16:39