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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2023, 12:44   #1
natatttt
 
Регистрация: 08.04.2023
Сообщений: 9
Вопрос Программирование С++

Требуется вывести на экран фамилию сотрудника, который был принят на работу в 1999 с помощью интерполяционного поиска. C++
Код:
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <io.h>
#include <iomanip>
using namespace std;

struct work
{
    char fio[30];   //фамилия
    int grozh;   //год рождения
    int gpost;  //год поступления на работу
    int strab;  //стаж работы
}*spisok;

int inter(work*, int, int);

int inter(work* spisok, int n, int x)
{
    int i = 0, j = n - 1, m;
    while (i <= j) //пока область поиска не будет исчерпанa
    {
        if (spisok[i].gpost == spisok[j].gpost);  //предотвращение деления на 0
        if (x == spisok[i].gpost) return i;
        else return -1;
        m = i + (j - i) * (x - spisok[i].gpost) / (spisok[j].gpost - spisok[i].gpost);
        if (spisok[m].gpost == x) return m;
        else if (x > spisok[i].gpost) i = m + 1; //убираем все элементы в правой области поиска вместе со средним
        else j = m - 1; //убираем все элементы в левой области поиска вместе со средним
    }
    return -1; //-1 - такого числа нет в массиве
}

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int i, j{}, n = 0, x = 1999;
    char fname[30], fnamet[30];
    FILE* fl;
    cout << "Введите имя файла: ";
    cin >> fname;
    cout << endl;
    if (fopen_s(&fl, fname, "wb")) //создаем бинарный файл для записи
    {
        cout << "Ошибка!" << endl; //Ошибка при создании
        return 1;
    }
    cout << "Введите количество сотрудников: ";
    cin >> n;
    cout << endl;
    spisok = new work[n];   //динамическое выделение памяти
    for (i = 0; i < n; i++)
    {
        cout << "Введите фамилию работника: ";
        cin >> spisok[i].fio;
        cout << "Введите год рождения: ";
        cin >> spisok[i].grozh;
        cout << "Введите год поступления на работу: ";
        cin >> spisok[i].gpost;
        cout << "Стаж работы: " << 2023 - spisok[i].gpost << endl; //стаж работы = текущ.год - год поступления на работу
        cout << "----------------------------------------" << endl;
        fwrite(&spisok, sizeof(work), 1, fl);
    }
    fclose(fl);
    if (fopen_s(&fl, fname, "rb")) //открываем бинарный файл только для чтения
    {
        cout << "Ошибка!" << endl; //Ошибка при открытии
        return 2;
    }
    n = _filelength(_fileno(fl)) / sizeof(work);
    cout << "Введите имя нового файла: ";
    cin >> fnamet;
    FILE* ft;
    if (fopen_s(&ft, fnamet, "w")) //создаем текстовый файл для записи
    {
        cout << "Ошибка!" << endl; //Ошибка при создании текстового файла
        return 3;
    }
    cout << endl;
    cout << "Ключ поиска (год поступления на работу): " << x << endl;
    if (inter(spisok, n, x) != -1) cout << "Сотрудник, принятый на работу в " << x << " : " << spisok->fio << endl;
    else cout << "Такого сотрудника нет в списке" << endl;
    fprintf(ft, "Ключ поиска (год поступления на работу): 1999 \n");
    fprintf(ft, "Сотрудник, принятый на работу в 1999: ", spisok[i].fio); //копируем в файл данные
    delete[]spisok; //освобождение памяти
    fclose(fl); //закрытие файла
    fclose(ft);
    return 0;
}
Помогите, пожалуйста, у меня проблема с копированием ответа в текстовый файл. В файле не выводится фамилия сотрудника
natatttt вне форума Ответить с цитированием
Старый 08.04.2023, 12:58   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
fprintf(ft, "Сотрудник, принятый на работу в 1999: %s", spisok[i].fio); //копируем в файл данные
macomics вне форума Ответить с цитированием
Старый 09.04.2023, 14:47   #3
natatttt
 
Регистрация: 08.04.2023
Сообщений: 9
По умолчанию почему то все равно не выводит ответ в фале

natatttt вне форума Ответить с цитированием
Старый 09.04.2023, 15:05   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не рассматривал правильность работы самой функции inter, но её нужно использовать так:
Код:
i = inter(spisok, n, x);
if (i != -1) {
    cout << "Сотрудник, принятый на работу в " << x << " : " << spisok[i].fio << endl;
    fprintf(ft, "Сотрудник, принятый на работу в %d: %s", x, spisok[i].fio); //копируем в файл данные
} else cout << "Такого сотрудника нет в списке" << endl;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программирование на Си++ Лана-13 Visual C++ 1 28.11.2019 03:24
Программирование sugrob89 Помощь студентам 11 26.01.2013 20:55
C++ программирование Shurochka C++ Builder 1 12.11.2012 23:59
Программирование на C++ jamik2012 Фриланс 5 14.12.2010 22:42
1С Программирование VanHelsing Свободное общение 1 03.12.2008 13:09