1 / 1 / 1
Регистрация: 19.09.2016
Сообщений: 51
1

В бинарном файле с целыми числами заменить элемент с максимальным значением на сумму двух предыдущих

02.12.2016, 00:05. Показов 4341. Ответов 10

В бинарном файле с целыми числами заменить элемент с максимальным значением на сумму двух предыдущих. А с минимальным - на сумму след. двух. Если несколько элементов имеют макс.( или мин.) значение, то рассмотреть только первый из них.

Я разобрался, как вводить и выводить ряд чисел: 1234567. Но мне нужно: 12 3 456 89. И я не могу понять, как мне потом работать с этим. Думаю, что для этого должен определятся массив целый чисел, но не знаю как это написать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <stdio.h>
 
int proverka(FILE*);
 
int main() {
    setlocale(0,"");
    FILE *output = NULL;
    int number; 
    output = fopen("output.bin", "wb");
    proverka(output);
    std::cout<<"Введите целые числа:\n";
    scanf("%d", &number);
    fwrite(&number, sizeof(int), 1, output); 
    fclose(output);
        
    FILE *input = NULL;    
    input = fopen("output.bin", "r");
    proverka(input); 
    fread(&number, sizeof(int), 1, input);
    printf("Вы ввели: %d", number);   
    
    fclose(input);
    
    return 0;
}
 
