При нажатии цифры должно выполняться действие, указанное в операторе 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; } }
Объяснение кода листинга программы
- Объявлены две переменные:
key
иflag
. - Переменная
flag
инициализируется значением 1. - Запускается цикл while, который будет выполняться до тех пор, пока значение переменной
flag
не станет равным 0. - В теле цикла происходит операция присвоения значения переменной
key
с помощью функцииgetchar()
. - С помощью оператора switch проверяется значение переменной
key
. - В зависимости от значения переменной
key
выполняется одно из действий:- Если значение равно '1', то выводится на экран слово
One
. - Если значение равно '2', то выводится на экран слово
Two
. - Если значение равно 'e', то переменная
flag
присваивается значение 0, что приводит к выходу из цикла while. - Если значение равно '\n', то выводится на экран строка
Menu option:
.
- Если значение равно '1', то выводится на экран слово
- В случае, если значение переменной
key
не соответствует ни одному из указанных вариантов, ничего не происходит. - После выполнения всех действий внутри оператора switch, цикл while продолжается.
- Если значение переменной
flag
равно 0, то цикл while завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д