Wyjaśnienie prostego programu

Odpowiedz Nowy wątek
2014-08-31 11:47
0

Witam, jestem bardzo początkującym programistą, uczyłem się wczoraj funkcji i mam jedno pytanie.

Wklejam kod prostego programu rysującego trójkąt o danej przyprostokątnej:


#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>

void trojkat(int a, char znak)
{
     for(int i=0;i<a;i++) {
             for( int j=0;j<=i;j++)
             {
                      printf("%c",znak);
                      }
                      printf("\n");
                      }
}
int main(int argc, char *argv[])
{

    trojkat(4, '#');

    system("PAUSE");
    return EXIT_SUCCESS;
}

Program działa w tej postaci, jednak dręczy mnie jedna sprawa, dlaczego cały kod funkcji musi być wypisany przed mainem? Dlaczego program nie zadziała jeżeli przed mainem jedynie zadeklaruje funkcje, a po mainie po prostu wypisze jej kod i ją wywołam? Chodzi mi o taką postać:


#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>

void trojkat(int a, char znak);

int main(int argc, char *argv[])
{
    void trojkat(int a, char znak)
{
     for(int i=0;i<a;i++) {
             for( int j=0;j<=i;j++)
             {
                      printf("%c",znak);
                      }
                      printf("\n");
                      }
}
    trojkat(4, '#');

    system("PAUSE");
    return EXIT_SUCCESS;
}

Błąd jaki się pojawia to " a function definition is not allowed here before '{' token"

Ale dlaczego?

Pozostało 580 znaków

2014-08-31 11:50
trolololo2
0

Nie ma czegoś takiego jak funkcja w funkcji.

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>

void trojkat(int a, char znak);

int main(int argc, char *argv[])
{
trojkat(4, '#');

system("PAUSE");
return EXIT_SUCCESS;

}

void trojkat(int a, char znak)
{
for(int i=0;i<a;i++)
{
for( int j=0;j<=i;j++)
{
printf("%c",znak);
}
printf("\n");
}
}

Wstawiaj kod w znaczniki kolorujące składnię; - MoorfoxD 2014-09-01 00:01

Pozostało 580 znaków

2014-08-31 11:51
0

Trywialne... nie pomyślałem, dzięki

Pozostało 580 znaków

2014-08-31 13:09
0

W C coś takiego się skompiluje i uruchomi (jednak to jest bardzo zły styl programowania :) ):

#include <stdio.h>

int main(int argc, char* argv[]) {
    printHello();

    return 0;
}

void printHello() {
    puts("Hello");
}

Pozostało 580 znaków

2014-08-31 14:30
0

Generalnie ciężko mi idzie opanowanie funkcji :S

Probuje napisać funkcje obliczającą średnią arytmetyczną liczb zawartych w tablicy, napisałem kod, jednak dostaje błąd "invalid types 'int[int]' for array subscript"


#include <cstdlib>
#include <iostream>
#include <stdio.h>

using namespace std;

