Wyjaśnienie prostego programu

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?

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");
}
}

0

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

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");
}
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?

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.

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
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;
}

 
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.

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.

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

1

przy takiej tablicy to...

int main(int argc, char* argv[])
{
    printf("Wynik: %f\n", 5.5);
    return 0;
}

:-)

0
    double wynik = srednia(tab);
    printf("Wynik: %lf\n", wynik); // starsze kompilatory wymagają lf przy double

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