Определить, является ли возраст пенсионным - C (СИ)
Формулировка задачи:
Этот код находится в кейсе:
После я пишу вне кейса
printf("%s\n====\n", mas[0].name);
printf("%s\n====\n", mas[1].name);
printf("%s\n====\n", mas[2].name);
Причем, что странно, .zp и .year, то есть числа. Программа выводит верно, а .name и .pol всячески перемешивает...
И он выводит только последний введенный .name
В чем проблема?
Вот полный код до проблемного места:
printf("ИФО|пол|год рождения|зарплата\n"); FILE *fp = fopen("input.txt", "r"); if (fp == NULL) { v = 0; printf("Считать из файла не удалось\n"); } for (i = 0; (!feof(fp) || (i<n));i++) { mas[i].ret = new char[30]; mas[i].pol = new char[2]; mas[i].name = new char[100]; char line[200] = ""; fflush(stdin); fgets(line, 200, fp); mas[i].name = strtok(line, "|"); mas[i].pol = strtok('\0', "|"); mas[i].year = atoi(strtok('\0', "|")); mas[i].zp = atoi(strtok('\0', "|")); printf("ИФО: %s\n=======\n", mas[i].name); printf("ПОЛ: %s\n=======\n", mas[i].pol); printf("ГОД: %d\n=======\n", mas[i].year); printf("ЗП: %d\n=======\n", mas[i].zp); vozr = 2014 - mas[i].year; if ((mas[i].pol[0]=='М') && (vozr >= 57) && (vozr <= 59)) { mas[i].ret = "Близится пенсия\0"; } if ((mas[i].pol[0] == 'М') && (vozr >= 60)) { mas[i].ret = "Пенсия наступила\0"; } if ((mas[i].pol[0] == 'М') && (vozr <= 56)) { mas[i].ret = "Пенсия не скоро\0"; } if ((mas[i].pol[0] == 'Ж') && (vozr >= 52) && (vozr <= 54)) { mas[i].ret = "Близится пенсия\0"; } if ((mas[i].pol[0] == 'Ж') && (vozr >= 55)) { mas[i].ret = "Пенсия наступила\0"; } if ((mas[i].pol[0] == 'Ж') && (vozr <= 51)) { mas[i].ret = "Пенсия не скоро\0"; } }
#define _CRT_SECURE_NO_WARNINGS #include "stdafx.h" #include <Windows.h> #include <conio.h> #include <iostream> #include <string> using namespace std; struct one { char *name; char *pol; int year = 0; int zp = 0; char *ret; }; int _tmain(int argc, _TCHAR* argv[]) { SetConsoleCP(1251); SetConsoleOutputCP(1251); // вывод русских букв (только в Lucida) int i = 0; int z = 0; int y = 0; int j = 0; int pol = 0; int len = 0; int vozr = 0; int n = 0; bool chec = false; bool che = false; bool povt = false; while (!povt) { printf("Введите число сотрудников: "); n = 0; chec = false; while (chec == false) { chec = scanf_s("%d", &n); fflush(stdin); if (n < 1) { printf("Неверное значение, повторите ввод\n"); chec = false; } } one *mas = new one[n]; printf("Как заполнить данные?\n1. В ручную\n2. Считать из файла (input.txt) - каждый пункт должен быть с новой строки\n"); int v = 0; while (v == 0) { scanf_s("%d", &v); fflush(stdin); switch (v) { case 1: { for (i = 0; i < n; i++) { mas[i].ret = new char[30]; mas[i].pol = new char[2]; printf("Введите ФИО: "); mas[i].name = new char[1]; mas[i].name[0] = '\0'; char ch = 0; char *tmp = NULL; while (true) { ch = _getch(); printf("%c", ch); if (ch == 13) { printf("\n"); break; } len = strlen(mas[i].name); tmp = new char[len + 2]; strcpy(tmp, mas[i].name); tmp[len] = ch; tmp[len + 1] = '\0'; delete[]mas[i].name; mas[i].name = tmp; } printf("Укажите пол. 1 - Мужской, 2 - Женский: "); che = false; while (!che) { pol = 0; scanf_s("%d", &pol); fflush(stdin); if (pol == 1) { che = true; mas[i].pol = "М"; } if (pol == 2) { che = true; mas[i].pol = "Ж"; } if ((pol != 1) && (pol != 2)) { che = false; printf("Повторите ввод\n"); } } printf("Введите год рождения: "); che = false; y = 0; while (che == false) { che = scanf_s("%d", &y); fflush(stdin); if ((y < 1900) || (y > 2000)) { printf("Неверное значение, повторите ввод\n"); che = false; } } mas[i].year = y; printf("Введите зарплату: "); che = false; z = 0; while (che == false) { che = scanf_s("%d", &z); fflush(stdin); if (z < 1) { printf("Неверное значение, повторите ввод\n"); che = false; } } mas[i].zp = z; vozr = 2014 - mas[i].year; if ((pol == 1) && (vozr >= 57) && (vozr <= 59)) { mas[i].ret = "Близится пенсия\0"; } if ((pol == 1) && (vozr >= 60)) { mas[i].ret = "Пенсия наступила\0"; } if ((pol == 1) && (vozr <= 56)) { mas[i].ret = "Пенсия не скоро\0"; } if ((pol == 2) && (vozr >= 52) && (vozr <= 54)) { mas[i].ret = "Близится пенсия\0"; } if ((pol == 2) && (vozr >= 55)) { mas[i].ret = "Пенсия наступила\0"; } if ((pol == 2) && (vozr <= 51)) { mas[i].ret = "Пенсия не скоро\0"; } } printf("Ввод завершен\n"); break; } case 2: { printf("ИФО|пол|год рождения|зарплата\n"); FILE *fp = fopen("input.txt", "r"); if (fp == NULL) { v = 0; printf("Считать из файла не удалось\n"); } for (i = 0; (!feof(fp) || (i<n));i++) { mas[i].ret = new char[30]; mas[i].pol = new char[2]; mas[i].name = new char[100]; char line[200] = ""; fflush(stdin); fgets(line, 200, fp); mas[i].name = strtok(line, "|"); mas[i].pol = strtok('\0', "|"); mas[i].year = atoi(strtok('\0', "|")); mas[i].zp = atoi(strtok('\0', "|")); printf("ИФО: %s\n=======\n", mas[i].name); printf("ПОЛ: %s\n=======\n", mas[i].pol); printf("ГОД: %d\n=======\n", mas[i].year); printf("ЗП: %d\n=======\n", mas[i].zp); vozr = 2014 - mas[i].year; if ((mas[i].pol[0]=='М') && (vozr >= 57) && (vozr <= 59)) { mas[i].ret = "Близится пенсия\0"; } if ((mas[i].pol[0] == 'М') && (vozr >= 60)) { mas[i].ret = "Пенсия наступила\0"; } if ((mas[i].pol[0] == 'М') && (vozr <= 56)) { mas[i].ret = "Пенсия не скоро\0"; } if ((mas[i].pol[0] == 'Ж') && (vozr >= 52) && (vozr <= 54)) { mas[i].ret = "Близится пенсия\0"; } if ((mas[i].pol[0] == 'Ж') && (vozr >= 55)) { mas[i].ret = "Пенсия наступила\0"; } if ((mas[i].pol[0] == 'Ж') && (vozr <= 51)) { mas[i].ret = "Пенсия не скоро\0"; } } break; } } } printf("%d\n====\n", mas[0].zp); printf("%d\n====\n", mas[1].zp); printf("%d\n====\n", mas[2].zp);
Решение задачи: «Определить, является ли возраст пенсионным»
textual
Листинг программы
mas[i].name = strdup(strtok(line, "|")); mas[i].pol = strdup(strtok('\0', "|"));
Объяснение кода листинга программы
- Создается массив структур
mas
с двумя полями:name
иpol
. - В цикле выделяется память под два поля каждой структуры массива
mas
. - Переменная
i
инициализируется значением 0 и используется в качестве индекса для доступа к элементам массиваmas
. - Значение поля
name
каждой структуры массиваmas
присваивается результат работы функции strdup, которая выделяет память под копию строки, полученной в результате разделения строкиline
символом|
. - Значение поля
pol
каждой структуры массиваmas
присваивается результат работы функции strdup, которая выделяет память под копию строки, полученной в результате разделения строкиline
символом\0
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д