При нажатии цифры должно выполняться действие, указанное в операторе switch() - C (СИ)

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

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

Всем привет, есть вопрос: Что не так в коде, при нажатии цифры должно выполняться действие, указанное в операторе switch(), но почему-то программа неправильно работает, просто зависает и все(при следующим нажатии, не при первом). И еще, правильная ли функция добавления данных в конец файла?
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
 
#define _countEntrans 2
#define inputFile "in.txt"
 
struct Entrans
{
    char surName[25 + 1];   
    char name[25 + 1];
    int dateBirth;
    char zodiacSign[9 + 1];
    char sex[8 + 1];
    char mail[50 + 1];  
}   part[_countEntrans];
 
struct birthDate
{
    struct Entrans day;
    struct Entrans month;
    struct Entrans year;
}   part2[_countEntrans];
 
void clean();
 
void inputInFile();
 
void display();
 
void addToEnd();
 
main()
{
    FILE *_fIn;
 
    unsigned int mItem = 0;
    int i = 1, n;   
 
    system("cls");
 
    /*[menu]*/
 
        while(1)
        {
            fflush(stdin);
            printf("1. Vvid danuh.\n");
            printf("2. Vyvid danuh z faily.\n");
            printf("3. Dodatu n zapusiv v kinec faily.\n");
            /*printf("4. Dodatu n zapusiv v pochatok faily.\n");*/
            printf("4. Vuxid z programu.\n");
            printf("> ");
            scanf("%u", &mItem);
 
            if(mItem && mItem < 5)
            {
                
                if(mItem == 4)
                    break;
                switch(mItem)
                {
                    case 1: clean(); inputInFile(); break;
                    case 2: clean(); display(); break;
                    case 3: clean(); addToEnd(); break;
                }
            }
            printf("\n-------------------------------------\n");
            mItem = 0;
        }
 
    /*[/menu]*/
 
getch();
return(0);
}
 
void clean()    //clear screen
{
    system("cls");
}
 
void inputInFile()  //zapus v fail
{
    int i;
 
    FILE *_fIn;
 
    if((_fIn = fopen(inputFile, "wt")) == NULL)
    {
        printf("error, can't open %s file\n", inputFile);
        exit(0);
    }
 
    for(i = 1; i <= _countEntrans; i++)
    {
        printf("Zapus #%d\n", i);
        printf("----------------------------------------\n");
        printf("Vvedit prizvuwe %d ljudyny: ", i);
        scanf("%s", &part[i].surName);
 
        printf("Vvedit im'ya %d ljudyny: ", i);
        scanf("%s", &part[i].name);
 
        printf("Vvedit daty narodjenny %d ljudyny: \n", i);
        printf(" Vvedit den narodjennja:");
        scanf("%d", &part2[i].day.dateBirth);
        printf("  Vvedit misjac narodjennja:");
        scanf("%d", &part2[i].month.dateBirth);
        printf("   Vvedit rik narodjennja:");
        scanf("%d", &part2[i].year.dateBirth);
 
        printf("Vvedit znac zodiaky %d ljudyny: ", i);
        scanf("%s", &part[i].zodiacSign);
 
        printf("Vvedit stat %d ljudyny: ", i);
        scanf("%s", &part[i].sex);
 
        printf("Vvedit adresy %d ljudyny: ", i);
        scanf("%s", &part[i].mail);
 
    }
        
    printf("Dani u faili!\n");
    printf("--------------------------------------------\n");
    for(i = 1; i <= _countEntrans; i++)
    {
        fprintf(_fIn, "%s\n", part[i].surName);
        fprintf(_fIn, "%s\n", part[i].name);
        fprintf(_fIn, "%d.", part2[i].day.dateBirth);
        fprintf(_fIn, "%d.", part2[i].month.dateBirth);
        fprintf(_fIn, "%d\n", part2[i].year.dateBirth);
        fprintf(_fIn, "%s\n", part[i].zodiacSign);
        fprintf(_fIn, "%s\n", part[i].sex);
        fprintf(_fIn, "%s\n\n", part[i].mail);
    }
    fclose(_fIn);
}
 
