Определить, является ли возраст пенсионным - C (СИ)

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

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

Этот код находится в кейсе:
 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";
                          }
                      }
После я пишу вне кейса 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 В чем проблема? Вот полный код до проблемного места:
#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', "|"));

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

  1. Создается массив структур mas с двумя полями: name и pol.
  2. В цикле выделяется память под два поля каждой структуры массива mas.
  3. Переменная i инициализируется значением 0 и используется в качестве индекса для доступа к элементам массива mas.
  4. Значение поля name каждой структуры массива mas присваивается результат работы функции strdup, которая выделяет память под копию строки, полученной в результате разделения строки line символом |.
  5. Значение поля pol каждой структуры массива mas присваивается результат работы функции strdup, которая выделяет память под копию строки, полученной в результате разделения строки line символом \0.

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


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

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

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