Jump to content
  • 0

pomoc C - Divný output


ThomaSM

Dotaz

Zdravím,

Do školy potrebujem urobiť určitu funkciu ktorú už mám hotovú (jej určenie a fungovanie je nepodstatné) a funguje sáma o sebe ak spravím výpis priamo v nej tak je výpis správny. Problém nastáva ak je riadne zavolana z iného miesta (main) v tedy je výpis uplne zvlaštný až náhodny.

int special_numbers(const int input_array[], const int array_size, int result_array[]){
    int totally = 0;
    for (int i = 0; i < array_size; ++i)
    {
        int temp_sum = 0;
        for (int x = i+1; x < array_size; ++x)
            temp_sum += input_array[x];
        
        if(temp_sum < input_array[i]){
            result_array[i] = input_array[i];
            printf("Súčet %d je menší ako %d = (JE ŠPECIALNE) [ %d ] \n", temp_sum, input_array[i], result_array[i]); //Tento výpis je správny
            totally ++;
        }
    }  
    return totally;
}

Výpis funkcie je:

Citace

Súčet 14 je menší ako 17 = (JE ŠPECIALNE) [ 17 ]
Súčet 2 je menší ako 5 = (JE ŠPECIALNE) [ 5 ]
Súčet 0 je menší ako 2 = (JE ŠPECIALNE) [ 2 ]

Volanie (v main):

int input_array[] = {16,17,4,3,5,2};
int result_array[6];
int count = special_numbers(input_array, 6, test_array);
for(int i = 0; i < count; i++){
	printf("%d ", test_array[i]);
}

výsledok printu je napríklad: 0 17 993648864. 

Ale má byť: 17 5 2

Pritom hore printf priamo vo funkcií ukazuje v poslednej časti výpis .."[ %d ] \n', ..., result_array); správne. Ako to opraviť? Podmienka je že nesmú byť použité globalne premenné.

Ďakujem.

 

Link to comment
Share on other sites

8 odpovědí na tuto otázku

Recommended Posts

  • 3
před 9 minutami, ThomaSM said:

ale stále som sa dostal len na stabilný výstup: 20 17 5

Neviem, kde môžeš mať chybu. Ja s týmto programom:

Spoiler

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

int special_numbers(const int input_array[], const int array_size, int result_array[])
{
    int totally = 0;
    for (int i = 0; i < array_size; ++i) {
        int temp_sum = 0;
        for (int x = i+1; x < array_size; ++x)
            temp_sum += input_array[x];

        if (temp_sum < input_array[i]){
            result_array[totally] = input_array[i];
            totally ++;
        }
    }
    return totally;
}

int main()
{
    int input_array[] = { 16, 17, 4, 3, 5, 2 };
    int result_array[6];
    int count = special_numbers(input_array, 6, result_array);

    printf("count = %d\n", count);
    printf("special numbers:\n");

    for(int i = 0; i < count; ++i) {
        printf("%d\n", result_array[i]);
    }

    return 0;
}

 

Dostávam pravdepodobne správny výstup:

count = 3
special numbers:
17
5
2

V maine, ktorý si sem postol, máš nejaké "test_array", ktoré ani nevidím nikde zadeklarované.
Možno si over, či si namiesto toho použil result_array.

Edited by DuFF
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 2

Myslím si, že chyba je na tomto riadku:

result_array[i] = input_array[i];

Špeciálne číslo na i-tom indexe vstupu nemusí byť nutne uložené na i-tom indexe výstupu.
Vstupné pole môže obsahovať najskôr nejaké čísla, ktoré nie sú špecialne a povedzme, že prvé špeciálne číslo bude vo vstupnom poli na indexe 3.
Toto prvé špeciálne číslo pochopiteľne nechceš uložiť vo výstupnom poli na index 3, ale na index 0.

Chceš, aby bolo i-té nájdené špeciálne číslo uložené na i-tom indexe výstupu. 
Správne by malo teda byť:

 result_array[totally] = input_array[i];

 

Edited by DuFF
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 2

Aj keď sme už problém vyriešili, ešte si dovolím drobnú optimalizáciu.


Skús sa zamyslieť, či potrebuješ ten vnútorný cyklus na počítanie temp_sum.
Podľa mňa by ti stačilo spočítať ho iba raz (na začiatku) a v každej iterácii cyklu ho iba mierne upraviť (bez potreby vnútorného cyklu).  


Skús to vymyslieť najskôr sám, až potom si rozklikni spoiler.

Spoiler

int special_numbers(const int input_array[], const int array_size, int result_array[])
{
    int totally = 0;
    int temp_sum = 0;
    for (int x = 0; x < array_size; ++x)
        temp_sum += input_array[x];

    for (int i = 0; i < array_size; ++i) {
        temp_sum -= input_array[i];
        if (temp_sum < input_array[i]) {
            result_array[totally] = input_array[i];
            totally ++;
        }
    }

    return totally;
}

 

 

