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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2022, 13:02   #1
himecu
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 32
По умолчанию Переставить в обратном порядке компоненты файла предшествующие минимальному

Здравствуйте, у меня возникла проблема.Ввести числовой файл F . Переставить в нём все компоненты, предшествующие минимальной в обратном порядке. Задача:определить на какой позиции находится максимум уже в изменном файле. Файл вывести до и после преобразования. Можете подсказать, в чем ошибка?
Код:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    FILE *f;
    f=fopen("1.txt","w");
    cout<<"\nVvod file:";
    int i=0,b;
    cout<<"\nVvod 0-go komponenta ili 555 ";
    cin>>b;
    while (b!=555)
    {
        fwrite(&b,sizeof(b),1,f);       
        i++;
        cout<<"\nVvod "<<i<<"-go komponenta ";
        cin>>b;
    }
    fclose(f);
    f=fopen("1.txt","r");
    cout<<"\nVivod file:";
    while (fread(&b,sizeof(b),1,f))
    {
        cout<<"\t"<<b;
    } 
    fseek(f, 0L, SEEK_SET);
    fclose(f);
    
    f=fopen("1.txt","r");
    int min=999, imin=0;
    while (fread(&b,sizeof(b),1,f)) 
        if(b<min){
            min=b;
            imin=ftell(f);
        } fclose(f);
        
    f=fopen("1.txt","r+");
    int a;
    for(int i=0; i<imin/2; i++)
        {
        fseek(f, (imin)*sizeof(b), SEEK_SET);
        fread(&b,sizeof(b),1,f);        
        fseek(f, (imin-i-1)*sizeof(b), SEEK_SET);
        fread(&a,sizeof(a),1,f);        
        fseek(f, (imin)*sizeof(b), SEEK_SET);
        fwrite(&a,sizeof(a),1,f);       
        fseek(f, (imin-i-1)*sizeof(b), SEEK_SET);
        fwrite(&b,sizeof(b),1,f);       
        }
    fclose(f);
    f=fopen("1.txt","r");
    cout<<"\nVivod file:";
    while (fread(&b,sizeof(b),1,f))
        cout<<"\t"<<b;
}
himecu вне форума Ответить с цитированием
Старый 08.05.2022, 13:30   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от himecu Посмотреть сообщение
Код:
int min=999, imin=0;
    while (fread(&b,sizeof(b),1,f)) 
        if(b<min){
            min=b;
            imin=ftell(f);
        }
Минимальным элементом стоит считать первый элемент в файле, а не значение из головы.
Представьте, что все введенные значения в файле больше 999. В вашем случае ваше значение из головы будет минимумом, а позиция будет указывать на 0 элемент, хотя он не будет минимальным.
Код:
int min, imin;
    if (fread(&b,sizeof(b),1,f)) {
            min=b;
            imin=0;
    }
    while (fread(&b,sizeof(b),1,f)) 
        if(b<min){
            min=b;
            imin=ftell(f) - sizeof(b); /* иначе вы сохраняете позицию в файле следующего за прочитанным элементом */
        }
Цитата:
Сообщение от himecu Посмотреть сообщение
Код:
for(int i=0; i<imin/2; i++)
i у вас считает элементы, а imin байты

Последний раз редактировалось macomics; 08.05.2022 в 13:36.
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 20:16   #3
himecu
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 32
По умолчанию

macomics, все исправил как вы сказали, но не работает
Код:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    FILE *f;
    f=fopen("1.txt","w");
    cout<<"\nVvod file:";
    int i=0,b;
    cout<<"\nVvod 0-go komponenta ili 555 ";
    cin>>b;
    while (b!=555)
    {
        fwrite(&b,sizeof(b),1,f);       
        i++;
        cout<<"\nVvod "<<i<<"-go komponenta ";
        cin>>b;
    }
    fclose(f);
    f=fopen("1.txt","r");
    cout<<"\nVivod file:";
    while (fread(&b,sizeof(b),1,f))
    {
        cout<<"\t"<<b;
    } 
    fseek(f, 0L, SEEK_SET);
    fclose(f);
    
    f=fopen("1.txt","r");
    int min, imin;
    if(fread(&b,sizeof(b),1,f)) {
        min = b;
        imin=0;
    }
    while (fread(&b,sizeof(b),1,f)) 
        if(b<min){
            min=b;
            imin=ftell(f) - sizeof(b);
        } fclose(f);
        
    f=fopen("1.txt","r+");
    int a;
    for(int i=0; i<i/2; i++)
        {
        fseek(f, (imin)*sizeof(b), SEEK_SET);
        fread(&b,sizeof(b),1,f);        
        fseek(f, (imin-i-1)*sizeof(b), SEEK_SET);
        fread(&a,sizeof(a),1,f);        
        fseek(f, (imin)*sizeof(b), SEEK_SET);
        fwrite(&a,sizeof(a),1,f);       
        fseek(f, (imin-i-1)*sizeof(b), SEEK_SET);
        fwrite(&b,sizeof(b),1,f);       
        }
    fclose(f);
    f=fopen("1.txt","r");
    cout<<"\nVivod file:";
    while (fread(&b,sizeof(b),1,f))
        cout<<"\t"<<b;
}
himecu вне форума Ответить с цитированием
Старый 08.05.2022, 21:43   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Вы исправили не так как я сказал
Цитата:
Сообщение от macomics Посмотреть сообщение
i у вас считает элементы, а imin байты
это значит что надо так
Код:
for (i = 0, imin/=sizeof(b); i <imin/2; i++)
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать в файл g компоненты файла f в обратном порядке tane Помощь студентам 4 31.01.2014 23:54
Записать в файл G компоненты файла F в обратном порядке slay334 Помощь студентам 1 29.03.2013 14:50
Переставить буквы в обратном порядке Julia2707 Помощь студентам 6 10.03.2013 22:07
Переставить в обратном порядке столбцы mimit Помощь студентам 1 30.11.2012 00:06
сожмите одномерный массив, удалив предшествующие минимальному 689jj Помощь студентам 2 20.11.2012 11:03