Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
syggestor
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 19
1

Вывод числа из файла с двумерным массивом, но только один раз

28.10.2013, 23:08. Просмотров 1321. Ответов 31
Метки нет (Все метки)

Здравствуйте. уважаемые форумчане.

Имеется такая проблема (в литературе пока решения не встречал и в интернетах тоже).

Есть инпут файл в расширении "тхт". В нем записан массив, например такой:

1234
1234
1234
1234

Необходимо взять, допустим, цифру 1, выполнить над ней какое-нить действие (оно абсолютно не важно) и записать результат в аутпут файл.
НО!
Необходимо, чтобы действие производилось только над первой встреченной единицей, а последующие единицы исключались и цикл переходил бы к другой цифре (например к 2) и ее тоже использовал лишь один раз, пока не использовал бы последнюю цифру и не завершался бы.

Заранее благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 23:08
Ответы с готовыми решениями:

Получить все числа, входящие в последовательность только один раз
Даны массив целых чисел. Получить все числа, входящие в последовательность...

Выбрать из файла те символы, которые встречаются в нем только один раз
#include <iostream> #include <fstream> #include <algorithm> #include...

Функции для работы с двумерным массивом: ввод, вывод, транспонирование
Написать функции для работы с двумерным массивом. Первая - для ввода элементов...

Повторяющиеся числа из первого массива занести во второй массив только один раз
#include <stdio.h> #include <iostream> #include <cstdlib> using namespace...

Выбрать из текста только те символы, которые встречаются в нем только один раз
Здравствуйте, помогите пожалуйста написать программу:) Условие. Дана строка,...

31
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
28.10.2013, 23:27 2
создаёшь функцию void , в аргументе твоя единица или то, над чем ты там делаешь дела))
функция открывает файл, считывает его в массив, сравнивая с контрольной 1, если встречает, то записывает вместо неё то что тебе надо, потом записывает этот массив в файл. Массив можно сделать и const, если размерность файла неизвестна, то считать , посчитать размерность, создать через new массив и считывать всё в него.
Ну или взять какие-нибудь готовые библиотечки, если он есть, и не запариваться над этим)
0
syggestor
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 19
29.10.2013, 00:55  [ТС] 3
Прошу прощения, но немного не понимаю конечный синтаксис функции void.
Относительно недавно начал изучать с++, поэтому некоторые вещи мне не очевидны и правильный синтаксис еще не уложился в голове.
Когда я пишу void f (1), то получаю такую ошибку 'f' : illegal use of type 'void' и еще : incomplete type is not allowed.
Вот сам код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
 
void main() {
 
ifstream in;
ofstream out;
int i;
void f(1);
in.open("Input.txt", ios::in);
out.open("Output.txt", ios::out);
 
 
while(in>>f) {
    if(i == 1)
out<< "sdfsdfs"<<"\n";
}
in.close();
out.close();
 
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
29.10.2013, 01:18 4
Такие вопросы:
1) только числа или буквы и знаки препинания также?
2) можно ли сначала записать все элементы, а потом производить над ними действия и записывать в файл?

Вам в любом случае нужен динамический контейнер, например std::vector. Но я бы советовал std::unordered_set. Это множество, которое хранит уникальные элементы без упорядоченности (а она нам и не нужна). Но если компилятор не поддерживает последний стандарт, то тогда std::set. Он упорядочивает элементы, но также хранит лишь уникальные.

Если STL чуждо, то готовьтесь к нетривиальному решению, ведь тогда придется написать свой аналог самоадресующейся структуры, например бинарного дерева.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.10.2013, 01:19 5
Задание очень расплывчато.
Цитата Сообщение от syggestor Посмотреть сообщение
В нем записан массив, например такой:
Такой - это какой?
Цитата Сообщение от syggestor Посмотреть сообщение
Необходимо взять, допустим, цифру 1,
Допустим - это как понимать?
Цитата Сообщение от syggestor Посмотреть сообщение
и цикл переходил бы к другой цифре (например к 2)
Напримаер - как понимать? Как выбирается цифра (или число?) для перехода?
Цитата Сообщение от syggestor Посмотреть сообщение
пока не использовал бы последнюю цифру
Последнюю цифру в каком смысле?
Нет универсального кода, для универсального формата файла. Всё должно быть точно описано, тогда можно думать, как это сделать.
0
syggestor
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 19
29.10.2013, 07:31  [ТС] 6
Двумерный массив- в теме он описан:
1234
1234
1234
1234

Числа выбираются по порядку и один раз использованная цифра исключается из дальнейшего рассмотрения.

