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

Пропуск первого поля структуры при заполнении очереди

10.04.2017, 23:39. Просмотров 281. Ответов 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
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
typedef struct node 
  {
    char schet1[20];  //расчетный счет плательщика
    char schet2[20];  //расчетный счет получателя
    int summa;    //перечисляемая сумма
    struct node *next;   //указатель на следующий узел
  }Node;
void first();
void add();
void del();
void display();
void length();
void clean();
int enter();
Node *head=NULL,*tail=NULL; //указатель на начало,конец =NULL
    char sch1[20];  //расчетный счет плательщика
    char sch2[20];  //расчетный счет получателя
    int sum;    //перечисляемая сумма
void main()
{
 _getch();
 enter();
}
int enter()
{
    system("cls");
    char choice;
    puts("1. Начальное формирование очереди (создание самого первого узла)");
    puts("2. Добавление нового узла в конец очереди");
    puts("3. Удаление первого узла из очереди");
    puts("4. Вывод данных из всех узлов очереди на экран");
    puts("5. Определение длины очереди");
    puts("6. Очистка очереди (удаление всех узлов)");
    puts("7. Завершение работы программы");
    while(1) {
     choice=getch();
     switch (choice) {
     case '1':
            first();
            break;
     case '2':
            add(); //Добавление элемента
            break;
     case '3':
            del(); // удаление элемента
            break;
     case '4':
            display(); // отображение элементов очереди
            break;
     case '5':
            length(); // определение длины очереди
            break;
     case '6':
            clean(); // очистка всей очереди
            break;
     case '7':
            puts(">>Завершение работы<<");
            return 0;
     default:
           system("cls");
           puts(">>Выбор не сделан,попробуйте ещё раз!<<");
           enter();
     }
     return 0;
 }
}
 
void first() {
    Node *p;
    if ((head == NULL) && (tail == NULL)) 
      { 
        p=(Node*)malloc(sizeof(Node));
 
        puts("Введите номер плательщика: \n");
        gets(sch1); //ввод строки
        strcpy_s(p->schet1, sch1);
        puts("Введите номер получателя: \n");
        gets(sch2); //ввод строки
        strcpy_s(p->schet2, sch2); 
        puts("Введите сумму платежа: \n");
        scanf("%d",&sum);
        p->summa = sum; //ввод значений
        p->next = NULL; //указатель на след элемент = NULL
        head = tail = p; //указателю конца и начала присваивается значение элемента очереди(узла)
    getch();
    enter();
      } 
   else 
        puts(">>Первый элемент уже создан<<");
    getch();
    enter();
      }
 
void add() {
    Node* p;
if ((head == NULL) && (tail == NULL)) 
{
 
  puts(">>Сначала создайте первый элемент<<"); 
  getch();
  enter();
  }
  else {
    p=(Node*)malloc(sizeof(Node));
    puts("Введите номер плательщика: \n");
    gets(sch1);
    strcpy_s(p->schet1, sch1); 
    puts("Введите номер получателя: \n");
    gets(sch2);
    strcpy_s(p->schet2, sch2);
    puts("Введите сумму платежа: \n");
    scanf("%d",&sum);
    p->summa = sum; 
    p->next=NULL;
    tail->next=p;
    tail=p;
    puts(">>элемент добавлен<<");
    getch();
    enter();
   }
}
 
void del() {
 puts(">>Удаление элемента<<");
 Node* p=head;
 if(head!=NULL) {
     head=head->next;
     if(head==NULL)
         tail=NULL;
     free(p);
}
 getch();
 enter();
}
void display() {
     Node* p=head;
    if (p==NULL)
     printf(">>Очередь пуста<<\n");
  else 
    printf(">>>>>>>>>Очередь :\n");
    while (p!=NULL) {
      printf("Номер плательщика:%s\nНомер получателя:%s\nСумма платежа:%d\n", p->schet1, p->schet2, p->summa);
      puts("___________________");
      p=p->next;
       }
getch();
enter();
}
void length(){
        Node* p = head;
        int count = 0;
        int c;
        while (p!= NULL) 
        {
                count++;
                p = p->next;
        }
printf("Длина очереди :\n%d\n\n",count);
getch();
enter();
}
void clean() {
  puts(">>Очистка очереди<<");
  if(head==NULL && tail==NULL) {
        puts(">>Очередь пуста<<");
        getch();
        enter();
   }
  else
  {
      node *p;
      while(head!=NULL && tail!=NULL)
      {
          p=head;
          head=p->next;
          delete p;
      }
      head=NULL;
      tail=NULL;
      puts(">>Очередь удалена<<");
  }
}
Добавлено через 1 час 27 минут
Нашёл способ как исправить,всё оказалось очень легко,вот готовый вариант.Добавил fflush(stdin); после ввода полей.
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
typedef struct node 
  {
    char schet1[20];  //расчетный счет плательщика
    char schet2[20];  //расчетный счет получателя
    int summa;    //перечисляемая сумма
    struct node *next;   //указатель на следующий узел
  }Node;
void first();
void add();
void del();
void display();
void length();
void clean();
int enter();
Node *head=NULL,*tail=NULL; //указатель на начало,конец =NULL
    char sch1[20];  //расчетный счет плательщика
    char sch2[20];  //расчетный счет получателя
    int sum;    //перечисляемая сумма
