• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Automatyczne zliczanie kolumn i wierszy z pliku tekstowego + zmienna, która się zeruje po wyjściu z metody

VPS Starter Arubacloud
0 głosów
192 wizyt
pytanie zadane 27 kwietnia 2018 w C i C++ przez must Bywalec (2,980 p.)

Cześć, mam zadanie:

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

Zrobiłem wszystko, tyle że liczba kolumn i wierszy jest wpisywana z klawiatury. Chciałbym się dowiedzieć jak zrobić, by samo policzyło ile ich jest.

+ mam problem ze zmienną 

sum

zadeklarowałem ją w mainie, ponieważ chce ją przesłać do innej funkcji "Save", by zapisało ją również w pliku. Niestety po wyjściu z funkcji "sumCounter" zmienna przyjmuje wartość 0 i nie wiem dlaczego. Sprawdzałem w funkcji jest wszystko okej i poprawnie zlicza.

Ewentualnie mozecie rzucić okiem co poprawić etc.

 

Oto kod: 

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

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

    int rowlength, collength;
    int row = 0, col = 0, sum = 0 ;

    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, sum);

    return 0;
}


void ReaderValues(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 changer(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);
    }
}

Jedynym rozwiązaniem poprawnym jest: 

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

i wtedy wszystko działa, ale i tak chciałbym się dowiedzieć dlaczego ta suma przepada po zakończeniu funkcji.

3 odpowiedzi

+2 głosów
odpowiedź 27 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Parametry przekazywane są do funkcji przez wartość, więc w funkcji nie operujesz na zmiennej z maina, tylko na kopii tej zmiennej. Jakiekolwiek zmiany kopii nie wpływają na wartość oryginalnej zmiennej w mainie. Możesz przypisać wartość zwróconą z tej funkcji do zmiennej sum lub jeśli koniecznie chcesz mieć w funkcji dostęp do oryginalnej zmiennej, to należy przekazać wskaźnik na nią.
komentarz 28 kwietnia 2018 przez must Bywalec (2,980 p.)

Nie czuje sie pewnie na wskaznikach, dlatego pozostawie to w takiej formie w jakiej jest czyli:


Save(rowlength, collength, tab, argv, sumCounter(rowlength,collength,tab, sum));
Wtedy działa. 

A wiesz jak zrobic bym nie musial wpisywac liczby kolumn i wierszy?

komentarz 28 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

A wiesz jak zrobic bym nie musial wpisywac liczby kolumn i wierszy?

Tak się nie da. W C przekazując tablicę przekazujesz tak naprawdę wskaźnik, w którym nie ma żadnej informacji dotyczącej rozmiarów tablicy.

komentarz 28 kwietnia 2018 przez must Bywalec (2,980 p.)

Da się na 100%. Tablica ma być dynamiczna, nie statyczna.

Funkcja, która używając pętli while z 

fscanf

liczy ilość kolumn i tako samo wierszy.

Coś na zasadzie, że petla iteruje po pliku aż do EOF, i gdy napotka \n, to przykładowo jest to kolejny wiersz.

komentarz 28 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Źle Cię zrozumiałem. Myślałem, że chcesz uniknąć przekazywania rozmiarów tablicy do funkcji.

Możesz najpierw przejrzeć plik, by określić ilość wierszy i kolumn  i dynamicznie alokować potrzebną pamięć. Po zaalokowaniu dopiero odczytać właściwe wartości z pliku.
komentarz 28 kwietnia 2018 przez must Bywalec (2,980 p.)
No to o to chodzi, o tym całym czas pisze :D tylko nie wiem jak to zrobic

 

//edit

choc w sumie nie. Ale i tak nie wiem jak to zrobić:( ja totalna ciemnota ze wskaznikow
komentarz 28 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Czego konkretnie nie wiesz jak zrobić?
komentarz 29 kwietnia 2018 przez must Bywalec (2,980 p.)
Tego co napisałeś. :P

Chodzi mi o określenie liczby kolumn i wierszy.
komentarz 1 maja 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Liczba wierszy to będzie liczba linii w pliku, a liczba kolumn ilość liczb w pojedynczym wierszu, jeśli dobrze rozumiem format tych plików.
komentarz 1 maja 2018 przez must Bywalec (2,980 p.)

No tak, ale nie wiem dalej jak to zrobić :P

Plik wygląda tak: 

1 1 1
2 2 2 
3 3 3

 

0 głosów
odpowiedź 30 kwietnia 2018 przez must Bywalec (2,980 p.)
Wie ktoś może jak zrobić te dwie funkcje zliczania?
–1 głos
odpowiedź 28 kwietnia 2018 przez JanuszTypowo Nowicjusz (140 p.)
Funkcja sumCounter nie pracuje na oryginalnej zmiennej sum.

Spróbuj dopisać znaczek ampersand przed nazwa sum w definicji funkcji tak jak poniżej;

int sumCounter(int rowlength, int collength, int tab[rowlength][collength], int &sum)

Podobne pytania

0 głosów
1 odpowiedź 137 wizyt
0 głosów
1 odpowiedź 757 wizyt
0 głosów
1 odpowiedź 486 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...