void display()  //vuvod na ekran dannih iz faila
{
    int i = 1;
 
    FILE *_fIn;
 
    if ((_fIn = fopen(inputFile, "rt+")) == NULL)
    {
        printf("Error, can't open file %s", inputFile);
        exit(0);
    }   
 
    printf("Vvedeni dani:\n");
    while (!feof(_fIn))
    {
        printf("\n-----------------------------------------------");
        printf("\nPrizvuwe: ");
        fscanf(_fIn, "%s", part[i].surName);
        printf("%s", part[i].surName);
 
        printf("\nIm'ya: ");
        fscanf(_fIn, "%s", part[i].name);
        printf("%s", part[i].name);
    
        printf("\nData narodjennya(dd.mm.yyyy): ");
        fscanf(_fIn, "%d.%d.%d", &part2[i].day.dateBirth, &part2[i].month.dateBirth, &part2[i].year.dateBirth);
        printf("%d.%d.%d", part2[i].day.dateBirth, part2[i].month.dateBirth, part2[i].year.dateBirth);
 
        printf("\nZnac zodiacu: ");
        fscanf(_fIn, "%s", part[i].zodiacSign);
        printf("%s", part[i].zodiacSign);
 
        printf("\nStat: ");
        fscanf(_fIn, "%s", part[i].sex);
        printf("%s", part[i].sex);
 
        printf("\nAdresa: ");
        fscanf(_fIn, "%s", part[i].mail);
        printf("%s", part[i].mail);
 
        i++;
        if(i == (_countEntrans + 1))
            break;
    }
    fclose(_fIn);
}
 
void addToEnd() //dobavlenue v konec faila dannih
{
    int i, n;
    
    FILE *_fIn;
 
    system("cls");
    
    printf("Skilku potribno dodatu zapusiv?:\n");
    scanf("%d", &n);
 
    if( (_fIn = fopen(inputFile, "at+")) == NULL )
    {
        printf("error, can't open %s file\n", inputFile);
        exit(0);
    }   
 
    for(i = (_countEntrans + 1); i <= (_countEntrans + n); i++)
    {
        printf("Zapus #%d\n", i);
        printf("----------------------------------------\n");
        printf("Vvedit prizvuwe %d ljudyny: ", i);
        scanf("%s", &part[i].surName);
 
        printf("Vvedit im'ya %d ljudyny: ", i);
        scanf("%s", &part[i].name);
 
        printf("Vvedit daty narodjenny %d ljudyny: \n", i);
        printf(" Vvedit den narodjennja:");
        scanf("%d", &part2[i].day.dateBirth);
        printf("  Vvedit misjac narodjennja:");
        scanf("%d", &part2[i].month.dateBirth);
        printf("   Vvedit rik narodjennja:");
        scanf("%d", &part2[i].year.dateBirth);
 
        printf("Vvedit znac zodiaky %d ljudyny: ", i);
        scanf("%s", &part[i].zodiacSign);
 
        printf("Vvedit stat %d ljudyny: ", i);
        scanf("%s", &part[i].sex);
 
        printf("Vvedit adresy %d ljudyny: ", i);
        scanf("%s", &part[i].mail);
    }
 
    i = 0;
 
    for(i = (_countEntrans + 1); i <= (_countEntrans + n); i++)
    {
        fprintf(_fIn, "%s\n", part[i].surName);
        fprintf(_fIn, "%s\n", part[i].name);
        fprintf(_fIn, "%d.", part2[i].day.dateBirth);
        fprintf(_fIn, "%d.", part2[i].month.dateBirth);
        fprintf(_fIn, "%d\n", part2[i].year.dateBirth);
        fprintf(_fIn, "%s\n", part[i].zodiacSign);
        fprintf(_fIn, "%s\n", part[i].sex);
        fprintf(_fIn, "%s\n\n", part[i].mail);
    }
    fclose(_fIn);
}
Заранее спасибо)

Решение задачи: «При нажатии цифры должно выполняться действие, указанное в операторе switch()»

textual
Листинг программы
  int key;
  int flag = 1;
  
  while (flag) {
    switch (key = getchar()){
      case '1': printf("One\n"); 
              break;
      case '2': printf("Two\n");
              break;
      case 'e': printf("exit");
              flag = 0;  
              break;
      case '\n':printf("Menu option: ");
                break;                  
                
    }
  }

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

  1. Объявлены две переменные: key и flag.
  2. Переменная flag инициализируется значением 1.
  3. Запускается цикл while, который будет выполняться до тех пор, пока значение переменной flag не станет равным 0.
  4. В теле цикла происходит операция присвоения значения переменной key с помощью функции getchar().
  5. С помощью оператора switch проверяется значение переменной key.
  6. В зависимости от значения переменной key выполняется одно из действий:
    • Если значение равно '1', то выводится на экран слово One.
    • Если значение равно '2', то выводится на экран слово Two.
    • Если значение равно 'e', то переменная flag присваивается значение 0, что приводит к выходу из цикла while.
    • Если значение равно '\n', то выводится на экран строка Menu option:.
  7. В случае, если значение переменной key не соответствует ни одному из указанных вариантов, ничего не происходит.
  8. После выполнения всех действий внутри оператора switch, цикл while продолжается.
  9. Если значение переменной flag равно 0, то цикл while завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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