int proverka(FILE*fl){
     if (fl == NULL) {
        printf("Error opening file");        
        return 0;
    } 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2016, 00:05
Ответы с готовыми решениями:

Заменить каждый третий элемент массива на сумму двух предыдущих
В Массиве С(m) заменить каждый третий элемент на сумму двух предыдущих.

Вместо каждого элемента с нулевым значением поставить сумму двух предыдущих элементов массива
Помогите пожалуйста с задачей. Дан одномерный массив числовых значений, насчитывающий N элементов....

В заданном двоичном файле с целыми числами заменить нулями все чётные элементы
Дан двоичный файл с целыми числами. Все его четные элементы заменить нулями. Рассмотреть 2...

В массиве C (m) каждый третий элемент заменить полусумму двух предыдущих
Реализовать программу вычисления суммы элементов матрицы: В массиве C (m) каждый третий элемент...

10
Диссидент
Эксперт C
26856 / 16758 / 3675
Регистрация: 24.12.2010
Сообщений: 37,521
02.12.2016, 00:36 2
kuksik, Пишешь как бинарный ("wb") Так же и читай
C++
1
input = fopen("output.bin", "rb");
1
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
02.12.2016, 00:57 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int main() {
    setlocale(0, "");
    FILE *output = NULL;
    int number = 0, val = 0;
    output = fopen("output.bin", "wb");
    proverka(output);
    std::cout << "Введите количество чисел:\n";
    scanf("%d", &number);
    fwrite(&number, sizeof(int), 1, output);
    std::cout << "Введите целые числа:\n";
    for (int i = 0; i < number; i++)
    {       
        scanf("%d", &val);
        fwrite(&val, sizeof(int), 1, output);
    }
    fflush(stdin);
    fclose(output);
 
    FILE *input = NULL;
    input = fopen("output.bin", "rb");
    proverka(input);
 
    // читаем размер массива
    fread(&number, sizeof(int), 1, input);
    // создали массив по размеру
    int *arr = new int[number];
    // заполнили
    for (int i = 0; i < number; i++)
    {
        fread(&val, sizeof(int), 1, input);
        printf("%d ", val);
        arr[i] = val;
    }
    
 
    //---------
    delete[] arr;
    fclose(input);
    return 0;
}
1
1 / 1 / 1
Регистрация: 19.09.2016
Сообщений: 51
02.12.2016, 01:10  [ТС] 4
А можете объяснить работу 8-16 строк? Зачем два fwrite?
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
02.12.2016, 01:18 5
Сначала записали в файл количество чисел.
Нам же нужно знать сколько считывать потом при чтении файла:
C++
1
2
3
 std::cout << "Введите количество чисел:\n";
    scanf("%d", &number);
    fwrite(&number, sizeof(int), 1, output);
потом в цикле вводим эти числа, записываем в файл
C++
1
2
3
4
5
 for (int i = 0; i < number; i++)
    {       
        scanf("%d", &val);
        fwrite(&val, sizeof(int), 1, output);
    }
про чтение должно быть понятно
C++
1
2
3
4
5
6
7
8
9
10
11
    // читаем размер массива
    fread(&number, sizeof(int), 1, input);
    // создали массив по размеру
    int *arr = new int[number];
    // заполнили
    for (int i = 0; i < number; i++)
    {
        fread(&val, sizeof(int), 1, input);
        printf("%d ", val);
        arr[i] = val;
    }
1
1 / 1 / 1
Регистрация: 19.09.2016
Сообщений: 51
02.12.2016, 03:04  [ТС] 6
Ещё один вопрос. Я всё сделал, но как мне получившийся массив перезаписать в тот же файл?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <stdio.h>
using namespace std;
 
int proverka(FILE*);
 
int main() {
    setlocale(0, "");
    //      запись
    FILE *output = NULL;
    int number = 0, val = 0;
    output = fopen("output.bin", "wb");
    proverka(output);
    cout << "Введите количество чисел:\n";
    scanf("%d", &number);
    fwrite(&number, sizeof(int), 1, output);
    cout << "Введите целые числа:\n";
    for(int i = 0; i < number; i++){       
        scanf("%d", &val);
        fwrite(&val, sizeof(int), 1, output);
    }    
    fclose(output);
    
    //      вывод
    FILE *input = NULL;
    input = fopen("output.bin", "rwb");
    proverka(input);
 
    // читаем размер массива
    fread(&number, sizeof(int), 1, input);
    // создали массив по размеру
    int *arr = new int[number];
    // заполнили
    cout<<"Ваши числа:\n";
    for(int i=0; i<number; i++){
        fread(&val, sizeof(int), 1, input);
        printf("%d ", val);
        arr[i] = val;
    }
    cout<<endl;
    // ищем позицию минимума и максимума
    int min=0, max=0;
    for(int i=0; i <number; ++i){
        if(arr[max]<arr[i]){
            if(arr[max]==arr[i]) continue; 
            max=i;
        }else if(arr[min]>arr[i]){
            if(arr[min]==arr[i]) continue; 
            min=i;
        } 
    }
    //  заменяем макс   
    if(max==0){
        arr[max]=arr[number-1]+arr[number-2];
    }else if(max==1){
        arr[max]=arr[0]+arr[number-1];
    }else{
    arr[max]=arr[max-1]+arr[max-2];
    }
    //  заменяем мин 
    if(min==(number-1)){
        arr[min]=arr[0]+arr[1];
    }else if(max==(number-2)){
        arr[min]=arr[0]+arr[number-1];
    }else{
        arr[min]=arr[min+1]+arr[min+2];
    }
    //  выводим
    for(int i=0; i<number; ++i){
        cout<<arr[i]<<" ";
    }
    
    delete[] arr;
    fclose(input);
    return 0;
}
int proverka(FILE*fl){
     if (fl == NULL) {
        printf("Error opening file");        
        return 0;
    } 
}
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
02.12.2016, 03:54 7
Лучший ответ Сообщение было отмечено kuksik как решение

Решение

уже ведь есть этот участок.
впишите в конец программы
C++
1
2
3
4
5
6
7
output = fopen("output.bin", "wb");
    proverka(output);
    fwrite(&number, sizeof(int), 1, output);
    for(int i = 0; i < number; i++){       
        fwrite(&arr[i], sizeof(int), 1, output);
    }    
    fclose(output);

разнес по функциям

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <stdio.h>
using namespace std;
 
bool proverka(FILE*);
void writeToFile(FILE* outf, int *arr, int number);
void readFromFile(FILE* inf, int *arr, int &number);
void print(int *arr, int number);
void funct(int *arr, int number);
 
 
int main() {
    setlocale(0, "");
    //      запись
    FILE *output = NULL;
    int number = 0, val = 0;
    output = fopen("output.bin", "wb");
    proverka(output);
    cout << "Введите количество чисел:\n";
    scanf("%d", &number);
    // создали массив по размеру
    int *arr = new int[number];
    cout << "Введите целые числа:\n";
    for (int i = 0; i < number; i++) {
        scanf("%d", &val);
        arr[i] = val;
    }
    writeToFile(output, arr, number);
 
    fclose(output);
 
    //      вывод
    FILE *input = NULL;
    input = fopen("output.bin", "rb");
    proverka(input);
    readFromFile(output, arr, number);
    print(arr, number);
    fclose(input);
 
 
    // ищем позицию минимума и максимума
    funct(arr, number);
    print(arr, number);
 
    //      запись
    output = fopen("output.bin", "wb");
    proverka(output);
    writeToFile(output, arr, number);
    fclose(output);
 
    delete[] arr;
 
    return 0;
}
bool proverka(FILE*fl) {
    if (fl == NULL) {
        printf("Error opening file");
        return false;
    }
    return true;
}
 
void writeToFile(FILE* outf, int *arr, int number)
{
    // размер
    fwrite(&number, sizeof(int), 1, outf);
    //потом массив одним блоком
    fwrite(&arr, sizeof(int) * number, number, outf);
}
 
void readFromFile(FILE* inf, int *arr, int &number)
{
    // читаем размер массива
    fread(&number, sizeof(int), 1, inf);
    // заполнили
    fread(&arr, sizeof(int) * number, number, inf);
}
void print(int *arr, int number)
{
    //  выводим
    for (int i = 0; i<number; ++i) {
        cout << arr[i] << " ";
    }
    cout << endl;
}
 
void funct(int *arr, int number)
{
    int min = 0, max = 0;
    for (int i = 0; i <number; ++i) {
        if (arr[max]<arr[i]) {
            if (arr[max] == arr[i]) continue;
            max = i;
        }
        else if (arr[min]>arr[i]) {
            if (arr[min] == arr[i]) continue;
            min = i;
        }
    }
    //  заменяем макс   
    if (max == 0) {
        arr[max] = arr[number - 1] + arr[number - 2];
    }
    else if (max == 1) {
        arr[max] = arr[0] + arr[number - 1];
    }
    else {
        arr[max] = arr[max - 1] + arr[max - 2];
    }
    //  заменяем мин    
    if (min == (number - 1)) {
        arr[min] = arr[0] + arr[1];
    }
    else if (max == (number - 2)) {
        arr[min] = arr[0] + arr[number - 1];
    }
    else {
        arr[min] = arr[min + 1] + arr[min + 2];
    }
 
}
1
sourcerer
02.12.2016, 07:22
  #8
 Комментарий модератора 
kuksik, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 4.3 (порядок именования тем).
0
1 / 1 / 1
Регистрация: 19.09.2016
Сообщений: 51
02.12.2016, 10:15  [ТС] 9
Как Вы меня выручили! Спасибо большое!)
0
1 / 1 / 1
Регистрация: 19.09.2016
Сообщений: 51
09.12.2016, 16:57  [ТС] 10
John999, а если нужно вывести из обычного файла значения в двумерный массив?
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
09.12.2016, 18:42 11
запись
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    FILE *output = NULL;
        int i = 0, j =0;
        const   int ROW = 3, COL = 4;
 
        double matrix [ROW][COL] = {{6.78,5,89,0.123},
                                    {9,8,456.2,5},
                                    {9,9.0,8.9,9.1} };
 
        output = fopen("myfile.txt", "w");
        // запись
        // количество строк
        fprintf(output, "%d", ROW);
 
        fputs(" ", output);
        // количество столбцов
        fprintf(output, "%d", COL);
 
        fputs(" ", output);
 
        // затем вся матрица
        for (i = 0; i < ROW; i++)
        {
            for (j = 0; j < COL; j++)
            {
                fprintf(output,"%.3lf ", matrix[i][j]);
            }
        }
        fclose(output);
