При нажатии цифры должно выполняться действие, указанное в операторе 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 завершается.