Заменить исходное расположение элементов массива на заданное - C (СИ)

Узнай цену своей работы

Формулировка задачи:

обьясните код программы Дан файл целых чисел с элементами A1, A2, …, AN (N — количество элементов в файле). Заменить исходное расположение его элементов на следующее: A1, AN, A2, AN–1, A3, … .
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
 
void main()
{
    int size=0,buf,i,len;
    int *num;
    FILE *yes;
 
    if ((yes = fopen("n.txt","r+"))==NULL)
        puts("Error!");
    else
    {   
        while (fscanf(yes, "%d", &buf) != EOF)
        size++;
        fseek(yes, 0, SEEK_SET);
 
        num=(int*)malloc(size*sizeof(int));
 
        i=0;
        while (fscanf(yes, "%d", &num[i]) != EOF)
        i++;
        fseek(yes, 0, SEEK_SET);

        if (size % 2 == 0)
            len = size/2;
        else
            len = size/2 +1;
 
        for(i=0;i<len;i++)
        {
        if (num[i]!=num[size-i-1])
            {
                fprintf(yes, "%d\t", num[i]);
                fprintf(yes, "%d\t", num[size-i-1]);
            }
        else
            fprintf(yes, "%d\n", num[i]);
        }
    }
fclose(yes);
}

Решение задачи: «Заменить исходное расположение элементов массива на заданное»

textual
Листинг программы
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
 
void main()
{
        int size=0,buf,i,len;
        int *num;
        FILE *yes;
 
        if ((yes = fopen("n.txt","r+"))==NULL)  // открываем файл n.txt для чтения и записи
                puts("Error!");  // если файл не открылся, то сообщаем пользователю
        else
        {       
                while (fscanf(yes, "%d", &buf) != EOF)   // получаем кол-во чисел в файле.
                size++;                                 
                fseek(yes, 0, SEEK_SET);  // возвращаем указатель в начало файла
 
                num=(int*)malloc(size*sizeof(int));  // выделяем память для массива значения int
 
                i=0;
                while (fscanf(yes, "%d", &num[i]) != EOF)   // теперь считиываем чила в массив 
                i++;
                fseek(yes, 0, SEEK_SET);   // возвращаемся в начало файла
 
 
                if (size % 2 == 0)  // вычисляем центральный элемент
                        len = size/2; // для четного кол-ва элементов
                else
                        len = size/2 +1; // нечетного
 
                for(i=0;i<len;i++)  // записываем числа в другом порядке
                {
                if (num[i]!=num[size-i-1])  
                        {
                                fprintf(yes, "%d\t", num[i]);
                                fprintf(yes, "%d\t", num[size-i-1]);
                        }
                else
                        fprintf(yes, "%d\n", num[i]);
                }
        }
fclose(yes);  // закрываем файл
}

Объяснение кода листинга программы

Код открывает файл n.txt для чтения и записи, считывает из него количество чисел (размер массива), выделяет память под массив и считывает числа в массив. Затем вычисляется центральный элемент и записывается в файл в обратном порядке. Если размер массива четный, то в середине будет два элемента, если нечетный - один. Код записывает элементы в файл в обратном порядке. Если элементы исходного массива повторяются, то в файл выводится только одно значение. После выполнения всех операций файл закрывается.

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы