Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2022, 17:19   #1
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
Восклицание Структура и два файла си C++

Нужно выполнить следующее задание:
Worker: Фамилия и инициалы, Должность, Год поступления на
работу, Зарплата. Создать массив объектов. Вывести:
а) список работников, стаж работы которых на данном предпри-
ятии превышает заданное число лет;
б) список работников, зарплата которых больше заданной;
в) список работников, занимающих заданную должность.

Код:
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define Year 2022

typedef struct workers{
    char fio[20];
    char dolg[20];
    int year;
    int salary;
}work;

void print(FILE *f, work *p, int n){ //выполняет запись в файл output.txt
    for (int i = 0; i < n; i++){
        fprintf(f, "|%15s|%15s|%15i|%15i|\n", p[i].fio, p[i].dolg, p[i].year, p[i].salary);
    }
}


void main(){

	setlocale(0, "");
    work p[4];

    int n, flag = 0, flag1 = 0;
    int YEAR, SALARY; char DOLG[20]; // для сортировки структуры

	printf("Введите количество работников: ");
	scanf("%i", &n);

	for (int i = 0; i < n; i++){
            printf("ФИО, Должность, Год поступления на работу, Зарплата\n");
            scanf("%s %s %i %i", p[i].fio, p[i].dolg, &p[i].year, &p[i].salary);
	}

    FILE *f;
    f = fopen("output.txt", "w");

	print(f, p, n);

    printf("Введите кол-во лет: \n");
	scanf("%i", YEAR);

	fprintf(f, "\nПоиск по стажу: \n");

	for (int i = 0; i < n; i++){
        if ((Year - p[i].year) > YEAR){
            fprintf(f, "|%15s|%15s|%15i|%15i|\n", p[i].fio, p[i].dolg, p[i].year, p[i].salary);
            flag = 1;
            break;
        }
	}

	if (flag == 0){
        fprintf(f, "Нет работников, стаж которых превышал бы введёное число YEAR\n");
	}


    fclose(f);
}
Ошибка состоит в том, что в файл ничего не записывается. А также не доделаны пункты б) и в). Вообще желательно было сделать так, что из файла input.txt бралась бы информация, в программе как-то можно было изменить полученные данные и отправить изменившиеся данные в файл output.txt и всё это с помощью динамической памяти, но я не знаю как это реализовать.

Вводимые данные из input.txt:
Код:
VasilevDD Junior 2012 5000
LauhinDA Senior 2018 3000
Код исправлен

Но мне ещё нужно решить его через динамическую память и ввод из файла.

Последний раз редактировалось BDA; 16.03.2022 в 18:08.
Jorsan вне форума Ответить с цитированием
Старый 16.03.2022, 18:45   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Для ввода из файла: откройте файл input.txt по аналогии с output.txt, вместо scanf делайте fscanf. Для динамической памяти: вместо "work p[4];" сделайте "work *p = (work *)malloc(n * sizeof(work));" после ввода n.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.03.2022, 18:46   #3
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

А кроме освобождения памяти и этих строчек в проге не нужно ничего менять?
Jorsan вне форума Ответить с цитированием
Старый 16.03.2022, 19:07   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вроде нет, и так работает. Еще забыл, что потеряли один амперсанд "scanf("%i", &YEAR);".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.03.2022, 19:23   #5
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Да, я уже исправил, спасибо большое.
Jorsan вне форума Ответить с цитированием
Старый 16.03.2022, 19:46   #6
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Я всё-таки не понял как с input.txt работать, уж извините
Jorsan вне форума Ответить с цитированием
Старый 16.03.2022, 19:51   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Примерно так:
Код:
    FILE *f;
    f = fopen("input.txt", "r");

    printf("Введите количество работников: ");
    fscanf(f, "%i", &n);
Количество работников должно быть указано в файле в первой строке.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.03.2022, 19:55   #8
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Но как он считает остальные строчки файла, в которых и содержатся данные о работниках?
Jorsan вне форума Ответить с цитированием
Старый 16.03.2022, 20:00   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Также как и сейчас, только scanf заменить на fscanf внутри цикла. Хотя можно printf убрать, раз больше эти данные не от пользователя запрашиваются, а берутся из файла.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.03.2022, 20:16   #10
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Получился такой код, но он не рабочий, видимо, я тут намудрил
Код:
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define Year 2022

typedef struct workers{
    char fio[20];
    char dolg[20];
    int year;
    int salary;
}work;

void print(FILE *f, work *p, int n){ //выполняет запись в файл output.txt
    for (int i = 0; i < n; i++){
        fprintf(f, "|%15s|%15s|%15i|%15i|\n", p[i].fio, p[i].dolg, p[i].year, p[i].salary);
    }
}


void main(){

	setlocale(0, "");

    int n, flag = 0, flag1 = 0;
    int YEAR, SALARY; char DOLG[20]; // для сортировки структуры

    FILE *file;
    file = fopen("input.txt", "r");

    printf("Введите количество работников: ");
    fscanf(file, "%i", &n);

    work *p = (work *)malloc(n * sizeof(work));

	for (int i = 0; i < n; i++){
            fscanf("%s %s %i %i", p[i].fio, p[i].dolg, &p[i].year, &p[i].salary);
	}

    FILE *f;
    f = fopen("output.txt", "w");

	print(f, p, n);

    printf("Введите кол-во лет: \n");
	scanf("%i", &YEAR);

	fprintf(f, "\nПоиск по стажу: \n");

	for (int i = 0; i < n; i++){
        if ((Year - p[i].year) > YEAR){
            fprintf(f, "|%15s|%15s|%15i|%15i|\n", p[i].fio, p[i].dolg, p[i].year, p[i].salary);
            flag = 1;
            break;
        }
	}

	if (flag == 0){
        fprintf(f, "Нет работников, стаж которых превышал бы введёное число YEAR\n");
	}

    printf("Введите зарплату: \n");
	scanf("%i", &SALARY);

	fprintf(f, "\nПоиск по зарплате: \n");

	for (int i = 0; i < n; i++){
        if (p[i].salary > SALARY){
            fprintf(f, "|%15s|%15s|%15i|%15i|\n", p[i].fio, p[i].dolg, p[i].year, p[i].salary);
            flag = 1;
            break;
        }
	}

	if (flag == 0){
        fprintf(f, "Нет работников, зарплата которых была бы выше заданной\n");
	}

    printf("Введите должность: \n");
	scanf("%s", &DOLG);

	fprintf(f, "\nПоиск по должности: \n");

	for (int i = 0; i < n; i++){
        if (strcmp(p[i].dolg, DOLG) == 0){
            fprintf(f, "|%15s|%15s|%15i|%15i|\n", p[i].fio, p[i].dolg, p[i].year, p[i].salary);
            flag = 1;
            break;
        }
	}

	if (flag == 0){
        fprintf(f, "Нет работников на такой должности\n");
	}

    fclose(f);
}
А ещё забыл подключить #include <malloc.h>

Но всё равно не работает

Последний раз редактировалось BDA; 16.03.2022 в 20:34.
Jorsan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
S.O.S. Структура db-файла... anel1101 БД в Delphi 5 17.09.2008 15:52
Структура файла Mayor Общие вопросы Delphi 1 11.08.2008 16:45
Два XL файла, данные 1-го файла являются частью другого в формуле 2-го Кот Microsoft Office Excel 2 14.08.2007 16:56
два TMediaPlayer и два AVI-файла zeleniy Компоненты Delphi 0 01.06.2007 14:14