Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
STUDENT90
0 / 0 / 1
Регистрация: 17.09.2016
Сообщений: 11
#1

Почему продолжается заполнение массива за его пределы, если я указал его размер - C (СИ)

24.09.2016, 11:45. Просмотров 205. Ответов 6
Метки нет (Все метки)

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <conio.h>
 
typedef int num;
struct Stack {
    num * n;//динамический массив данных
    int top;//индекс первого пустого элемента в массиве
    int size;// емкость массива
};
 
void create(struct Stack *s,int size)//
{
    s->n = malloc(size * sizeof(num));// выделяется необходимое кол-во памяти
    s->top = 0;
    s->size = size;
}
 
void destroy (struct Stack *s)//удаляет весь стек
{
    free(s->n);
}
 
void print(struct Stack *s)//вывод стека на экран
{
    int i;
    printf("\n СТОЯНКА: \n");
    for(i = 0; i < s->top; i++) 
    {
        printf("%d\t\n",s->n[i]);
    }
    printf("\n");
}
 
void push(struct Stack *s,num x)//добавляет элементы в массив
{
    if (s->top >= s->size) 
    {
        //s->size += 10;
        s->n = realloc(s->n,sizeof(num) * (s->size));
    }
    s->n[s->top] = x;
    s->top++;
}
 
num pop(struct Stack *s)//удаляет элемент из масссива
{
    num res = s->n[s->top - 1];
    s->top--;
    return res;
}
 
 
//int is_empty(struct Stack *s)//удаляет весь стек
//{
//
//  return s->top == 0;
//}
 
int main()
{
    int i,n,x,k,kr,kol = 0;
    char number[80];
    struct Stack st;
    setlocale(LC_ALL,"RUS");                                                      
    printf("Введите количество мест на стоянке \n");
    scanf("%d",&n);
    create(&st, n);//создается массив на n мест
    printf("Введите количество крайних мест северной стороны на стоянке \n");
    scanf("%d",&kr);
    do
    {
        printf("***********************\n * \tМеню: \n");
        printf("* 1. Приехала новая машина \n");
        printf("* 2. Печатать гараж \n");
        printf("* 3. Машина выезжает\n");
        printf("* 0. Выход\n");
        printf(" ***********************\n");
        printf("\n\tЗадайте действие: \n");
        scanf("%d",&k);
        switch(k)
        {
            case 1:
                for (i = 0;i < n;i++)
                {
                  printf("Введите номер нового авто: \n");
                  scanf("%d",&x);
                  push(&st,x);
                  kol++;
                  printf("\nАвто Добавлено!\a\n");
                  if (kol == n)
                  {
                      printf("Стоянка заполнена \n");
                  }
                  if (kol > n)
                  {
                      printf("Невозможно добавить автомобиль,т. к. автостоянка заполнена \n");
                      break;
                  }
                }
                break;
            case 2:
                print(&st);
                break;
            case 3:
                print(&st);
                for (i = 0;i < kr;i++)
                {
                    x = pop(&st);
                    printf("Автомобиль номера %d уехал с автостоянки\n",x);
                    printf("Оставшиеся машины\n");
                    print(&st);
                }
                break;
            case 0:
                exit(0);
                break;
        }
    }
    while(n!=0);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2016, 11:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему продолжается заполнение массива за его пределы, если я указал его размер (C (СИ)):

Увеличить размер массива до n+m и дозаполнить его
Создать массив размером n. Заполнить его целыми числами. После чего увеличить...

Заполнение массива и его запись в файл - разобрать пример
Доброго времени суток. Возникли проблемы с заполнением массива, и я не могу...

Если число четное, и при его деление на 2 результат будет больше 10, удвоить его
дано натуральное число n. Усли число четное и при его деление на 2 результат...

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

Если в массиве присутствует заданное значение - удалить его, иначе добавить в конец массива
Определить, есть ли в целочисленном массиве Q(10) заданное число Х, и если...

Массив структур и его заполнение
#include &lt;conio.h&gt; const int n = 7; struct person { char Strana;...

6
shvyrevvg
497 / 476 / 247
Регистрация: 12.05.2016
Сообщений: 1,389
24.09.2016, 13:16 #2
STUDENT90, в смысле за пределы? У меня, вроде, все норм.

Добавлено через 13 минут
Цитата Сообщение от STUDENT90 Посмотреть сообщение
C
1
2
3
4
5
num pop(struct Stack *s)//удаляет элемент из масссива { 
    num res = s->n[s->top - 1]; 
    s->top--; 
    return res; 
}
Тут можно так:
C
1
2
3
4
5
6
7
8
num pop(struct Stack *s)//удаляет элемент из масссива { 
    if (s->top<= 0) {
        printf("ошибка");
        //тут выход или ...
    }
    s->top--; 
    return s->n[s->top]; 
}
0
ata
269 / 241 / 186
Регистрация: 28.10.2015
Сообщений: 709
24.09.2016, 13:17 #3
Может, потому что 40 строка закомментарена?
0
STUDENT90
0 / 0 / 1
Регистрация: 17.09.2016
Сообщений: 11
24.09.2016, 13:20  [ТС] #4
Например я указываю что в массиве 6 элементов, после того как я заполню эти 6 элементов должно выдаться сообщение "Стоянка заполнена " и при последующем вводе нового элемента должно быть выдано сообщение "Невозможно добавить автомобиль, т. к. автостоянка заполнена " у меня продолжается ввод новых элементов,но ввод должен прекратиться.
0
shvyrevvg
497 / 476 / 247
Регистрация: 12.05.2016
Сообщений: 1,389
24.09.2016, 13:43 #5
Цитата Сообщение от ata Посмотреть сообщение
Может, потому что 40 строка закомментарена?
Согласен

Добавлено через 10 минут
Цитата Сообщение от STUDENT90 Посмотреть сообщение
Например я указываю что в массиве 6 элементов, после того как я заполню эти 6 элементов должно выдаться сообщение "Стоянка заполнена " и при последующем вводе нового элемента должно быть выдано сообщение "Невозможно добавить автомобиль, т. к. автостоянка заполнена " у меня продолжается ввод новых элементов,но ввод должен прекратиться.
Так у Вас if (kol > n) в цикле for. Это условие и не выполняется.
0
STUDENT90
0 / 0 / 1
Регистрация: 17.09.2016
Сообщений: 11
24.09.2016, 13:46  [ТС] #6
заполнение массива в общем все равно продолжается((
0
shvyrevvg
497 / 476 / 247
Регистрация: 12.05.2016
Сообщений: 1,389
24.09.2016, 14:02 #7
STUDENT90, уберите цикл, и заполняйте по одной машине, а то у Вас написано приехала машина, а по факту получается что их приехало n штук и проблемы не будет. Либо добавляйте if перед циклом.
1
24.09.2016, 14:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 14:02
Привет! Вот еще темы с решениями:

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

Возможно ли расчитать длину строки в пикселях, если известен шрифт, его начертание и его размер?
Привет! Пишу курсовик, суть задания в том, что нужно реализовать что-то типа...

Почему при передачи параметра(динамического массива) нельзя установить его размер через SetLength
procedure TFilter.CreateMassCheckBox(Var NameMass : array of...

Если третий элемент массива чётный, то поменять его местами с первым, иначе приравнять его последнему элементу
помогите пожалуйста с задачкой: если третий элемент массива чётный, то...


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

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

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