21

Re: Ввід матриці з файлу в С*

1 тема - 1 проблема + на форумі уже вирішено питання по ротації матриці.

22

Re: Ввід матриці з файлу в С*

keithfay написав:

1 тема - 1 проблема + на форумі уже вирішено питання по ротації матриці.

Вирішення Hanter'а не можу сумістити з своєю задачею!

23

Re: Ввід матриці з файлу в С*

http://replace.org.ua/topic/512/

24

Re: Ввід матриці з файлу в С*

keithfay написав:

http://replace.org.ua/topic/512/

Ввід матриці з файлу в С
Проблема зчитування!

25

Re: Ввід матриці з файлу в С*

Anddep написав:

Проблема зчитування!

А детальніше?

26 Востаннє редагувалося Anddep (28.01.2013 14:48:37)

Re: Ввід матриці з файлу в С*

Не можу написати код для зчитування!
Пробував вже всілякі методи, результат практично один!

Коли в in файлі є

1 2
3 4

То треба зчитати так, щоб Був масив A[N][N] і щоб А[1][1]=1 [1][2]=2.....

27

Re: Ввід матриці з файлу в С*

То треба зчитати так, щоб Був масив A[N][N] і щоб А[1][1]=1 [1][2]=2.....

Ви впевнені, що саме A[1][1]=1, а не A[0][0] = 1?

28

Re: Ввід матриці з файлу в С*

A[0][0] = 1

Ви праві!
Але суть така ж!
Допоможете ?

29

Re: Ввід матриці з файлу в С*

Уривок нашвидкуруч. Аналогічний я уже кидав, тут хіба кілька уточнень для роботи з масивами.

const int MAX_SIZE = 1024;

int iRow = 0, jCol = 0, newItem = 0;
int matrix[2*N][2*N] = {0};
char strBuf[MAX_SIZE] = {0};
char strItem[MAX_SIZE] = {0};


 while(!feof(fp))
    {
        fgets(strBuf, MAX_SIZE-1, fp);
        strItem = strtok(strBuf, "\t "); // as a delimiter - tabulation or space
        while(strItem)
        {
            newItem = atoi(strItem);
            matrix[iRow][jCol] = newItem;
 
            jCol++;
            strItem = strtok(0, "\t ");
        }
        
        memset(strBuf, 0, MAX_SIZE);
        memset(strItem, 0, MAX_SIZE);
 
        iRow++;
    }

Розмірність масиву тут не контролюється - будьте уважні. Але це нескладно додати, якщо вимагатиметься.

30 Востаннє редагувалося Anddep (28.01.2013 15:59:07)

Re: Ввід матриці з файлу в С*

Дякую, але діло в тому, що розмірність якраз потрібна, бо програма( та, яку я надсилав) повертає матрицю власне по порядкових номерах!
При змозі, гляньте в той код!

Адже в С важко відділити кожен елемент масиву, що зчитаний з файлу!
А програма повинна бути на С

31

Re: Ввід матриці з файлу в С*

Anddep написав:

Дякую, але діло в тому, що розмірність якраз потрібна, бо програма( та, яку я надсилав) повертає матрицю власне по порядкових номерах!
При змозі, гляньте в той код!

Адже в С важко відділити кожен елемент масиву, що зчитаний з файлу!
А програма повинна бути на С

Замініть

const int MAX_SIZE = 1024;

на

#define MAX_SIZE 1024

і маєте чистий С.

Так підійде?

Прихований текст
#define MAX_SIZE 1024

int iRow = 0, jCol = 0, newItem = 0;
int matrix[2*N][2*N] = {0};
char strBuf[MAX_SIZE] = {0};
char strItem[MAX_SIZE] = {0};
 
 
 while(!feof(fp))
    {
        fgets(strBuf, MAX_SIZE-1, fp);
        strItem = strtok(strBuf, "\t "); // as a delimiter - tabulation or space
        jCol = 0;
        while(strItem)
        {
            newItem = atoi(strItem);
            matrix[iRow][jCol] = newItem;
 
            jCol++;
            if(jCol >= 2*N) //check horizontal dimension
                break;
            
            strItem = strtok(0, "\t ");
        }
        
        memset(strBuf, 0, MAX_SIZE);
        memset(strItem, 0, MAX_SIZE);
 
        iRow++;
        if(iRow >= 2*N)//check vertical dimension
            break;
    }

32

Re: Ввід матриці з файлу в С*

Так, це вайже те, що ви надсилали попередньо!
Проблема: Як його "з'єднати" з моїм кодом!
Бо в мене це не виходить!

33

Re: Ввід матриці з файлу в С*

От робоча реалізація. Алгоритм тих диво-циклів з кількома матрицями не чіпав, за винятком початкової ініціалізації матриці A, яка читається з файлу. Робота з пам'яттю наведена на С++, бо маллочити на чистому С не маю ані настрою, ані часу.

Прихований текст
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define MAX_SIZE    1024

int main()
{   int i,j,k,m,q=0;
    int N;

    printf("N=");
    scanf ("%d",&N);
    
    int **A = new int*[2*N];
    int **B1 = new int*[2*N];
    int **B2 = new int*[2*N];
    int **B3 = new int*[2*N];
    int **B4 = new int*[2*N];
    
    for(int i = 0; i<2*N; A[i]=new int[2*N],
                          B1[i]=new int[2*N],
                          B2[i]=new int[2*N],
                          B3[i]=new int[2*N],
                          B4[i]=new int[2*N],
                          memset(A[i], 0, 2*N*sizeof(int)),
                          memset(B1[i], 0, 2*N*sizeof(int)),
                          memset(B2[i], 0, 2*N*sizeof(int)),
                          memset(B3[i], 0, 2*N*sizeof(int)),
                          memset(B4[i], 0, 2*N*sizeof(int)),
                          i++);
    
    /* Read from file */
    {
        int iRow = 0, jCol = 0, newItem = 0;
        char strBuf[MAX_SIZE] = {0};
        char* strItem;
         
         FILE *fp = fopen("input.txt", "r");
         if(!fp)
            return 1;
         
         while(!feof(fp))
            {
                fgets(strBuf, MAX_SIZE-1, fp);
                strItem = strtok(strBuf, "\t"); // as a delimiter - tabulation
                jCol = 0;
                while(strItem)
                {
                    newItem = atoi(strItem);
                    A[iRow][jCol] = newItem;
         
                    jCol++;
                    if(jCol >= 2*N) //check horizontal dimension
                        break;
                    
                    strItem = strtok(0, "\t");
                }
                
                memset(strBuf, 0, MAX_SIZE);
         
                iRow++;
                if(iRow >= 2*N)//check vertical dimension
                    break;
            }
        fclose(fp);
    }

    
    printf("\nOld matrix\n");
    for(i=0;i<2*N;i++)
    {
        for(j=0;j<2*N;j++, q++)      
            printf("%d   ",A[i][j]);
            
        printf("\n");
    }

    for(i=0;i<N;i++)
            for(j=0;j<N;j++)
                    B1[i][j]=A[i][j];

    for(i=0;i<N;i++)
            for(j=N,m=0;j<2*N;j++,m++)
                    B2[i][m]=A[i][j];

    for(i=N,k=0;i<2*N;i++,k++)
            for(j=N,m=0;j<2*N;j++,m++)
                    B3[k][m]=A[i][j];

    for(i=N,k=0;i<2*N;i++,k++)
            for(j=0;j<N;j++)
                    B4[k][j]=A[i][j];


    for(i=0;i<N;i++)
            for(j=0;j<N;j++)
                    A[i][j]=B4[i][j];

    for(i=0;i<N;i++)
            for(j=N,k=0;j<2*N;j++,k++)
                    A[i][j]=B1[i][k];

    for(i=N,k=0;i<2*N;i++,k++)
            for(j=N,m=0;j<2*N;j++,m++)
                    A[i][j]=B2[k][m];

    for(i=N,k=0;i<2*N;i++,k++)
            for(j=0;j<N;j++)
                    A[i][j]=B3[k][j];

    printf("\nNew matrix\n");
    for(i=0;i<2*N;i++)
    {       for(j=0;j<2*N;j++)
                    printf("%d   ",A[i][j]);
            printf("\n");
    }
    
    /* Write to file */
    {
        FILE *fp = fopen("output.txt", "w");
        if(!fp)
            return 2;
        
        char strBuf[20]={0};
        
        for(int iRow = 0; iRow < 2*N; iRow++)
            for(int jCol = 0; jCol < 2*N; jCol++)
            {
                sprintf(strBuf, "%d%c", A[iRow][jCol], (jCol == (2*N-1) )?'\n':'\t' );
                fputs(strBuf, fp);
                memset(strBuf, 0, 20);
            }
        
        fclose(fp);
    }
 
 delete []A;
 delete []B1;
 delete []B2;
 delete []B3;
 delete []B4;
 
 getchar();
return 0;
 }

34

Re: Ввід матриці з файлу в С*

ДЯКУЮ!!!
Спробую розібратись!
Наскільки розумію, то N вводиться користувачем для визначення порядку матриці?

35

Re: Ввід матриці з файлу в С*

Anddep написав:

ДЯКУЮ!!!
Спробую розібратись!
Наскільки розумію, то N вводиться користувачем для визначення порядку матриці?

Ну, у вас воно так і фігурувало у початковому коді. :)

Якщо потрібно інакше - придумайте, звідки ще взяти розмірність, бо якщо намагатися побудувати розмірність безпосередньо у процесі зчитування файлу, то навіть динамічні масиви свербітимуть по-чорному. :)

У будь-якому разі буде кривизна: або у структурі вхідного файлу (розмірність у першому рядку, наприклад), або у взаємозалежності файлу та вводу з клавіатури (та'як у наведеному прикладі).

Варіант без згаданих проблем - це використання контейнерів STL, але у вас, здс, задача про чистий С, тож блага цивілізації недоступні...

36 Востаннє редагувалося Anddep (28.01.2013 17:49:23)

Re: Ввід матриці з файлу в С*

Дякую!
Буду розбиратись далі!
Спробую на чистий С переписати!

37

Re: Ввід матриці з файлу в С*

Bartash написав:

Якщо матриця у файлі записана у вигляді

1    2    3    4
5    6    7    8
9    10    11    12

, то можна порядково считати та розбити кожен рядок на підрядки за допомогою strtok().
Скажімо:

#define N 3
#define MAX_SIZE 1024
#define MAX_LEN 10

int main()
{
    // initialization, etc
    
    int matrix [2*N][2*N] = {0};
    char strBuf[MAX_SIZE] = {0};
    char strItem[MAX_LEN] = {0};

    FILE *fp = fopen("myfile.txt", "r");
    if(!fp)
        return 1;

    int iRow = 0, jCol = 0;

    while(!feof(fp))
    {
        fgets(strBuf, MAX_SIZE-1, fp);
        strItem = strtok(strBuf, "\t"); // as a delimiter - tabulation
        while(strItem)
        {
            //Here you parse item from string and add to matrix as you need to :)

            jCol++;
            strItem = strtok(0, "\t");
        }

        iRow++;
    }
    
    fclose(fp);


    return 0;
}

В цьому коді вибиває помилку error C2440: =: невозможно преобразовать "char *" в "char [60]"

38

Re: Ввід матриці з файлу в С*

Ростик написав:

В цьому коді вибиває помилку error C2440: =: невозможно преобразовать "char *" в "char [60]"

Читайте останню версію по темі: http://replace.org.ua/post/6468/#p6468