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

Проверка на заполненность/переполненность массива - C++

Восстановить пароль Регистрация
 
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
23.11.2013, 18:27     Проверка на заполненность/переполненность массива #1
Здравствуйте! Мне нужно было написать программу, которая вычисляет самую длинную последовательность из подряд идущих нулей. С этой задачей я справился:

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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
void main()
{   
    setlocale(LC_ALL,"Russian");
    int n, i, k=0, kmax=0;
    printf ("Введите число элементов массива: ");
    scanf ("%d", &n);
        int *a = new int[n]; 
    printf ("\nВведите элементы массива через пробел: ");
    for (i=0; i<n; i++)
        scanf("%d", &a[i]);
    for (i=0; i<n; i++)
    {
        if (a[i]==0)
            k=k+1;
        else 
            k=0;
        if (kmax<k)
            kmax=k;
    }
        printf("\nСамая длинная последовательность из нулей: %d", kmax);
    getch();
}
Затем преподаватель ввёл меньше элементов массива, чем указал, а потом ввёл больше. В обоих случаях программа работала некорректно. Соответственно, я получил задание на защиту: учесть случаи, когда с клавиатуры вводится больше элементов, чем было указанно и меньше и при таких ситуациях выводить сообщение: "Внимание! Введёное кол-во значений не соответствует указанному кол-ву значений!".

В нижеизложенной части кода создаётся массив размерности n (введённой с клавиатуры) и заполняется (тоже с клавиатуры). Вероятно проверка должна быть в этом "районе". Я пробовал многое, но у меня ничего не получилось. Ни мой мозг, ни яндекс, ни гугл не дали мне ответа на такую задачу.. помогите)

C++
1
2
3
4
5
6
    printf ("Введите число элементов массива: ");
    scanf ("%d", &n);
    int *a = new int[n]; 
    printf ("\nВведите элементы массива через пробел: ");
    for (i=0; i<n; i++)
        scanf("%d", &a[i]);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2013, 18:27     Проверка на заполненность/переполненность массива
Посмотрите здесь:

Проверка отсортированности массива C++
Проверка границ массива C++
C++ Проверка массива на наличие совпадающих элементов
Проверка массива на пустоту C++
Проверка массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
23.11.2013, 19:16     Проверка на заполненность/переполненность массива #2
А что значит ввел больше/меньше? цикл то n итераций выполняет...
Кликните здесь для просмотра всего текста

Цитата Сообщение от G_ Посмотреть сообщение
k=k+1;
ну и сугубо практическое замечание: тут самое место написать ++k; - красивее же)


Добавлено через 1 минуту
Ааа... он их через пробел сразу все вводит, верно?
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
24.11.2013, 05:34  [ТС]     Проверка на заполненность/переполненность массива #3
В n он указывает 6 элементов, а записывает, например, 5 или 7 через пробел =) вот.. в первом случае программа ничего не выводит, а во втором она выводит результат работы до 6 элемента х) суть в том, что нужно, чтобы программа проверяла, до конца ли мы ввели элементы в массив (тоесть заполнили его от a[0] до a[n]) и не перезаполнили ли мы его (тоесть ввели элементов больше, чем n).
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2013, 08:11     Проверка на заполненность/переполненность массива #4
Цитата Сообщение от G_ Посмотреть сообщение
В обоих случаях программа работала некорректно.
Что-то я не пойму: как у вас в массив может записаться больше чем n? Вот такое чтение:
C++
1
2
for (i=0; i<n; i++)
   scanf("%d", &a[i]);
больше чем n не запишет в массив.

Добавлено через 2 минуты
Цитата Сообщение от G_ Посмотреть сообщение
до конца ли мы ввели элементы в массив (тоесть заполнили его от a[0] до a[n])
До a[n - 1].
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
24.11.2013, 08:12     Проверка на заполненность/переполненность массива #5
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
#include <cstdio>
 
void enter(int* &arr, int &n) {
    n = 0;
    int   cnt; // количество введенных элементов
    bool flag; // флаг успеха ввода
    
    do {
        printf("Enter count(>0): ");
        scanf("%d",&n);
    }
    while (n <= 0);
    
    arr = new int[n];
    
    puts("enter array:");
    cnt = 0;
    flag = false;
    while(cnt<n) {
        flag = (scanf("%d", arr[cnt]) == 1);
        if(flag)   // если успех
        { ++cnt; } // увеличить счетчик
        else {
            if(cnt<n)
                printf("You enter %d elements only. need %d more\n", cnt, n-cnt);
            else
                flag = false;
        }
    }
    if(flag) {
        printf("You enter more than %d. Ignore it\n", n);
    }
}
 
int main() {
    int n;
    int* arr;
    enter(arr, n);
    
    for(int i = 0; i<n; ++n) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    
    delete []arr;
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2013, 09:07     Проверка на заполненность/переполненность массива #6
Cra3y, студия исключение выводит (нарушение прав доступа при записи, в enter()). Наверное, так нужно:
C++
1
flag = (scanf("%d", &arr[cnt]) == 1);
Добавлено через 7 минут
C++
1
2
3
4
for(int i = 0; i<n; ++i) 
{
    printf("arr[%d] = %d\n", i, arr[i]);
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2013, 09:10     Проверка на заполненность/переполненность массива #7
Пишет, что введено больше, хотя введено ровно сколько нужно.
Миниатюры
Проверка на заполненность/переполненность массива  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2013, 09:11     Проверка на заполненность/переполненность массива #8
Если ввести меньше, то зависает (ждёт ввода). Нерабочий код.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
24.11.2013, 09:41     Проверка на заполненность/переполненность массива #9
У меня ошибки в 20 и 40 строках
в 20й надо
C++
1
       flag = (scanf("%d", &arr[cnt]) == 1);
в 40
C++
1
for(int i = 0; i<n; ++i) {
а в общем весь мой код - большая ошибка)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2013, 09:55     Проверка на заполненность/переполненность массива #10
На больше тут не нужно проверять, цикл не даст ввести больше. А вот с меньше - проблема (для меня). Как в С++ проверить, что в буфере ввода пусто, я знаю, а как в С это можно сделать - нет. Вариант есть, но он накладывает ограничение на формат ввода (количество пробелов между числами, что после последнего числа в буфере).
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
25.11.2013, 11:13  [ТС]     Проверка на заполненность/переполненность массива #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Как в С++ проверить, что в буфере ввода пусто, я знаю
Можете поподробнее описать, с помощью чего и как можно проверить в С++?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 11:27     Проверка на заполненность/переполненность массива #12
C++
1
cin.rdbuf() ->in_avail(); // выдаст количество символов в буфере чтения
В студии работает в таком виде. Если gcc или mingw, то нужно сначала прописать:
C++
1
 ios_base::sync_with_stdio(0);
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
25.11.2013, 12:27  [ТС]     Проверка на заполненность/переполненность массива #13
Спасибо, переделал программу под С++, но теперь другая трудность.. Как мне использовать это в условии, проверяющем дозаполненность массива?
C++
1
2
//  if (cin.rdbuf() ->in_avail() < n)
//      cout << "Массив недозаполнен!";
пробовал так, не сработало.. погуглил и работу
C++
1
cin.rdbuf() ->in_avail()
не понял D:
и ещё вопрос: если условие сработает и у нас будет введено меньше значений в массиве, чем надо, то как вывести об этом сообщение и завершить выполнение последующей части кода?
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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <iostream>
using namespace std; 
void main()
{   
    setlocale(LC_ALL,"Russian");
    int n, i, k=0, kmax=0;
    bool f=true;
    cout << "Введите число элементов массива: ";
    cin >> n;
    int *a = new int[n]; 
    cout << "\nВведите элементы массива через пробел: ";
    for (i=0; i<n; i++)
        cin >> a[i];
//  if (cin.rdbuf() ->in_avail() < n)
//      cout << "Массив недозаполнен!";
    for (i=0; i<n; i++)
    {
        if (a[i]==0)
            ++k;
        else 
            k=0;
        if (kmax<k)
            kmax=k;
    }
    if (f==true)
        cout << "\nСамая длинная последовательность из нулей: " << kmax;
    getch();
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2013, 12:51     Проверка на заполненность/переполненность массива #14
C++
1
2
3
4
5
6
7
8
9
10
 cout << "\nВведите элементы массива через пробел: ";
    for (i = 0; i < n; )
    {
        cin >> a[i];
        ++i;
        if (i == n) break;
        if (cin.peek() == '\n') break;
        // if ((cin.rdbuf() ->in_avail()) == 1) break; // или так
    }
    if (i != n) cout << "Массив недозаполнен!";
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
28.11.2013, 15:56  [ТС]     Проверка на заполненность/переполненность массива #15
alsav22, спасибо вам большое, всё работает.

Цитата Сообщение от alsav22 Посмотреть сообщение
if ((cin.rdbuf() ->in_avail()) == 1)
Объясните пожалуйста, что делает эта функция D: И почему она сравнивается с единицей?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.11.2013, 16:07     Проверка на заполненность/переполненность массива #16
Цитата Сообщение от G_ Посмотреть сообщение
Объясните пожалуйста, что делает эта функция
Цитата Сообщение от alsav22 Посмотреть сообщение
cin.rdbuf() ->in_avail(); // выдаст количество символов в буфере чтения
Цитата Сообщение от G_ Посмотреть сообщение
И почему она сравнивается с единицей?
Если остался только '\n'.
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
28.11.2013, 16:32  [ТС]     Проверка на заполненность/переполненность массива #17
alsav22, получается, если остался перевод на следующую строку, то массив недозаполнен? D:
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2013, 16:49     Проверка на заполненность/переполненность массива
Еще ссылки по теме:

C++ Проверка строкового массива
проверка содержимого массива C++
C++ Создайте класс динамического массива, в котором реализована проверка выхода за границы массива

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.11.2013, 16:49     Проверка на заполненность/переполненность массива #18
Нет, это всего лишь одно из условий выхода из цикла (всё что было считано). Заполненность проверяется дальше через if (i != n). '\n' в буфере остаётся в любом случае.
Yandex
Объявления
28.11.2013, 16:49     Проверка на заполненность/переполненность массива
Ответ Создать тему
Опции темы

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