Дойдя до правого нижнего угла массива (последнее число массива), ну или до последней цифры, которая бы не использовалась еще ни разу.
0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
29.10.2013, 08:27 7
Цитата Сообщение от syggestor Посмотреть сообщение
ifstream in;
ofstream out;
int i;
void f(1);
in.open("Input.txt", ios::in);
out.open("Output.txt", ios::out);
Начнём с того, что функции нельзя определять в других функциях, т.е. до main или после(но тогда нужен её прототип) во вторых выглядит она примерно так
C++
1
2
3
4
void f(int x) // где x - аргумент с которым она вызывается, т.е. 1 2 3 итд 
{
// тело функции
}
а вообще почитай если таких элементарных вещей не знаешь, я так понимаю что это какая-то задача на зачёт в универе)
если вечером будет время то я могу написать готовый код, но условия размыты, т.е. напиши чётко что надо.
0
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,721
29.10.2013, 09:17 8
Цитата Сообщение от MrGluck Посмотреть сообщение
Вам в любом случае нужен динамический контейнер, например std::vector.
абсолютно не нужен
допустим задействованы цифры 0-9

1 создаем булевый массив размером в 10 элементов
2 инициализируем все элементы false
3 считываем из файла цифру
4 проверяем элемент массива на значение (массив[цифра])
если true то к пункту 7
5 записываем в массив значение true
6 выполняем какие то действия
7 проверяем эта последняя цифра в файле, если нет то к пункту 3
8 выход


можно убыстрить этот алгоритм
проверять массив на заполненность,(между 6 и 7 пунктом)
если все цифры уже использованы, а до конца файла еще далеко
C++
1
2
3
4
5
bool res=true;
for(int i=0;i<10;i++)
   res&=arr[i];
if(res)
 // выход
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
29.10.2013, 12:16 9
Цитата Сообщение от ValeryS Посмотреть сообщение
абсолютно не нужен
допустим задействованы цифры 0-9
так для того и спросил:
Цитата Сообщение от MrGluck Посмотреть сообщение
1) только числа или буквы и знаки препинания также?
условие очень расплывчатое. Я предлагал решение если в файле будут любые символы.
0
syggestor
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 19
29.10.2013, 12:30  [ТС] 10
Вечернем подробно распишу всё, за на работе просто))
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.10.2013, 15:30 11
Цитата Сообщение от syggestor Посмотреть сообщение
Двумерный массив- в теме он описан:
1234
1234
1234
1234
Если данные в файле такие, то, для выполнения вашего задания, достаточно обработать, посимвольно, первую строку и на этом зкончить. Такое решение устраивает?

Не по теме:

Задачу сформулировать не можете, а хотите решения...

0
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,721
29.10.2013, 18:50 12
Цитата Сообщение от MrGluck Посмотреть сообщение
так для того и спросил:
Сообщение от MrGluck 1) только числа или буквы и знаки препинания также?
увеличь массив на количество знаков препинания
в идеале можно вообще массив сделать размером в 256,тогда и цифры и буквы и непечатные символы
0
syggestor
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 19
29.10.2013, 19:50  [ТС] 13
alsav22, этот массив лишь примерный...цифры могут быть в рандомном порядке, но длина строки и количество этих строк может быть любым: от 10 символов на строку, до миллиона или двух.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.10.2013, 20:08 14
Пишите:
Цитата Сообщение от syggestor Посмотреть сообщение
например такой:
Спрашиваю:
Цитата Сообщение от alsav22 Посмотреть сообщение
Такой - это какой?
Отвечаете:
Цитата Сообщение от syggestor Посмотреть сообщение
Двумерный массив- в теме он описан:
1234
1234
1234
1234
Теперь оказывается:
Цитата Сообщение от syggestor Посмотреть сообщение
этот массив лишь примерный...цифры могут быть в рандомном порядке, но длина строки и количество этих строк может быть любым: от 10 символов на строку, до миллиона или двух.
Что мешало сразу написать? Даже на уточнение ответили, что вот, как в первом посте. Понимаете, что от того какие данные в файле и как они записаны, всё решение и зависит?
0
Alex_Skripa
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
29.10.2013, 20:17 15
Если я правильно понял это задание то alsav абсолютно прав можно просто просмотреть каждую строку посимвольно, если конечно там не может быть пробелов между цифрами,
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.10.2013, 21:31 16
В файле:
3982345923
0432145
33333333333333
0912343456
71209
45321234567890
12345
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <fstream>
using namespace std;
 
void f(char ch)
{
    cout << ch << ' ';
}
 
int main ()
{
    ifstream fin("dat.txt");
    if (fin)
    {
        int digit[10] = {0};
        char ch;
        int n = 0;
        while (fin >> ch)
        {
            if (digit[ch - '0'] == 0)
            {
                digit[ch - '0'] = 1;
                f(ch);
                ++n;
                if (n == 10) break;
            }
            else continue;
        }
    }
    else cout << "Error!" << endl;
    
    cout << endl;
    
    system("pause");
    return 0;
}
0
Миниатюры
Вывод числа из файла с двумерным массивом, но только один раз  
syggestor
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 19
29.10.2013, 22:17  [ТС] 17
dzrkot, пишу условие более развёрнуто.

Сама конечная прога будет существенно сложнее, но до этого надо еще дожить, поэтому разбираюсь с ней блоками и пытаюсь усложнить поэтапно.

Сейчас она может взять массив из одного текстового файла, произвести операцию над каждым числом и записать результат в аккуратный двумерный массив в другом текстовом файле.

Теперь необходимо (в идеале), чтобы она могла:

1) пропустить всякий текст и цифры, которые могут быть написаны выше исходного массива типа:

тра-ля-ля
12.10.2005

1234
2431
3241
1243

и начать работать непосредственно с массивом. То-есть, чтобы могла пропустить весь мусор, написанный до массива (удалять этот мусор в ручную не резонно).

2) необходимо, чтобы прога брала число из массива, превращала его, например вот в это:

рр 1212
пп 235

записывала этот результат в другой текстовый файл. Далее, чтобы исходное число исключалось из рассмотрения и прога переходила бы к другому числу (всего чисел будет четыре: 1, 2, 3 и 4). И, допустим, если следом за единицей шла бы двойка, ну или четверка (это не важно), то над ней производилось бы свое действие и результат записывался бы следом за предыдущим результатом как-то так:

рр 1212
пп 235

вв 15788
уу 5221
л1 45874

ну и т.п.

Т.е. каждому числу исходного массива соответствует определенный набор букв и цифр.

Это пока текущая задача.

Далее прога должна уметь вот что.
Имеется некая фигура в пространстве (например куб). Куб нарублен на маленькие кубики, имеющие размер стенок, например, 1 см. Каждому кубику соответствует число, отражающее цвет этого кубика. Массив строится по принципу:

В строку пишутся цифры по икс.
В столбик-по у.
Допустим:

1234
1234

По икс тут идет 1234, по игрек 11, 22, 33, 44. Далее идет следующий слой:

1)1234
2)1234
3)1234
4)1234

Тут уже 2 слоя- второй слой начинается с третьей строки. Расстояние между слоями, как мы помним-1 см. Именно это расстояние придает этим плоскостям объем.
Массив может иметь разное количество чисел по оси x и по y, если речь идет о параллелепипеде. Но рассматриваем куб.
Необходимо, чтобы прога оценивала количество кубиков (цифр) в ряду, понимала координату каждого кубика, например, координата левого верхнего кубика: i=1, j=1; а следующий элемент имеет координату i=1, j=2. Ну и зная размеры кубиков, чтобы прога могла определить расстояние до левой грани от нуля (который расположен либо на правой грани, либо в центре куба….-без разницы). Это же касается и правой грани и верхней и нижней и дальней от нас и ближней к нам. Результат записать примерно так:

По оси x левая грань расположена в R см от нуля (где R – динамическая величина и зависит от количества чисел в массиве).
По оси y левая грань расположена в R см от нуля (где R – динамическая величина и зависит от количества чисел в массиве).

рр 1212
пп 235

вв 15788
уу 5221
л1 45874

Как-то так. Прога с извратом Критична пока первая часть этого текста про использование чисел один раз.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
29.10.2013, 22:31 18
Цитата Сообщение от ValeryS Посмотреть сообщение
увеличь массив на количество знаков препинания
в идеале можно вообще массив сделать размером в 256,тогда и цифры и буквы и непечатные символы
А есть гарантии в том, что в тексте 256 различных символов и не более? Да и городить все возможные варианты не используя их - бессмысленно.
0
syggestor
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 19
29.10.2013, 22:38  [ТС] 19
Только цифры или буквы с описанием, типа что расположено в массиве по оси икс, а что расположено по оси игрек, какие габариты у кубиков, из которых состоит большой куб. Просто инфа о массиве, которую надо обойти и перейти непосредственно к массиву.
0
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,721
29.10.2013, 22:47 20
Цитата Сообщение от MrGluck Посмотреть сообщение
А есть гарантии в том, что в тексте 256 различных символов и не более?
вообще то ansi текст состоит из элементов типа char а тот имеет значения 0-255
Цитата Сообщение от MrGluck Посмотреть сообщение
Да и городить все возможные варианты не используя их - бессмысленно.
а я и не предлагал все варианты, я предлагал только цифры(кстати alsav22, реализовал это, только массив не булевый а интовый)
а использовать вектор не бессмыслено???
сначала забили массив потом отсортировали
если хочется контейнеров то в этой задаче Мап сам собой напрашивается

Добавлено через 4 минуты
syggestor,
меняй формат файла не просто безликие цифры а типа такого
слой 1-
куб1:/здесь размеры/
куб2:/здесь размеры/
и потом анализируй файл - это знак слоя : знак куба
ну или какие другие придумай
можно использовать теги(как в HTML)
и логика твоей программы поменяется
т.е сначала продумай формат файла
0
29.10.2013, 22:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2013, 22:47

Напечатать только те буквы слов, котрые встречаются в обоих словах только один раз
Помогите решить в Borland c++ Если можно еще блок-схему Заданы два слова....

Напечатать только те буквы слов, которые встречаются в обоих словах только один раз
Пожалуйста помогите!!!!задача на строки на С.Даны 2 слова.Напечатать только те...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru