Форум программистов, компьютерный форум CyberForum.ru

Чтение многолинейного набора данных - C++

Восстановить пароль Регистрация
 
roanna
 Аватар для roanna
16 / 16 / 2
Регистрация: 11.11.2010
Сообщений: 88
06.03.2013, 00:57     Чтение многолинейного набора данных #1
Подскажите, пожалуйста, как осуществляется многостроковый ввод данных с клавиатуры? Пример входных данных:
C++
1
2
3
4
1 10
100 200
201 210
900 1000
На вход может подаваться от одной строки с двумя целыми числами, разделенными пробелом. Как осуществить такое множественное считывание желательно при помощи SCANF().
Никаких "введите количество строк" не может быть. Только строчки по 2 числа. Предполагаемый "конец" ввода - это пустая строка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2013, 00:57     Чтение многолинейного набора данных
Посмотрите здесь:

Чтение данных из файла C++
C++ Чтение данных из файла
C++ Чтение данных с клавиатуры
C++ чтение данных из файла
Цикл: Вывести на экран все различные элементы набора данных по возрастанию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.03.2013, 01:51     Чтение многолинейного набора данных #2
C++
1
2
int a, b;
scanf("%d%d", &a, &b);
Добавлено через 7 минут
Или нужно все строчки за один раз ввести?

Добавлено через 4 минуты
Выход при вводе символа, отличного от цифры, или при вводе больше чем N:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
    const int N = 4;
 
    int arr[N];
    int i;
    for (i = 0; i < N && scanf("%d", &arr[i]); ++i);
 
    for (int j = 0; j < i; ++j)
        printf("%d ", arr[j]);
        
    system("pause");
    return 0;
}
roanna
 Аватар для roanna
16 / 16 / 2
Регистрация: 11.11.2010
Сообщений: 88
06.03.2013, 02:08  [ТС]     Чтение многолинейного набора данных #3
В общем, это олимпиадная задача, вернее ее часть. Если интересно, можете прочитать условие: http://www.e-olimp.com.ua/problems/419 . Всю "начинку" я уже сделала и для однострочного варианта она работает идеально, как оказалось впоследствии задача тестируется при помощи многостроковости. Этого я не учла и вот теперь полвечера никак не могла добиться хорошей работы считывания без использования STRING, но со SCANF().
Все мои потуги сводились к пляскам с бубном около приблизительно такого текста:
C++
1
while(scanf("%i %i", &numb1, numb2) == 2){ ... }
Добавляла я также и %с где-то вконец строки и %[^\n] использовала. все хорошо. Только вот 80% случаев я влетаю в неограниченный цикл. И я не понимаю почему. scanf() ведь должна вернуть количество прочитаных символов, так почему при нажатии <enter> (после совершенно пустой строки) условие цикла читается вновь и вновь, и цикл начинается вновь и вновь, но не "заходит" внутрь. ЧТО ЭТО?!

Добавлено через 5 минут
Протестировала я Вашу программу, благодарю, но возможно из-за того, что я крайне устала я сейчас могу ее неправильно понять.
Так вот. Она считывает опеределенное количество чисел, в данном случае - 4, не больше и не меньше. А я не знаю, сколько их у меня может быть на вводе... Вот.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.03.2013, 02:23     Чтение многолинейного набора данных #4
Цитата Сообщение от roanna Посмотреть сообщение
Так вот. Она считывает опеределенное количество чисел, в данном случае - 4, не больше и не меньше. А я не знаю, сколько их у меня может быть на вводе... Вот.
Четыре это так, для примера. Можно 1000 поставить. Или можно использовать вектор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
 
int main()
{
    vector <int> arr;
    int n;
    for (int i = 0; scanf("%d", &n); )
        arr.push_back(n);
 
    for (int j = 0; j < arr.size(); ++j)
        printf("%d ", arr[j]);
        
    system("pause");
    return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от roanna Посмотреть сообщение
почему при нажатии <enter> (после совершенно пустой строки) условие цикла читается вновь и вновь, и цикл начинается вновь и вновь
Потому что scanf() пропускает пробельные символы (в том числе и '\n'), поэтому не получается организовать выход при вводе пустой строки.
roanna
 Аватар для roanna
16 / 16 / 2
Регистрация: 11.11.2010
Сообщений: 88
06.03.2013, 20:36  [ТС]     Чтение многолинейного набора данных #5
Почитала я и опробовала ваши алгоритмы. Вот результаты:
1. с массивом arr[n] мы сможем считывать ТОЧНОЕ кол-во элементов. Пускай, мы сделаем N=100, то и ровно сто элементов мы должны будем прочитать. Повторюсь, что на вход всегда подается разное количество элементов от 2х до ... (не знаю скольки). И это нужно учеть.
2. с вектором, у меня программа просто входить в неограниченный цикл, как и при моей реализации с while.

Если это сделать scanf'ом так геморойно, то какие могут быть другие варианты? CIN ???
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.03.2013, 22:10     Чтение многолинейного набора данных #6
Цитата Сообщение от roanna Посмотреть сообщение
Пускай, мы сделаем N=100, то и ровно сто элементов мы должны будем прочитать. Повторюсь, что на вход всегда подается разное количество элементов от 2х до ... (не знаю скольки). И это нужно учеть.
А зачем считать все строки сразу? Прочитали одну, посчитали, вывели, прочитали следующую...
C++
1
2
3
for (int a, b; std::scanf("%d %d", &a, &b) != EOF; ) {
   // ...
}
roanna
 Аватар для roanna
16 / 16 / 2
Регистрация: 11.11.2010
Сообщений: 88
06.03.2013, 23:02  [ТС]     Чтение многолинейного набора данных #7
Прочитать все строки сразу - ну это такое условие задачи, иначе она тест не пройдет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.03.2013, 00:04     Чтение многолинейного набора данных #8
Цитата Сообщение от roanna Посмотреть сообщение
1. с массивом arr[n] мы сможем считывать ТОЧНОЕ кол-во элементов. Пускай, мы сделаем N=100, то и ровно сто элементов мы должны будем прочитать.
Почему это? Ввод с клавиатуры? Вводите:
1 10
100 200
201 210
900 1000
d
Считается 8 чисел. Вводите:
1 10
100 200
201 210
900 1000
...
d
Считаются все до d, и не важно какой размер массива, лишь бы это количество туда поместилось. С вектором тоже самое, только не нужно заранее размер массива устанавливать.

Цитата Сообщение от roanna Посмотреть сообщение
2. с вектором, у меня программа просто входить в неограниченный цикл, как и при моей реализации с while.
Прежде чем что-то предложить, я это проверяю. У меня не входит, почему у вас входит? Покажите ваш код.

Добавлено через 3 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Выход при вводе символа, отличного от цифры
Почему пустой ввод Enter не сработает на выход, объяснил в 4 посте.
roanna
 Аватар для roanna
16 / 16 / 2
Регистрация: 11.11.2010
Сообщений: 88
07.03.2013, 00:21  [ТС]     Чтение многолинейного набора данных #9
Вы знакомы с системой http://www.e-olimp.com.ua ??? Есть ЗАДАЧА. Эсть ТОЧНЫЙ пример входных и выходных данных, ну и само условие. Так вот, даже если у вас будет идеальный алгоритм решения задачи, но будет какая-либо неточность при выводе - не засчитается. Это не "я ввожу", это онлайн-тестирование программы проводится, при чем я не знаю и не могу узнать, что подается на входе и что моя программа выдает на выходе, обработав эти результаты. По-этому никаких дополнительных символов, или прочитал - вывел результат не может быть.

Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Прежде чем что-то предложить, я это проверяю. У меня не входит, почему у вас входит? Покажите ваш код.
Мой код - это точный копипаст вашего. я его даже не вставляю в свою программу - просто чистый срр файл, компилятор GNU CPP.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.03.2013, 01:11     Чтение многолинейного набора данных #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Выход при вводе символа, отличного от цифры, или при вводе больше чем N:
Специально написал во втором посте. Почему - объяснил в четвёртом. А вы пробуете в моём коде выйти при вводе пустой строки? А для кого объяснения? Сразу нужно было сказать, что нужен выход из ввода только по вводу пустой строки, а не пробовать мой код.

Добавлено через 8 минут
Просто, ни через scanf, ни через cin это не сделать, потому что они пропускают '\n'. Можно сделать более сложный код. Построчное чтение, перевод групп символов, состоящих из цифр, в числа. Выход при чтении пустой строки.

Добавлено через 17 минут
Вот рабочий код. Числа должны вводиться по две в строке. Выход из ввода - при вводе пустой строки:
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
37
38
39
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cstdlib>
using namespace std;
 
int main()
{
    vector <int> arr;
    stringstream s;
    string str;
    int n1, n2;
    
    do
    {
        str.clear();
        getline(cin, str);
        if (str.empty()) break;
        
        s << str;
        s >> n1 >> n2;
        s.clear();
        
        arr.push_back(n1);
        arr.push_back(n2);
        
    } while (true);
 
    for (int j = 0; j < arr.size(); j += 2)
    {
        for (int i = j; i < j + 2 ; ++i)
            cout << arr[i] << ' ';
        cout << endl;
    }
        
    system("pause");
    return 0;
}
roanna
 Аватар для roanna
16 / 16 / 2
Регистрация: 11.11.2010
Сообщений: 88
07.03.2013, 01:24  [ТС]     Чтение многолинейного набора данных #11
Сразу нужно было сказать, что нужен выход из ввода только по вводу пустой строки
Самый первый мой пост, где была постановка задачи:
Предполагаемый "конец" ввода - это пустая строка.
Большое Вам спасибо, пошла разбираться!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2013, 01:28     Чтение многолинейного набора данных
Еще ссылки по теме:

C++ Чтение данных из консоли
Чтение данных из файла C++
Чтение данных из файла С++ C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.03.2013, 01:28     Чтение многолинейного набора данных #12
Цитата Сообщение от roanna Посмотреть сообщение
Самый первый мой пост, где была постановка задачи:
Читаю:
Цитата Сообщение от roanna Посмотреть сообщение
Предполагаемый "конец" ввода - это пустая строка.
Надеюсь не будете спорить, что между "предполагаемый" и "только" есть разница? Но это уже не важно, разобрались.
Yandex
Объявления
07.03.2013, 01:28     Чтение многолинейного набора данных
Ответ Создать тему
Опции темы

Текущее время: 05:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru