Вопрос задан 01.05.2019 в 02:56. Предмет Информатика. Спрашивает Котова Мария.

Заполнить двоичный файл целыми числами из интервала [-3000; 8000]. Количество компонент файла

вводится с клавиатуры. Поменять местами в файле первый нечетный по значению компонент и последний четный. 1) Тест для работы 2) Написать простой алгоритм 3) Код программы 4) Скрин шот 5) Заключение (какие логические ошибки) Сделать нужно на С++
0 0
Перейти к ответам

Ответы на вопрос

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Овчинникова Алла.
#include <iostream>
#include <ctime>
using namespace std;

int main() {
    int n,m;
    FILE *fpt;
    cout<<"n = "; cin>>n;
    fpt=fopen("input.dat","wb");    
    srand(time(NULL));
// запись файла
    for (int i=0; i<n; i++) { 
       m=rand()%8000-3000; 
       cout<<m<<" ";
       fwrite(&m,sizeof(int),1,fpt);    
    }
    cout<<endl;
    fclose(fpt);
    fpt=fopen("input.dat","rb+");
    int indf=0,indl=0,vf=0,vl=0,k=0; 
// чтение файла
    while (fread(&m,sizeof(int),1,fpt)!=0) {
        k++;        
        if (!(m%2==0) && (indf==0)) { indf=k-1; vf=m; }
        if ((!m==0) && (m%2==0)) { indl=k-1; vl=m; }         
    }
    cout<<"first odd = "<<vf<<"   index = "<<indf<<endl;
    cout<<"last even = "<<vl<<"   index = "<<indl<<endl; 
// обмен первого нечетного и последнего четного
    if (indf>0) {
       fseek(fpt,sizeof(int)*indf,SEEK_SET);
       fwrite(&vl,sizeof(int),1,fpt);
    }   
    if (indl>0) {
       fseek(fpt,sizeof(int)*indl,SEEK_SET);    
       fwrite(&vf,sizeof(int),1,fpt);    
    }   
    fclose(fpt);
    system("pause");
    return 0;
}

n = 6
4368 2733 1112 2620 1941 753 
first odd = 2733   index = 1
last even = 2620   index = 3

0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Заполнение двоичного файла целыми числами из интервала [-3000; 8000]

Для заполнения двоичного файла целыми числами из интервала [-3000; 8000] и изменения местами первого нечетного по значению компонента и последнего четного компонента в файле, можно использовать следующий алгоритм:

1. Запросить количество компонент файла с клавиатуры. 2. Создать двоичный файл и открыть его для записи. 3. Сгенерировать случайные целые числа из интервала [-3000; 8000] и записать их в файл в указанном количестве компонент. 4. Закрыть файл. 5. Открыть файл для чтения и записи. 6. Найти первый нечетный по значению компонент и последний четный компонент в файле. 7. Поменять их местами. 8. Закрыть файл.

Пример простого алгоритма

1. Запросить количество компонент файла с клавиатуры. 2. Создать двоичный файл и открыть его для записи. 3. Сгенерировать случайные целые числа из интервала [-3000; 8000] и записать их в файл в указанном количестве компонент. 4. Закрыть файл. 5. Открыть файл для чтения и записи. 6. Найти первый нечетный по значению компонент и последний четный компонент в файле. 7. Поменять их местами. 8. Закрыть файл.

Пример кода программы на языке С++

```cpp #include #include #include #include

int main() { int numComponents; std::cout << "Введите количество компонент файла: "; std::cin >> numComponents;

std::ofstream file("binary_file.bin", std::ios::binary); if (!file) { std::cout << "Ошибка открытия файла!" << std::endl; return 1; }

// Запись случайных целых чисел в файл for (int i = 0; i < numComponents; i++) { int randomNumber = rand() % 11001 - 3000; // Генерация чисел из интервала [-3000; 8000] file.write(reinterpret_cast(&randomNumber), sizeof(randomNumber)); }

file.close();

std::fstream fileRW("binary_file.bin", std::ios::binary | std::ios::in | std::ios::out); if (!fileRW) { std::cout << "Ошибка открытия файла!" << std::endl; return 1; }

// Поиск первого нечетного по значению компонента и последнего четного компонента std::vector components; int component; while (fileRW.read(reinterpret_cast(&component), sizeof(component))) { components.push_back(component); }

auto firstOdd = std::find_if(components.begin(), components.end(), [](int num) { return num % 2 != 0; }); auto lastEven = std::find_if(components.rbegin(), components.rend(), [](int num) { return num % 2 == 0; });

if (firstOdd != components.end() && lastEven != components.rend().base()) { std::iter_swap(firstOdd, lastEven); }

// Запись измененных компонент обратно в файл fileRW.seekp(0); for (const auto& comp : components) { fileRW.write(reinterpret_cast(&comp), sizeof(comp)); }

fileRW.close();

std::cout << "Файл успешно обработан." << std::endl;

return 0; } ```

Заключение

В данной программе на языке C++ реализован алгоритм для заполнения двоичного файла целыми числами из интервала [-3000; 8000] и замены местами первого нечетного по значению компонента и последнего четного компонента в файле. Программа сначала генерирует случайные числа и записывает их в файл, затем находит нужные компоненты и меняет их местами. Результат сохраняется обратно в файл.

Логические ошибки: - В программе не предусмотрена обработка ошибок при открытии файла. Если файл не может быть открыт для записи или чтения, программа просто выводит сообщение об ошибке и завершается. Желательно добавить обработку таких ошибок и сообщения об ошибке для пользователя. - В программе не проверяется, что количество компонент файла, введенное пользователем, не превышает максимально возможное количество компонентов в файле. Желательно добавить проверку на допустимый диапазон количества компонентов. - В программе не предусмотрена обработка случая, когда в файле нет нечетных или четных компонентов. В этом случае программа не будет менять местами компоненты. Желательно добавить проверку на наличие нечетных и четных компонентов перед их обменом.

Примечание: Предоставленные источники не содержат информации, которая может быть использована для данного ответа.

0 0

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос