Zliczanie kolumn i wierszy macierzy zapisane w pliku tekstowym

0

Hej, potrzebuje ostatniego podpunktu z projektu odnośnie macierzy do szkoły. Otóż borykam się z problem automatycznego zliczania wierszy i kolumn. Na ten moment wpisywałem ich liczbe z klawiatury, ale potrzebuje to zmienić.

Plik wygląda tak:
1 1 1
2 2 2
3 3 3
Coś na zasadzie, że program iteruje po pliku, gdy napotka \n to bedzie znaczylo, ze jest to kolejny wiersz. Nie potrafie niestety zrealizować tych 2 funkcji.
Może ktoś pomóc

1

A co zrobiłeś do tej pory? Jakiś kod pokaż.

0

Miałem za zadanie:

W tablicy A zastąp elementy ujemne zerami i policz sumę elementów dodatnich tej tablicy.

Mam wszystko oprócz tego zliczania. Najlepiej jakby się obeszło bez wskaźników, bo nie czuje się w nich zbyt pewnie.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        printf("Za malo argumentow");
        return 0;
    }

    int rowlength, collength;

    printf("Input number of rows for the first array!");
    scanf("%d", &rowlength);
    printf("Input number of columns for the first array!");
    scanf("%d", &collength);

    int tab[rowlength][collength];

    printf("Elements in the text file:\n\n");



    FILE *file = fopen(argv[1], "r");

    ReaderValues(file, rowlength, collength, tab);

    fclose(file);

    changer(rowlength,collength,tab);

    printf("Sum of plus numbers is %d", sumCounter(rowlength,collength,tab, sum));

    Save(rowlength, collength, tab, argv, sumCounter(rowlength,collength,tab, sum));

    return 0;
}

void readValue(FILE *file, int rowlength, int collength, int tab[rowlength][collength])
{
    int row = 0, col = 0;
    while (fscanf(file, "%d,", &tab[row][col]) != EOF)
    {

        printf("%d ", tab[row][col]);

        col++;

        if (col == collength)
        {
            printf("\n");
            col = 0;
            row++;
        }
    }
    printf("\n");
}

int sumCounter(int rowlength, int collength, int tab[rowlength][collength], int sum)
{
    int i,j;
    for(i=0; i < rowlength; i++)
    {
        for(j=0; j < collength; j++)
        {
            if(tab[i][j]>0)
                sum = sum + tab[i][j];
        }
    }
    return sum;
}

void changeNegativeNumbers(int rowlength, int collength, int tab[rowlength][collength])
{
    int i,j;
    for(i=0; i < rowlength; i++)
    {
        for(j=0; j < collength; j++)
        {
            if(tab[i][j]<0)
                tab[i][j] = 0;
        }
    }
    printf("Matrix after 0 \n");

    for(i=0; i < rowlength; i++)
    {
        for(j=0; j < collength; j++)
        {
            printf("%d ", tab[i][j]);
        }
        printf("\n");
    }
}

void Save(int rowlength, int collength, int tab[rowlength][collength], char *argv[], int sum)
{
    int i, j;
    FILE *file2;
    file2 = fopen(argv[2], "w");
    if (file2 == NULL)
        printf("Can't open the file!");

    else
    {
        fprintf(file2, "The result: \n");
        fprintf(file2, "The sum: %d \n", sum);

        for (i = 0; i < rowlength; i++)
        {
            for (j = 0; j < collength; j++)
            {
                fprintf(file2, "%d ", tab[i][j]);
            }

            fprintf(file2, "\n");
        }

        fclose(file2);
    }
}
0

@refresh

0

Potrafiłby ktoś to zrobić?

1
jajko1233 napisał(a):

Miałem za zadanie:

W tablicy A zastąp elementy ujemne zerami i policz sumę elementów dodatnich tej tablicy.

Mam wszystko oprócz tego zliczania. Najlepiej jakby się obeszło bez wskaźników, bo nie czuje się w nich zbyt pewnie.

No to przecież podobnie jak w funkcji changeNegativeNumbers, tylko potrzebujesz innego warunku i dodatkowej zmiennej do przechowywania sumy.

0
Potat0x napisał(a):
jajko1233 napisał(a):

Miałem za zadanie:

W tablicy A zastąp elementy ujemne zerami i policz sumę elementów dodatnich tej tablicy.

Mam wszystko oprócz tego zliczania. Najlepiej jakby się obeszło bez wskaźników, bo nie czuje się w nich zbyt pewnie.

No to przecież podobnie jak w funkcji changeNegativeNumbers, tylko potrzebujesz innego warunku i dodatkowej zmiennej do przechowywania sumy.

Przeczytaj pierwszy post ;)

1

https://linux.die.net/man/3/fgetc
https://linux.die.net/man/3/feof
W tym rozwiązaniu wielkiej filozofii nie ma. Wystarczy lecieć znak po znaku.
Założenie: plik kończy się znakiem nowej linii.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE * file;

    int row_number = 0;
    int col_number = 0;

    if((file = fopen("macierz.txt", "r")) == NULL)
    {
        perror("Nie mozna otworzyc pliku.");
        exit(1);
    }

    char t = 0;
    while(!feof(file))
    {
        t = fgetc(file);

        if(row_number == 0)
        {
            if(t == ' ' || t == '\n')
                col_number++;
        }

        if(t == '\n')
            row_number++;
    }

    fclose(file);

    printf("row_number = %d\n", row_number);
    printf("col_number = %d\n", col_number);

    return 0;
}
0
Potat0x napisał(a):

https://linux.die.net/man/3/fgetc
https://linux.die.net/man/3/feof
W tym rozwiązaniu wielkiej filozofii nie ma. Wystarczy lecieć znak po znaku.
Założenie: plik kończy się znakiem nowej linii.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE * file;

    int row_number = 0;
    int col_number = 0;

    if((file = fopen("macierz.txt", "r")) == NULL)
    {
        perror("Nie mozna otworzyc pliku.");
        exit(1);
    }

    char t = 0;
    while(!feof(file))
    {
        t = fgetc(file);

        if(row_number == 0)
        {
            if(t == ' ' || t == '\n')
                col_number++;
        }

        if(t == '\n')
            row_number++;
    }

    fclose(file);

    printf("row_number = %d\n", row_number);
    printf("col_number = %d\n", col_number);

    return 0;
}

O takie coś mi własnie chodziło.
Tylko teraz 2 pytanka:

  1. Dlaczego t == '\n' to jest nowa kolumna, przecież po spacji jest chyba tylko wiersz nowy?
  2. dlaczego przypisujemy do t=0
1
  1. Ponieważ, gdy mamy taki np wiersz
    1 2 3 4
    to widać, że kolumny są cztery, ale spacje są trzy. Trzeba uwzględnić to, że po ostatniej kolumnie nie ma spacji.
    Gdy mamy plik
1
2
3

To spacji nie ma w ogóle, a jest jedna kolumna.
2) To nie ma znaczenia, za chwilę i tak będzie tam zapisana wartość z fgetc.

0
Potat0x napisał(a):
  1. Ponieważ, gdy mamy taki np wiersz
    1 2 3 4
    to widać, że kolumny są cztery, ale spacje są trzy. Trzeba uwzględnić to, że po ostatniej kolumnie nie ma spacji.
    Gdy mamy plik
1
2
3

To spacji nie ma w ogóle, a jest jedna kolumna.
2) To nie ma znaczenia, za chwilę i tak będzie tam zapisana wartość z fgetc.

row_number

trzeba inicjować od 1, a nie od 0 tak jak to masz tam zapisane, ponieważ na 1 wierszu zaczynamy.

Tylko teraz ja rozbiłem to na dwie funkcje, countRows i countColumns

Jak obejść ten warunek:
if(row_number == 0)
ponieważ w tej funkcji nie mam row_numbers.

0
#include <stdio.h>
#include <stdlib.h>
int countRows(FILE *file, char *argv[])
{
    char t;
    int row_number = 1 ;

    if((file = fopen(argv[1], "r")) == NULL)
    {
        perror("Nie mozna otworzyc pliku.");
        exit(1);
    }

    while(!feof(file))
    {
        t = fgetc(file);
        if(t=='\n')
        {
            row_number++;
        }
    }

    fclose(file);

    return row_number;
}

int countColumns(FILE *file, char *argv[])
{
    char t;
    int col_number = 1 ;

    if((file = fopen(argv[1], "r")) == NULL)
    {
        perror("Nie mozna otworzyc pliku.");
        exit(1);
    }

    while(!feof(file))
    {
        t = fgetc(file);
        if(t==' ')
        {
            col_number++;
        }
    }

    fclose(file);

    return col_number;
}
int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        printf("Za malo argumentow");
        return 0;
    }
    FILE *file = fopen(argv[1], "r");

    int rowlength,collength, sum=0;
    rowlength = countRows(file,argv);
    printf("%d", rowlength);

    collength = countColumns(file,argv);
    printf("%d", collength);

    printf("Elements in the text file:\n\n");


    int tab[rowlength][collength];

    readValues(file, rowlength, collength, tab);

    fclose(file);

    int sumOfAdditionalNumbers = countSumOfAdditionalNumbers(rowlength,collength,tab,sum);

    changeNegativeNumbers(rowlength,collength,tab);

    printf("Sum of plus numbers is %d", sumOfAdditionalNumbers);

    Save(rowlength, collength, tab, argv, sumOfAdditionalNumbers);

    return 0;
}

void readValues(FILE *file, int rowlength, int collength, int tab[rowlength][collength])
{
    int row = 0, col = 0;
    while (fscanf(file, "%d,", &tab[row][col]) != EOF)
    {

        printf("%d ", tab[row][col]);

        col++;

        if (col == collength)
        {
            printf("\n");
            col = 0;
            row++;
        }
    }
    printf("\n");
}

int countSumOfAdditionalNumbers(int rowlength, int collength, int tab[rowlength][collength], int sum)
{
    int i,j;
    for(i=0; i < rowlength; i++)
    {
        for(j=0; j < collength; j++)
        {
            if(tab[i][j]>0)
                sum = sum + tab[i][j];
        }
    }
    return sum;
}

void changeNegativeNumbers(int rowlength, int collength, int tab[rowlength][collength])
{
    int i,j;
    for(i=0; i < rowlength; i++)
    {
        for(j=0; j < collength; j++)
        {
            if(tab[i][j]<0)
                tab[i][j] = 0;
        }
    }
    printf("Matrix after 0 \n");

    for(i=0; i < rowlength; i++)
    {
        for(j=0; j < collength; j++)
        {
            printf("%d ", tab[i][j]);
        }
        printf("\n");
    }
}

void Save(int rowlength, int collength, int tab[rowlength][collength], char *argv[], int sum)
{
    int i, j;
    FILE *file2;
    file2 = fopen(argv[2], "w");
    if (file2 == NULL)
        printf("Can't open the file!");

    else
    {
        fprintf(file2, "The result: \n");
        fprintf(file2, "The sum: %d \n", sum);

        for (i = 0; i < rowlength; i++)
        {
            for (j = 0; j < collength; j++)
            {
                fprintf(file2, "%d ", tab[i][j]);
            }

            fprintf(file2, "\n");
        }

        fclose(file2);
    }
}

1

Ok, czyli w countColumns nie musisz niczego obchodzić. Po przeczytaniu pierwszej linii liczba kolumn jest znana - wystarczy przerwać pętlę, jeżeli przeczytany znak to \n.

1 użytkowników online, w tym zalogowanych: 0, gości: 1