Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
1

Построчный числовой ввод данных в массив

11.02.2013, 09:57. Показов 7106. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Пожалуйста, подскажите возможный вариант реализации на c++ следующего алгоритма:

- объявляется массив a[SHORT_INT];
- элементы массива вводятся построчно. После перехода на новую строку выводится индекс последнего введенного элемента, после чего начинается ввод данных в новый массив. Может быть введено любое количество элементов (от 0 до 32768).


Например (код, увы, неработоспособен):

C++
1
2
3
4
5
6
7
8
9
10
11
12
int a[32768],k=0;
for (unsigned short int i=0;i<32768;i++)
{
     do
     {
          cin>>a[k]
          k++;
     }
     while (cin!="\n");
     break;
}
cout<<k; // индекс последнего введенного элемента
Не могу понять, как определить момент, когда выполняется переход на новую строку.

Добавлено через 15 часов 29 минут
Update
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2013, 09:57
Ответы с готовыми решениями:

Формат ввода: как осуществить построчный ввод?
Здравствуйте я решаю олимпиадные задачи, но я не понял как вводить 2 строку? Через пробел или...

Числовой ввод
Можете пожалуйста подсказать как реализовать функцию, которая с помощью _getch() принимает только...

Ввод данных в массив
Пользователь вводит число например 1010111000111110000111100111111101111111. Каждое цифра этого...

Проверка числовой ли ввод
Здравствуйте! Задача такая. Написать программу, читающую в массив double до 10 значений...

15
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
11.02.2013, 10:08 2
я не понял, массив двухмерный чтоли?
0
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
11.02.2013, 11:42  [ТС] 3
Tiva, массив не двухмерный.

Объявляется одномерный массив целочисленных элементов (см. представленный код).

Задача определить, когда будет выполнен переход на новую строку, который завершит ввод данных в массив. После этого операцию можно будет повторить над следующим одномерным массивом и т.д.
0
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
13.02.2013, 11:08  [ТС] 4
Рассматриваю альтернативное решение. Вначале вводится строка, после чего над ней выполняется необходимый набор действий.

Однако при выводе строки первый символ затирается. По всей видимости виноват символ перехода на новую строку. Справится с ним не удается:

C++
1
2
3
4
5
6
    for (unsigned short int j=0;j<m;j++)
    {
        cin>>s;
        getline(cin,s);
        cout<<s<<endl;
    }
Добавлено через 13 часов 54 минуты
Update
0
8 / 8 / 4
Регистрация: 21.12.2012
Сообщений: 121
13.02.2013, 16:13 5
Сформулируй понятнее задачу

Цитата Сообщение от VicenteValtiery Посмотреть сообщение
- элементы массива вводятся построчно.
это как через пробел?

1 2 45 67 28 21

потом при нажатии на Enter вводим в массив
числа
a[0] =1;
a[1] = 2;
a[3] =45;
a[4] = 67;
и тд.?

или

вводим числа

22222222222222222222222

нажимаем на Enter
a[0]=22222222222222222222222;
потом вводим:
11111111111
нажимаем на Enter
a[1]=11111111111;
0
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
13.02.2013, 16:41  [ТС] 6
anklbenz, вариант 1. Числа вводятся через пробел.
0
8 / 8 / 4
Регистрация: 21.12.2012
Сообщений: 121
13.02.2013, 18:47 7
на скорую руку топором

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;        
 
int main(){
    int const a_size = 100;
    int a[a_size]={0};   // твой массив целых чисел заполняем нулями
 
      int const str_size = 255; 
     char str[str_size]; // массив символов которые вводит юзер
    
    char temp[10];// временный массив для отделения числа
    int t=0;
    int m=0;
 
    bool empty=true; 
    
    cout<<"Enter Numbers:"<<endl;
    cin.getline(str, str_size);
 
    for(int i=0; i<str_size;i++) // проверяем введенную строку посимвольно
         {
           if(str[i]>='0' && str[i]<='9') //если  символ i строки, которую вводит пользователь, ЧИСЛО
            {
             temp[t]=str[i]; // записываем символ во временный массив
             t++;            
             empty=false;   //временный массив не пустой
            }
             else // если  символ i строки, которую вводит пользователь, НЕ ЧИСЛО
            {
               if(!empty) // и временный массив не пустой
               {
               a[m]=atoi(temp); //atoi - переводит  строку в int
               m++;
              
               for(int j=0; j<10; j++) temp[j]=' '; //отчищаем  временный массив
               t=0;
               empty=true; // вневременный массив пустой
               }
            }
         }
    cout<<endl;
 
// выводим на экран 
for(int i=0;i<a_size;i++)
    if(a[i]!=0)
    cout<<a[i]<<endl;
 
 
cout<<"Last element - "<<m<<endl; // индекс последнего введенного элемента
system("pause>null");
return 0;
 
}
1
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
13.02.2013, 21:11  [ТС] 8
anklbenz, спасибо за интересную реализацию! Но у меня не отрабатывает
C++
1
cin.getline(str, str_size);
Сразу же выводится массив нулевой.

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
    int a[100000];
    unsigned short q=0,r=0;
    char str[10000000],temp[10];
    bool empty=true;
        cin.getline(str,10000000);
        for (signed int j=0;j<10000000;j++)
        {
            if ((str[j]>='0' && str[j]<='9') || (str[j]=='-'))
            {
                temp[q]=str[j];
                q++;
                empty=false;
            }
            else
            {
                if(!empty)
                {
                    a[r]=atoi(temp);
                    r++;
                    for (unsigned short int p=0;p<10;p++) temp[p]=' ';
                    q=0;
                    empty=true;
                }
            }
        }
    for (unsigned int i=0;i<10000000;i++)
    {
        if (a[i]!=-858993460) cout<<a[i]<<' ';
    }
0
8 / 8 / 4
Регистрация: 21.12.2012
Сообщений: 121
13.02.2013, 21:14 9
ты же символы можешь вводить
значит обрабатывается
0
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
14.02.2013, 10:22  [ТС] 10
Тут интересная дилемма. Если сохранить тот код, который я опубликовал в своем сообщении, то все работает хорошо.

Но перед getline у меня вводится еще несколько переменных. Тоже через cin. Если этот ввод убрать, то все в порядке. Но если он сохраняется, то getline не срабатывает.

Вот этот код уже не работает. После ввода переменной xxx окно консоли закрывается:

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
    int a[100000],xxx;
    unsigned short q=0,r=0;
    char str[10000000],temp[10];
    bool empty=true;
    cin>>xxx;
        cin.getline(str,10000000);
        for (signed int j=0;j<10000000;j++)
        {
            if ((str[j]>='0' && str[j]<='9') || (str[j]=='-'))
            {
                temp[q]=str[j];
                q++;
                empty=false;
            }
            else
            {
                if(!empty)
                {
                    a[r]=atoi(temp);
                    r++;
                    for (unsigned short int p=0;p<10;p++) temp[p]=' ';
                    q=0;
                    empty=true;
                }
            }
        }
    for (unsigned int i=0;i<100000;i++)
    {
        if (a[i]!=-858993460) cout<<a[i]<<' ';
    }
Добавлено через 13 часов 2 минуты
Update
0
8 / 8 / 4
Регистрация: 21.12.2012
Сообщений: 121
14.02.2013, 16:19 11
C++
1
2
3
4
5
6
после 
cin>>xxx;
поставь
cin.get();
потом и используй свои
cin.getline
1
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
14.02.2013, 19:14  [ТС] 12
Спасибо! Все отлично работает! Очень помогли!
0
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
14.02.2013, 19:17 13
Красивее можно.
C++
1
2
3
4
5
6
7
8
9
10
11
string s;
int a[100] = {}, n = 0;
 
while (getline(cin, s))
{
  istringstream iss (s, istringstream::in);
  int t;
 
  while (iss >> t)
    a[n++] = t;
}
1
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
14.02.2013, 19:36  [ТС] 14
Очень здорово у Вас получилось! Буду пробовать работать с этим решением! Единственное, что не удается - это остановить процесс ввода. После нажатие Enter все равно продолжается ввод данных в массив.
0
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
14.02.2013, 20:42 15
VicenteValtiery, введите Ctrl-Z, это символ конца ввода.
1
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 19
15.02.2013, 10:32  [ТС] 16
Спасибо!!
0
15.02.2013, 10:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2013, 10:32
Помогаю со студенческими работами здесь

Проверка данных на ввод в массив
Есть задание, которое сформулировано так :&quot;Напишите функцию поиска такого значения элемента массива...

Ввод данных в массив с клавиатуры
Ребят помогите.Нужен код , который бы заполнял массив с клавиатуры 3х4 . Вот код ввода данных с...

Ввод с клавиатуры данных в массив
Нужна помощь, 1)Определить класс с именем AEROFLOT, содержащий след поля: название пункта...

Ввод с клавиатуры данных в массив
Написать программу выполняющую след. действия: -ввод с клавиатуры данных в массив состоящий из...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru