Игнорируются условные операторы =( - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задача:

Написать консольную программу которая должна выполнять следующие действия: • Если число введенных записей превышает 100, вывести сообщение о невозможности добавления новой записи в массив и предложить пользователю выйти из программы. В случае его согласия, вывести информацию о всех записях, ранее введенных в массив и выйти из программы, выполнив корректное освобождение ресурсов. • Если число введенных записей меньше 100, вывести сообщение: «Добавить новую запись? (y/n)». • Если пользователь выбирает n, вывести информацию о всех записях, ранее введенных в массив и выйти из программы, выполнив корректное освобождение ресурсов. • Если пользователь выбирает y, добавить запись в массив, введя необходимую информацию об объекте.

Проблема:

Все работает только до второй итерации. Далее условные операторы просто игнорируются.

Код:

#include <stdio.h>
#include <stdlib.h>
#define count 200
int main ()
{
    int i, cap=0;
    char y_n;
    struct worker_type
    {
        char name [count];
        char position [count];
        int year, salary;
    };
    
    worker_type*workers[100];//Массив для записи информации о сотрудниках
    while (1)
    {
        if (cap>99)
        {
            printf ("Массив переполнен. Выйти из программы?\n");
            scanf ("%c", &y_n);
            if (y_n=='y') break;
        }
        printf ("Добавить новую запись? (y/n)\nЛимит: %i/100\n", cap);
        scanf ("%c", &y_n);
        getchar();  
        if (y_n=='y' || y_n=='Y') 
        {
            workers[cap]=new worker_type;
            printf ("Ввод имени: ");
            gets (workers[cap]->name);//фамилия инициалы
            printf ("Ввод должности: ");
            gets (workers[cap]->position);//должность
            printf ("Зарплата: ");
            scanf("%i", &workers[cap]->salary);//зп
            printf ("Год поступления: ");
            scanf("%i", &workers[cap]->year);//год поступления 
            cap++;
        }//if yes
        else if (y_n=='n' || y_n=='N') break;
    }//while
    printf ("\nСписок всех сотрудников:\n");
    for (i=0;i<cap;i++) printf ("\nИмя: %s\nДолжность: %s\nЗарплата: %i\nГод поступления: %i\n\n", workers[i]->name, workers[i]->position, workers[i]->salary, workers[i]->year);
    for (i=0;i<cap;i++) delete workers[i];
    system ("pause");
}//main

Решение задачи: «Игнорируются условные операторы =(»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define count 200
int main ()
{
    int i, cap=0;
    char y_n;
    struct worker_type
    {
        char name [count];
        char position [count];
        int year, salary;
    };
    
    worker_type workers[100];//Массив для записи информации о сотрудниках
    setlocale(LC_ALL, "Rus");
    while (1)
    {
        if (cap>99)
        {
            printf ("Массив переполнен. Выйти из программы?\n");
            scanf ("%c", &y_n);
            if (y_n=='y') break;
        }
        printf ("Добавить новую запись? (y/n)\nЛимит: %i/100\n", cap);
        scanf ("%c", &y_n);
        getchar();  
        if (y_n=='y' || y_n=='Y') 
        {
            printf ("Ввод имени: ");
            gets (workers[cap].name);//фамилия инициалы
            printf ("Ввод должности: ");
            gets (workers[cap].position);//должность
            printf ("Зарплата: ");
            scanf("%i", &workers[cap].salary);//зп
            printf ("Год поступления: ");
            scanf("%i", &workers[cap].year);//год поступления 
            getchar(); // пропустить \n
            cap++;
        }//if yes
        else if (y_n=='n' || y_n=='N') break;
    }//while
    printf ("\nСписок всех сотрудников:\n");
    for (i=0;i<cap;i++) printf ("\nИмя: %s\nДолжность: %s\nЗарплата: %i\nГод поступления: %i\n\n", 
        workers[i].name, workers[i].position, workers[i].salary, workers[i].year);
    system ("pause");
}//main

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, locale.h
  2. Определяется константа count, которая задает максимальный размер массива
  3. Определяется структура worker_type, которая содержит поля для хранения информации о сотруднике: имя, должность, год поступления и зарплата
  4. Создается массив workers типа worker_type на 100 элементов
  5. Устанавливается локальная настройка для вывода русского текста с помощью функции setlocale
  6. Запускается бесконечный цикл while (1), который будет выполняться до тех пор, пока не будет достигнуто условие выхода из программы
  7. Проверяется, достиг ли размер массива своего лимита. Если да, то выводится сообщение об переполнении и предлагается выйти из программы. Если нет, то продолжается выполнение цикла
  8. Пользователю предлагается добавить новую запись в массив. Для этого выводится сообщение Добавить новую запись? (y/n) и счетчик cap, который отслеживает количество заполненных элементов массива
  9. Если пользователь вводит 'y' или 'Y', то начинается ввод информации о сотруднике: имя, должность, зарплата и год поступления
  10. Введенные данные сохраняются в соответствующих полях структуры worker_type
  11. Увеличивается значение счетчика cap на единицу, чтобы отслеживать количество заполненных элементов массива
  12. Если пользователь вводит 'n' или 'N', то цикл прерывается
  13. После окончания цикла выводится список всех сотрудников, для которых была введена информация
  14. Для каждого сотрудника выводится его имя, должность, зарплата и год поступления
  15. Программа ожидает нажатия любой клавиши, чтобы пользователь мог увидеть результаты работы программы
  16. В конце программы вызывается функция system(pause), чтобы программа не закрылась сразу после вывода результатов
  17. Завершается функция main, что приводит к завершению программы

Оцени полезность:

15   голосов , оценка 4.4 из 5
Похожие ответы