int tab[10]={1,2,3,4,5,6,7,8,9,10};
int srednia(int suma, int tab) 
{
       for(int i=0;i<10;i++) {
               suma += tab[i];
               suma = suma/10;
               }

int main(int argc, char *argv[])
{

printf("Srednia arytmetyczna to %f",srednia(suma,tab);

    system("PAUSE");
    return EXIT_SUCCESS;
}

Ktoś mógłby wyjaśnic o co chodzi?

Pozostało 580 znaków

2014-08-31 15:42
0

Masz cztery błędy w programie:

  1. int srednia(int suma, int tab)

    deklarujesz, że zmienna tab jest typu int, a korzystasz z niej jak z tablicy.

  2. Brakuje nawiasu } kończącego ciało funkcji srednia.
  3. printf("Srednia arytmetyczna to %f",srednia(suma,tab);

    w tym wierszu brakuje zamykajacego nawiasu ).

  4. W powyższym wierszu korzystasz z niedeklarowanej zmiennej suma.

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2014-08-31 15:43

Pozostało 580 znaków

2014-08-31 15:59
0
  1. brakuje instrukcji return dla funkcji srednia(int suma, int tab)
  2. algorytm liczenia średniej jest błędny - trzeba dzielić przez 10 tylko raz, na samym końcu
  3. funkcja srednia zwraca int, co raczej nie jest tym czego chcesz patrząc na to jak jej używasz
edytowany 1x, ostatnio: twonek, 2014-08-31 16:17

Pozostało 580 znaków

2014-08-31 19:23
0

Masa tych błędów przez nieuwage i pospiech, poprawiłem, ale dalej cos mi nie wychodzi, tym razem błąd: invalid conversion from int to int*


#include <cstdlib>
#include <iostream>
#include <stdio.h>

using namespace std;

int tab[10]={1,2,3,4,5,6,7,8,9,10};
int srednia(int suma, int tab[10] ) 
{
       for(int i=0;i<10;i++) {
       suma += tab[i];
               }

suma = suma/10;
}
int main(int argc, char *argv[])
{
int suma;
srednia(suma,tab[10]);

    system("PAUSE");
    return EXIT_SUCCESS;
}

Pozostało 580 znaków

2014-08-31 19:40
0

Błędów 5 i 7 nie poprawiłeś. Wywołując funkcję srednia przekazujesz do niej dwa argumenty typu int, a ona oczekuje, że drugi argument będzie tablicą.
Ponadto, nigdzie nie wyświetlasz wyniku.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-08-31 19:48
kq
0

Po co przekazujesz do funkcji początkową wartość sumy? Deklaracja powinna wyglądać tak:

double srednia(int tab[10]) // równoznaczne z int*, nie wymusza 10

Użycie niezainicjalizowanej wartości - UB:

int suma;
srednia(suma,tab[10]);

Tagujesz C, a w kodzie masz

#include <cstdlib>
#include <iostream>
//... 
using namespace std;

To w końcu C czy C++?

Poprawny¹ kod: http://melpon.org/wandbox/permlink/k6xheuzJs4tx4b9q

#include <stdio.h>

int tab[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

double srednia(int tab[10])
{
    double suma = 0;
    for (int i = 0; i < 10; i++) {
        suma += tab[i];
    }

    suma = suma / 10;
    return suma;
}
int main(int argc, char* argv[])
{
    double wynik = srednia(tab);

    printf("Wynik: %f\n", wynik);

    return 0;
}

¹ poprawny w znaczeniu działający zgodnie z założeniami. Pisanie funkcji liczącej średnią tablicy 10 intów jest bezsensowne, powinieneś przynajmniej brać długość tablicy jako parametr.

Przy okazji: Twoja indentacja jest tragiczna. Staraj się trzymać uporządkowany kod.


edytowany 3x, ostatnio: kq, 2014-08-31 23:53

Pozostało 580 znaków

2014-08-31 23:46
0

Wiem, że źle się czyta mój kod, chyba troche sobie nie zdawałem sprawy jak bardzo przejrzyste kodowanie pomaga w znajdywaniu błędów.

Ale to nie koniec moich problemów, chciałem wrzuciłem do dev c++ kod, który napisałeś, że jest poprawny, ale on u mnie nie działa tak jak powinien, jedynie przed return 0; wrzuciłem system("PAUSE"), program kompiluje sie i odpala, ale wyswietla: "Wynik: 1.#QNAN0" ?

Faktycznie, było to spowodowane szkolnym błędem w moim kodzie, już poprawione. (nie zwracałem wyniku z funkcji średnia). Na moją obronę przerabiałem Twój kod powyżej, a on też nie zwracał wyniku. - kq 2014-08-31 23:52
A co do formatowania kodu - każde porządne IDE z tym pomaga, poza tym masz narzędzia takie jak clang-format (do którego ostatnio napisałem web ui http://format.krzaq.cc/ ) - kq 2014-08-31 23:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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