Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • 0
ThomaSM

pomoc C - Divný output

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.

 

Sdílet tento příspěvek


Link to post
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

Sdílet tento příspěvek


Link to post
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

Sdílet tento příspěvek


Link to post
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

Sdílet tento příspěvek


Link to post
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

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
Author of the topic Odesláno před

Ď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?

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
Author of the topic Odesláno před
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. 

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
Author of the topic Odesláno před
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.

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
Author of the topic Odesláno před
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. 

Sdílet tento příspěvek


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Odpovědět na dotaz...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Obnovili jsme váš původní obsah (obsah napsaný před zavřením).   Smazat obnovený obsah

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...