чтение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    FILE *input = NULL; 
 
        int rRow = 0, rCol = 0;
        int i = 0, j = 0;
 
        double **otherMatrix;
 
        input = fopen("myfile.txt", "r");
        // чтение
        // количество строк
        fscanf(input, "%d", &rRow);
        // количество столбцов
        fscanf(input, "%d", &rCol);
 
        otherMatrix = new double*[rRow];
 
        for (i = 0; i < rRow; i++)
            otherMatrix[i] = new double[rCol];
 
 
        // чтение  матрицы
        for (i = 0; i < rRow; i++)
        {
            for (j = 0; j < rCol; j++)
            {
                fscanf(output, "%lf", &otherMatrix[i][j]);
                printf("%.3lf ", otherMatrix[i][j]);
            }
            printf("\n");
        }
 
        // удаление матрицы
        for (i = 0; i < rRow; i++)
        {
            delete[] otherMatrix[i];
        }
        delete[] otherMatrix;
 
        fclose(input);
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2016, 18:42
Помогаю со студенческими работами здесь

В массиве A[m] каждый второй элемент заменить произведением двух предыдущих
Помогите разобраться что я делаю не так. Я пока не делаю запись массива в файл, разбираюсь как...

В массиве C (m) каждый третий элемент заменить на полусумму двух предыдущих элементов
Что не так? #include&lt;conio.h&gt; #include&lt;windows.h&gt; #include&lt;stdlib.h&gt; #include&lt;stdio.h&gt; int...

Последний элемент каждой строки заменить на сумму предыдущих
Последний элемент каждой строки заменить на сумму предыдущих Не могу понять, как это сделать:( ...

В массиве каждый третий элемент заменить полусуммой двух предыдущих (с использованием указателей)
Заранее большое спасибо.(написать программу с использованием указателей)

Заменить все элементы массива с максимальным значением на сумму цифр минимального элемента
Дан целочисленный массив А. Заменить все элементы массива с максимальным значением на сумму цифр...

Заменить все элементы массива с максимальным значением на сумму цифр минимального элемента
Дан массив A.Заменить все элементы массива с максимальным значением на сумму цифр минимального...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru