funkcja podstawa

0

Program początkowo wygłądał tak:

int main ( ) 
{

  int a =5;
  double b = 25.5;  
  int c;
   if ( a > 10 ) 
      {
	a = a +5;   
	b = b - 2;
	c = a +b * b;
      }
    printf("\n Wynik =%d", c );

    int a1 = 7;
    int b1 = -5;
    
    if ( a1 > 10 ) 
      {
        a1 = a1 +5;   
        b1 = b1 - 2;
        c = a1 +b1 * b1;
      }
    printf("\n Wynik 2 =%d", c );


    int a2 = 7;
    int b2 = -5;
    
    if ( a2 > 10 ) 
      {
        a2 = a2 +5;   
        b2 = b2 - 2;
        c = a2 +b2 * b2;
      }
    printf("\n Wynik 3 =%d", c );
  
} 

A tak po mojej nieudanej przeróbce

#include<stdio.h>

void obliczenia (int s1, int s2, int s3)
{
        int wynik, y, z;

        if (s1>10)
                {
                z=s1+5;
                y=s2-2;
                wynik=s1+s2*s2;
                }
        printf("Wynik =%d\n", wynik);
}

int main()
{
        int a=5;
        double b=25.5;
        int c;

        obliczenia(a, b, c);

        int a1=7;
        int b1=-5;

        obliczenia(a1, b1, c);

        int a2=7;
        int b2=-5;

        obliczenia(a2, b2, c);
}
 

NIe oczekuje gotowca ale chociaż jakiejś odpowiedzi

0

Może powiesz co to ma robić?

0

To ma zwracać trzy wyniki. Najpierw gdy podstawimy a, b potem gdy podstawimy a1, b1 i gdy podstawimy a2, b2 :-)

0
#include<stdio.h>
 
void obliczenia (int s1, int s2, int s3)
{
        int wynik=0, y, z;  // wynik tez musi byc zainicjaliwane bo nie zwróci ci prawidłowego wyniku
 
        if (s1>10)
                {
                z=s1+5;
                y=s2-2;
                wynik=s1+s2*s2;
                }
        printf("Wynik =%d\n", wynik);
}
 
int main()
{
        int a=5;
        int b=25; // nie mozesz przekazywac do funkcji liczby dobule jest ona oczekuje int'a
        int c= 1;  // musi byc zainicjalizowana wartosc
 
        obliczenia(a, b, c);
 
        int a1=7;
        int b1=-5;
 
        obliczenia(a1, b1, c);
 
        int a2=7;
        int b2=-5;
 
        obliczenia(a2, b2, c);
}

Kod nie spełnia zasad poprawnego pisania/kodowania

1

Ponieważ we wszystkich przypadkach warunek (a>10) nie jest prawdą to, można całość skrócić do:

int main() 
  {
   int c;
   printf("\n Wynik =%d", c );
   printf("\n Wynik 2 =%d", c );
   printf("\n Wynik 3 =%d", c );
   return 0;
 }

Więc może zdecyduj się co trzeba wyświetlić wtedy kiedy nie obliczasz tego c.

Postaraj się też nie zwracać uwagi na post od @Westen bo uczy złego podejścia.

Zauważyłem inicjalizacje c=1, więc może tak:

#include <stdio.h>

int calc(int a,double b) { return a>10?(int)(b*b-2*b+a+9):1; }

int main()
  {
   printf("Wynik1 = %d\n",calc(5,25));
   printf("Wynik2 = %d\n",calc(7,-5));
   printf("Wynik3 = %d\n",calc(7,-5));
   return 0;
  }
0

NIe mogę ingerować w ten kod u góry, tylko zapisać go za pomocą funkcji. Najchętniej bym tak zrobił ale nie mogę 13th_Dragon. Dzięki wam za pomoc :)

0

Mam kolejny problem. Mam wydzielić powtarzające się fragmenty kodu w postaci funkcji. O to program:

 
#include <stdio.h>

int main ( ) 
{

  int x =-50;
  double b = 25.5;  
  int c;
  
     while( x < 0 ) 
      {
	    x = x +b/2;   
		b = 2 * b + 0.5;
		c += x + b * b;
	  }
    printf("\n Wynik =%d", c );

     while( x < 25 ) 
      {
	    x = x +b/2;   
		b = 2 * b + 0.5;
		c += x + b * b;
	  }
    printf("\n Wynik =%d", c );

}

Chciałem go najpierw przeanalizować bo niewiem czy na pewno go rozumiem.