Edited by DuFF
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 1

problém máš v deklarácií funkcie

int special_numbers(const int input_array[], const int array_size, int result_array[])

ty vravíš že vytvor na stacku nový array (2x) a naplň ho premennou ktorú ti pošlem...

int special_numbers(const int &input_array[], const int array_size, int &result_array[])

toto ti vraví, že do funkcie pošli odkaz na input array (nakolko je konštantný, nemusíš sa báť že by sa zmenil) a aj odkaz na result array, čiže čokolvek upravíš v arrayi, tak sa prejaví aj v pôvodnom arrayi, pretože pracuješ priamo s ním a nie s kopiou

ak chceš o tom vedieť viac tak mi napíš správu

Edited by Quiter
Link to comment
Share on other sites

  • 0

Ďakujem, dobre vedieť no to nerieši môj problém pretože deklarácia musí byť takto ako som ju sem poslal... je to zadanie z výšky a deklarácia je tiež pevná zadaná. Takže dalo by sa to riešiť nejak inak bez zmeny dekláracie?

Link to comment
Share on other sites

  • 0
před 4 minutami, DuFF said:

Myslím si, že chyba je na tomto riadku:


result_array[i] = input_array[i];

i-té špeciálne číslo nemusí byť nutne uložené na i-tom indexe výstupu.

Vstupné pole môže obsahovať najskôr nejaké čísla, ktoré nie sú špecialne a povedzme, že prvé špeciálne číslo bude vo vstupnom poli na indexe 3. Toto prvé špeciálne číslo pochopiteľne nechceš uložiť vo výstupnom poli na index 3, ale na index 0.

Správne by malo byť teda:


 result_array[totally] = input_array[i];

 

Vďaka to máš pravdu ani ma to nenapadlo ale stále som sa dostal len na stabilný výstup: 20 17 5 ... odkial to vzalo 20 neviem ale 17, 5 sedí a chýba 2. 

Link to comment
Share on other sites

  • 0
před 2 minutami, DuFF said:

Neviem, kde môžeš mať chybu. Ja s týmto programom:

  Opětovně skrýt obsah


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

int special_numbers(const int input_array[], const int array_size, int result_array[]){
    int totally = 0;
    for (int i = 0; i < array_size; ++i) {
        int temp_sum = 0;
        for (int x = i+1; x < array_size; ++x)
            temp_sum += input_array[x];

        if (temp_sum < input_array[i]){
            result_array[totally] = input_array[i];
            totally ++;
        }
    }
    return totally;
}

int main()
{
    int input_array[] = { 16, 17, 4, 3, 5, 2 };
    int result_array[6];
    int count = special_numbers(input_array, 6, result_array);

    printf("count = %d\n", count);
    printf("special numbers:\n");

    for(int i = 0; i < count; i++){
        printf("%d\n", result_array[i]);
    }

    return 0;
}

Dostávam výstup:
 



count = 3
special numbers:
17
5
2

 

V maine, ktorý si sem postol, máš nejaké "test_array", ktoré ani nevidím nikde zadeklarované.
Možno si over, či si namiesto toho použil result_array.

Ježiš za ten test array sa ospravedlňujem niečo som skúšal a zabudol som zmazať :D ked som si to hodil do samostatného súboru  tak mi to ide tiež. Len som to mal dokopy so všetkými ostatnými zadaniami v jednom tak asi niečo ine mi dotoho babralo.. každopadne vďaka za pomoc.

Link to comment
Share on other sites

  • 0
před 11 minutami, DuFF said:

Aj keď sme už problém vyriešili, ešte si dovolím drobnú optimalizáciu.


Skús sa zamyslieť, či potrebuješ ten vnútorný cyklus na počítanie temp_sum.
Podľa mňa by ti stačilo spočítať ho iba raz (na začiatku) a v každej iterácii cyklu ho iba mierne upraviť (bez potreby vnútorného cyklu).  
Skús to vymyslieť najskôr sám, až potom si rozklikni spoiler.

  Opětovně skrýt obsah


int special_numbers(const int input_array[], const int array_size, int result_array[])
{
    int totally = 0;
    int temp_sum = 0;
    for (int x = 0; x < array_size; ++x)
        temp_sum += input_array[x];

    for (int i = 0; i < array_size; ++i) {
        temp_sum -= input_array[i];
        if (temp_sum < input_array[i]) {
            result_array[totally] = input_array[i];
            totally ++;
        }
    }

    return totally;
}

 

 

Vidíš to mi nedošlo.. vďaka ešte raz za pomoc. 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...