Poprawność programów w języku C.

DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Poprawność programów w języku C.

Post autor: DBoniem »

Oprogramuj rozwiązywanie równania liniowego a*x+b=c, gdzie \(\displaystyle{ a,b,c \in R}\).

Kod: Zaznacz cały

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

main()

{
      float a,b,c,x;
      
      printf("Podaj wspolczynnik a rownania liniowego ax+b=c 
");
      
      scanf("%f",&a);
      
      printf("Podaj wspolczynnik b rownania liniowego ax+b=c 
");
      
      scanf("%f",&b);
      
      printf("Podaj wspolczynnik c rownania liniowego ax+b=c 
");
      
      scanf("%f",&c);
      
      x=((c-b)/a);     /*bo ax+b=c mozna zapisać jako ax=c-b -> x=c-b/a*/ 
      
      printf("x wynosi %f
",x);
      
      system("PAUSE");
      return 0;
      
      }
      
dobrze?, czy może jeszcze trzeba uwzględnić przypadki, gdy mamy dany np. b,c,x a szukamy a?
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

Poprawność programów w języku C.

Post autor: wawek91 »

Jak dla mnie to jest ok i wystarcza.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Poprawność programów w języku C.

Post autor: miki999 »

A po co Ci:

Kod: Zaznacz cały

#include <math.h>
?


Pozdrawiam.
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Poprawność programów w języku C.

Post autor: DBoniem »

Oprogramuj pełen algorytm rozwiązywania układu dwóch równań liniowych z dwoma zimiennymi, który badać będzie nieoznaczoność oraz sprzeczność układu.

Kod: Zaznacz cały

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

main()

{
      float a,b,c,d,e,f,x,y;
      
      /*Pierwsze równanie liniowe postaci ax+by=c*/
      
      printf("Podaj wspolczynnik a rownania liniowego ax+by=c 
");
      
      scanf("%f",&a);
      
      printf("Podaj wspolczynnik b rownania liniowego ax+by=c 
");
      
      scanf("%f",&b);
      
      printf("Podaj wspolczynnik c rownania liniowego ax+by=c 
");
      
      scanf("%f",&c);
      
      /*Drugie rownanie liniowe postaci dx+ey=f*/
      
      printf("Podaj wspolczynnik d rownania liniowego dx+ey=f 
");
      
      scanf("%f",&d);
      
      printf("Podaj wspolczynnik b rownania liniowego dx+ey=f 
");
      
      scanf("%f",&e);
      
      printf("Podaj wspolczynnik b rownania liniowego dx+ey=f 
");
      
      scanf("%f",&f);
       
       x=(e*c-b*f)/(a*e-b*d);  /* przekształcenie układu, tak aby x oraz y miały rozwiązania*/
       y=(c*d-a*f)/(d*b-a*e);
              
        
     printf("x wynosi %f
",x);
       printf("y wynosi %f
",y);
       
       system("PAUSE");
       return 0;
       }                      
      
Jeśli w taki sposób jest dopuszczalny, to jak to napisać z nieoznaczonością oraz sprzecznością? czy tu potrzebne są instrukcje warunkowe?
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

Poprawność programów w języku C.

Post autor: darek20 »

skorzystaj z wyznaczników
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Poprawność programów w języku C.

Post autor: DBoniem »

możesz rozwinąć myśl?
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

Poprawność programów w języku C.

Post autor: darek20 »

umiesz rozwiązywac układ za pomocą wyznaczników?
abc666

Poprawność programów w języku C.

Post autor: abc666 »

W 1. nie sprawdzasz warunku czy \(\displaystyle{ a=0}\)
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Poprawność programów w języku C.

Post autor: DBoniem »

Kod: Zaznacz cały

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

main()

{
      float a,b,c,x;
      
      printf("Podaj wspolczynnik a rownania liniowego ax+b=c 
");
      
      scanf("%f",&a);
      
      printf("Podaj wspolczynnik b rownania liniowego ax+b=c 
");
      
      scanf("%f",&b);
      
      printf("Podaj wspolczynnik c rownania liniowego ax+b=c 
");
      
      scanf("%f",&c);
      
       if(a==0)
       printf("Rownanie sprzeczne 
");
       
       else
      
      x=((c-b)/a);     /*bo ax+b=c mozna zapisać jako ax=c-b -> x=c-b/a*/ 
      
      printf("x wynosi %f
",x);
      
      system("PAUSE");
      return 0;
      
      }
      
To już powinno być dobrze

a w zadaniu drugim

Kod: Zaznacz cały

 x=(e*c-b*f)/(a*e-b*d);  /* przekształcenie układu, tak aby x oraz y miały rozwiązania*/
       y=(c*d-a*f)/(d*b-a*e);
       
       if(((a==0 || e==0) && (b==0 || d==0))|| (a==b==c==d==e==f))  
       
       printf("sprzecznosc ukladu 
");
       
       else
       
       
     printf("x wynosi %f
",x);
       printf("y wynosi %f
",y);
       
       system("PAUSE");
       return 0;
       }
      
      
      
      
podany został część kodu reszta bez zmiany, tutaj uwzględniłem kilka przypadków kiedy układ będzie sprzeczny, lecz myślę, że takich przypadków może być znacznie więcej, czy należy każdy z osobna tak rozpisywać, czy jest szybszy sposób na rozwiązanie tego problemu?
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

Poprawność programów w języku C.

Post autor: darek20 »

1. gdy a=0 tez moze byc w pewnym przypadku nieskończenie wiele rozwiazań

2. metoda wyznaczników w układach równań
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Poprawność programów w języku C.

Post autor: miki999 »

Ja pitole, żeście tych wyznaczników się uczepili.

Pierwsze równanie to jedna prosta, drugie równanie to druga prosta. Rozwiązaniem układu równań jest pkt. przecięcia się tych prostych.
Wystarczy odp. na pytanie:
Kiedy będzie nieskończenie wiele rozwiązań?
Kiedy nie będzie żadnego rozwiązania?
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Poprawność programów w języku C.

Post autor: DBoniem »

1.Napisz program rozwiązujący w liczbach całkowitych równanie aX+bY=c jest to zadanie z gwiazdką

ktoś ma jakiś pomysł na to zadanie, prócz rozwiązania podobnego jak z równaniami liniowymi?

2.Parę liczb pierwszych (p,q) nazywamy bliźniakami, jeśli q=p+2. Ile jest par bliźniaków mniejszych od 1 000 000

3.Liczby pierwsze postaci p.p/2,p/6,p/8 nazywane są czworakami. znajdź wszystkie czworaki mniejsze od 1000

4.znajdź wszystkie liczby pierwsze palindromiczne mniejsze od 1000.

do zadań 2,3,4 przydałyby się również pewne wskazówki



i jeszcze jedno jak zapisać w języku c wzór stirlinga\(\displaystyle{ \sqrt{2*II*n} *( \frac{n}{e}) ^{n}}\)

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
# define e 2.718  
# define pi 3.141

main()
{
      

float n,nsilnia;

printf("podaj liczbe n 
");

scanf("%f",&n);


nsilnia=sqrt(2.0*pi*n)*pow(n/e,n);

printf("n! = %f
",nsilnia);


system("PAUSE");
return 0;
}

Tak zapisany program pozwoli obliczyć przybliżoną wartość silni dla 34!, lecz przy próbie wpisania kolejnych silni 35!... wyskakuje błąd, a potrzebuje tego wzoru do rozwinięcia dziesiętnego liczby 1000!
czy należy zastosować zamiast float np. double i jeszcze jedno pytanie czy jest możliwość, żeby podać wartośći stałe pi oraz e z większym rozwinięciem dziesiętnym (bardziej dokładny byłby wtedy odczyt programu)?
PMichalak
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 29 paź 2009, o 20:03
Płeć: Mężczyzna
Lokalizacja: Kalisz
Podziękował: 1 raz
Pomógł: 16 razy

Poprawność programów w języku C.

Post autor: PMichalak »

1. Poczytaj o Rozszerzonym algorytmie Euklidesa. Chociaż dla początkującego może to być nietrywialne, ale powinieneś zrozumieć.
2. Zrobić sito Erastotenesa, a później sprawdzać różnice między kolejnymi liczbami pierwszymi?
3. Raczej powinno zamiast dzielenia być dodawanie, bo jeśli chodzi o to co napisałeś to odpowiedź = 0. W przeciwnym rozwiązanie bardzo podobne jak poprzednio.
4. Możesz użyć jakiejś tam funkcji konwertującej liczbę na napis: ... dlib/itoa/
a później naiwnie sprawdzić czy napis jest palindromem. Pewnie to umiesz.

Float to bardzo błędogenny typ, spróbuj użyć long double, jest znacznie dokładniejszy.
Pamiętaj, że wszystkie typy zmienno przecinkowe przechowują tylko przybliżone wartości, nie uzyskasz za ich pomocą dokładnego rozwinięcia dziesiątkowego dużych liczb (większych niż \(\displaystyle{ 10^{19}}\) w przypadku long double.

PS:
Twój program z silnią po lekkim tuningu:

Kod: Zaznacz cały

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
const double E = exp(1.0);
const double Pi = 2*asin(1.0);

int main()
{
    double nsilnia;
    int n;
    printf("Podaj liczbe n: 
");
    scanf("%d",&n);
    nsilnia = sqrt(2.0*Pi*n)*pow(n/E,n);
    printf("n! = %lf
", nsilnia);
    system("PAUSE");
    return 0;
}
Zmieniłem stałe na znacznie dokładniejsze niż miałeś, mam nadzieje, że wiesz skąd się to bierze.
No i zmieniłem na double (dokładne wyniki do \(\displaystyle{ 10^{14}}\)}.
DBoniem
Użytkownik
Użytkownik
Posty: 312
Rejestracja: 25 lis 2010, o 13:47
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 1 raz

Poprawność programów w języku C.

Post autor: DBoniem »

program rozwiązania układu dwóch równań liniowych
ax+by=c
dx+ey=f

język c

Kod: Zaznacz cały

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

BIOOLEAN url2(double a,double b,double c,double d, double e,double f,double *x, double *y)
{
         double det;
         det=a*e - d*b;
         if(det==0)
         return(FALSE);
         *x=(c*e-f*b)/det;
         *y=(a*f-d*c)/det;
         return(TRUE);
         }
         int main()
         {
             double a,b,c,d,e,f,x,y;
             printf("podaj parametry a,b,c,d,e,f: ");
             scanf(" %1f %1f %1f %1f %1f %1f", &a, &b, &c, &d,&e,&f);
             printf("
");
             
             if (url2(a,b,c,d,e,f,&x,&y))
             printf("rozwiazanie ukladu: x=%f y=%f
",x,y);
             else
             printf("uklad jest sprzeczny lub niezonaczony. 
");
             return(0);
             }
co tutaj nie pasuje
(biblioteki początkowe możliwe że nie ze wszystkich korzystam w tym programie).
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Poprawność programów w języku C.

Post autor: miki999 »

Przede wszystkim masz funkcję, której nie wywołujesz.


Pozdrawiam.
ODPOWIEDZ