Pierwsza pętla wykonuje się dopóki x< 0 czyli według mnie napis "Wynik =" zostanie wyświetlony w pierwszej pętli dwa razy ponieważ najpierw x będzie wynosić -50, potem -37 a potem będzie większe od zera. Wynik przybierze losowe wartości bo zmiennej c nie została przypisana wartość.

Druga pętla wykonuje się x<25 czyli pętla wykona się tyle samo razy, więc napis wyświetli się dwa razy.

A to program który udało mi się napisać

#include<stdio.h>

int obliczenia (int s1, double s2, int s3)
{

        s1=s1+s2/2;
        s2=2*s2+0.5;
        s3+=s1+s2*s2;

        printf("Wynik %d\n", s3);

}


int main()
{
        int x=-50;
        double b=25.5;
        int c;

                while(x<0)
                        {
                        obliczenia(x, b, c);
                        }
                while(x<25)
                        {
                        obliczenia(x, b, c);
                        }
}

 
0

Mój błąd, nie zauważyłem że printf jest poza klamrami.
Lecz nadal mam pytania co do mojego poprawionego programu bo powstaje mi nieskonczona pętla

0

Jako że przekazujesz x przez wartość, to jego wartość ciągle wynosi -50, więc pętla nigdy się nie kończy.
Prostsze rozwiązanie, żeby się nie babrać wskaźnikami:

int obliczenia(int s1, double s2, int s3)
{
    ...
    return s1;
}

int main()
{
    ...
    while (x < 0) 
    {
        x = obliczenia(x, b, c);
    }
    ...
}

Przy czym Twój program nie jest równoważny pierwotnemu. Pierwszy miał printf poza pętlą, a Twój ma wewnątrz.

0

Czy widzisz gdzieś zmianę tego X? Bo ja - nie.

0

to

 x = x +b/2;   

i to s1=s1+s2/2;

 to nie jest to samo?
Tu następuje zmiana wartości x i przypisania nowej czy nie?
0

Da się zrobić by printf był poza pętlą ale bym nie musiał go pisać dwa razy?

0

Jak będzie poza pętlą to jakim cudem może być dwa razy?
Dwa razy poza pętlą?
Nie bój się, nikt nie będzie cię zmuszać do tak nędznych czynów!

0

Przeczytałem mnóstwo rzeczy o funkcji, pełno przykładów ale dalej nie potrafie. To co udało mi się stworzyć

 #include<stdio.h>

int obliczenia (int s1, double s2, int s3)
{

        s1=s1+s2/2;
        s2=2*s2+0.5;
        s3+=s1+s2*s2;

        return s1;
}


int main()
{
        int x=-50;
        double b=25.5;
        int c=1;

                while(x<0)
                        {
                        x=obliczenia(x, b, c);
                        }
        printf("Wynik= %d\n", obliczenia(x, b, c));
                while(x<25)
                        {
                        x=obliczenia(x, b, c);
                        }
        printf("wynik= %d\n", obliczenia(x, b, c));
}
~   

Return s1 zwraca mi wartość s1 i przypisuję ją do wartości x, i jeśli ta wartość jest mniejsza od zera to znów wraca do funkcji i znów zwraca s1 i przypisuje do x?
Natomiast jak potem zwrócić s3 czyli ten mój wynik właściwy?

0

Przekazuj poprzez wskaźniki.

0
#include<stdio.h>

int obliczenia (int *s1, double *s2, int *s3)
{

        *s1=s1+s2/2;
        *s2=2*s2+0.5;
        *s3+=s1+s2*s2;

}

int main()
{
        int x=-50;
        double b=25.5;
        int c=1;

                while(x<0)
                        {
                        obliczenia(&x, &b, &c);
                        }
        printf("wynik= %d\n", c);
                while(x<25)
                        {
                        obliczenia(&x, &b, &c);
                        }
        printf("wynik= %d\n", c);

}
~     

Wyrzuca błędy :)
fun4.cpp: In function ‘int obliczenia(int*, double*, int*)’:
fun4.cpp19: error: invalid operands of types ‘double*’ and ‘int’ to binary ‘operator/’
fun4.cpp15: error: invalid operands of types ‘int’ and ‘double*’ to binary ‘operator*’
fun4.cpp20: error: invalid operands of types ‘double*’ and ‘double*’ to binary ‘operator*’

0

A jakiego wyniku się spodziewasz dzieląc wskaźnik przez dwa?

0

Haha no tak, poprawiłem i działa. Wielkie dzięki za pomoc :)

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