void main()
{
 _getch();
 enter();
}
int enter()
{
    system("cls");
    char choice;
    puts("1. Начальное формирование очереди (создание самого первого узла)");
    puts("2. Добавление нового узла в конец очереди");
    puts("3. Удаление первого узла из очереди");
    puts("4. Вывод данных из всех узлов очереди на экран");
    puts("5. Определение длины очереди");
    puts("6. Очистка очереди (удаление всех узлов)");
    puts("7. Завершение работы программы");
    while(1) {
     choice=getch();
     switch (choice) {
     case '1':
            first();
            break;
     case '2':
            add(); //Добавление элемента
            break;
     case '3':
            del(); // удаление элемента
            break;
     case '4':
            display(); // отображение элементов очереди
            break;
     case '5':
            length(); // определение длины очереди
            break;
     case '6':
            clean(); // очистка всей очереди
            break;
     case '7':
            puts(">>Завершение работы<<");
            return 0;
     default:
           system("cls");
           puts(">>Выбор не сделан,попробуйте ещё раз!<<");
           enter();
     }
     return 0;
 }
}
 
void first() {
    Node *p;
    if ((head == NULL) && (tail == NULL)) 
      { 
        p=(Node*)malloc(sizeof(Node));
 
        puts("Введите номер плательщика: \n");
        gets(sch1); //ввод строки
        strcpy_s(p->schet1, sch1);
        puts("Введите номер получателя: \n");
        gets(sch2); //ввод строки
        strcpy_s(p->schet2, sch2); 
        puts("Введите сумму платежа: \n");
        scanf("%d",&sum);
        p->summa = sum; //ввод значений
        fflush(stdin);
        p->next = NULL; //указатель на след элемент = NULL
        head = tail = p; //указателю конца и начала присваивается значение элемента очереди(узла)
    getch();
    enter();
      } 
   else 
        puts(">>Первый элемент уже создан<<");
    getch();
    enter();
      }
 
void add() {
    Node* p;
if ((head == NULL) && (tail == NULL)) 
{
 
  puts(">>Сначала создайте первый элемент<<"); 
  getch();
  enter();
  }
  else {
    p=(Node*)malloc(sizeof(Node));
    puts("Введите номер плательщика: \n");
    gets(sch1);
    strcpy_s(p->schet1, sch1); 
    puts("Введите номер получателя: \n");
    gets(sch2);
    strcpy_s(p->schet2, sch2);
    puts("Введите сумму платежа: \n");
    scanf("%d",&sum);
    p->summa = sum; 
    fflush(stdin);
    p->next=NULL;
    tail->next=p;
    tail=p;
    puts(">>элемент добавлен<<");
    getch();
    enter();
   }
}
 
void del() {
 puts(">>Удаление элемента<<");
 Node* p=head;
 if(head!=NULL) {
     head=head->next;
     if(head==NULL)
         tail=NULL;
     free(p);
}
 getch();
 enter();
}
void display() {
     Node* p=head;
    if (p==NULL)
     printf(">>Очередь пуста<<\n");
  else 
    printf(">>>>>>>>>Очередь :\n");
    while (p!=NULL) {
      printf("Номер плательщика:%s\nНомер получателя:%s\nСумма платежа:%d\n", p->schet1, p->schet2, p->summa);
      puts("___________________");
      p=p->next;
       }
getch();
enter();
}
void length(){
        Node* p = head;
        int count = 0;
        int c;
        while (p!= NULL) 
        {
                count++;
                p = p->next;
        }
printf("Длина очереди :\n%d\n\n",count);
getch();
enter();
}
void clean() {
  puts(">>Очистка очереди<<");
  if(head==NULL && tail==NULL) {
        puts(">>Очередь пуста<<");
        getch();
        enter();
   }
  else
  {
      node *p;
      while(head!=NULL && tail!=NULL)
      {
          p=head;
          head=p->next;
          delete p;
      }
      head=NULL;
      tail=NULL;
      puts(">>Очередь удалена<<");
  }
}
Добавлено через 1 час 42 минуты
Он тоже неправильно работает....Нужно перед каждым вводом в поле вставить fflush(stdin);
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2017, 23:39
Ответы с готовыми решениями:

Ввод прерывается при заполнении структуры
Всем привет. Такая вот проблема.. создал таблицу...ввожу всю первую строку...вторую...но после...

При заполнении структуры не отрабатывает строка gets
В общем, есть такой код, есть структура, проблема заключается в следующем, при заполнении структуры...

Как сделать, чтобы в форме при заполнении первого поля автоматически заполнялось второе тем же значением
Здравствуйте! имеется форма, необходимо, чтобы при вводе значения в первое поле автоматически...

Обновление одного поля таблицы, при заполнении поля в другой таблице
Друзья помогите новичку! Есть две таблицы -продажа(id продажи, сумма продажи) -скидка(id скидки,...

Крякозябры при заполнении структуры
while (true) { cout &lt;&lt; &quot;Меню: &quot; &lt;&lt; endl &lt;&lt; &quot;1. Вывести данные&quot; &lt;&lt; endl &lt;&lt; &quot;2. Добавить...

1
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
14.04.2017, 00:49 2
Как альтернативный вариант.
C
1
while( getchar() != '\n' );
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2017, 00:49

"Неожиданный" пропуск ввода при заполнении пользователем полей в массиве объектов типа "Student"
Здравствуйте. Решил создать небольшой класс &quot;Студент&quot; с массивом объектов. При первом прохождении...

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

Автозаполнение документа Word (при заполнении первого)
Подскажите, есть два документа ворд, заполняю первый и есть необходимость некоторые строки...


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

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

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