programy w jezyku C

s3ba
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 18 sty 2009, o 21:53
Płeć: Mężczyzna
Podziękował: 37 razy
Pomógł: 5 razy

programy w jezyku C

Post autor: s3ba »

1.Napisać program generujący 10000 liczb losowych z przedziału [0,100) i wyznaczający
częstości wystąpień poszczególnych liczb.

2. Napisać program wczytujący z klawiatury 8-elementową tablicę liczb typu double,
następnie obliczyć:
• sumy elementów dodatnich i ujemnych,
• sumę elementów o wartościach należących do przedziału [a,b], granice przedziału
spełniające warunek a<b należy wczytać z klawiatury
• sumę elementów, których indeksy należą do zadanego przedziału indeksów [k,l];
indeksy należy wczytać z klawiatury z zabezpieczeniem formatu.

3. Rozwinięcie w szereg Maclaurina funkcji arctan(x) dane jest następującą formułą:
\(\displaystyle{ arctan(x)= \sum_{n=0}^{ \infty } (-1)^{n} \frac{x ^{2n+1} }{2n+1}}\)
Oblicz liczbę π(pi) z dokładnością do k miejsc po kropce dziesiętnej ( k<10 – parametr
wczytaj z klawiatury) stosując rozwinięcie wokół punktu x=1 .

Z góry dziękuje za wszelką pomoc.
Awatar użytkownika
Le_Quack
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 30 maja 2009, o 12:03
Płeć: Mężczyzna
Lokalizacja: City 17
Pomógł: 6 razy

programy w jezyku C

Post autor: Le_Quack »

Zadanie 1.

Kod: Zaznacz cały

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

int i,wyst[101];

int main()
{

	srand(time(0)); // Funkcja losująca liczby na podstawie czasu
	for(i=0; i<10000; i++){ // Wykonuje pętlę 10000 razy
		wyst[rand() % 101]++; // Zwiększ element tablicy na który wskazuje liczba wylosowana <0,100>
		}
	for(i=0; i<101; i++){ // Pętla wypisująca częstość występowania liczb
		printf("Liczba %d wystapila %d razy
", i, wyst[i]);
	}
return 0;
}

Przypuszczam że możesz nie zrozumieć tego: "wyst[rand() % 101]++;", chodzi o to że zostaje zwiększony element tablicy w zależności od wylosowanej liczby, czyli jak wylosuje liczbę 28 to 28. element tablicy "wyst" zostanie zwiększony o jedną wartość.
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

programy w jezyku C

Post autor: Dedemonn »

Kod: Zaznacz cały

rand() % 101
rand() % 100 (zakres [0,100) )
Awatar użytkownika
Le_Quack
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 30 maja 2009, o 12:03
Płeć: Mężczyzna
Lokalizacja: City 17
Pomógł: 6 razy

programy w jezyku C

Post autor: Le_Quack »

Nie, ma być 101. Skompiluj sobie program i przećwicz jego działanie z randem dla 100 i 101. Przy "rand() % 100" liczba 100 nigdy nie wystąpi.

Chyba że jemu chodziło o to żeby tej 100 nie było...
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

programy w jezyku C

Post autor: Dedemonn »

Skompilować nie mam jak, ale nie ważne. Zaznaczyłem tylko, że przedział [0,100), oznacza 0 włącznie i 100 wyłączając - więc modulo 100 jest wtedy w porządku.

(dodam jeszcze, że niesprecyzowane to polecenie - nie ma mowy o tym, że to liczby całkowite ;] )
s3ba
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 18 sty 2009, o 21:53
Płeć: Mężczyzna
Podziękował: 37 razy
Pomógł: 5 razy

programy w jezyku C

Post autor: s3ba »

Dziękuje za pomoc przy zadaniu 1.
Niestety dostalem te zadania jako prace domowa w takiej formie jak sa przedstawione i nie potrafie powiedziec czy chodzi o liczby całkowite. A co do zakresu to z zadania chyba wynika
10000 liczb losowych z przedziału [0,100)
ze 100 nie wchodzi do tego przedzialu.

Bede wdzieczny za pomoc przy pozostalych zadaniach, przy 2 problemem sa te dwa podpunkty:
• sumę elementów o wartościach należących do przedziału [a,b], granice przedziału
spełniające warunek a<b należy wczytać z klawiatury
• sumę elementów, których indeksy należą do zadanego przedziału indeksów [k,l];
indeksy należy wczytać z klawiatury z zabezpieczeniem formatu
a w 3 nie wiem od czego zaczac.
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

programy w jezyku C

Post autor: Dedemonn »

• sumę elementów o wartościach należących do przedziału [a,b], granice przedziału
spełniające warunek a<b należy wczytać z klawiatury
Zakładając, że tablicę mamy już uzupełnioną:

Kod: Zaznacz cały

int a,b;
printf("Podaj a: ");
scanf("%d", &a);
printf("Podaj b: ");
scanf("%d", &b);

int i;
double suma = 0;
for( i = 0; i < tab.length; i++ )
    if( tab[i] >= a  &&  tab[i] <= b )
        suma += tab[i];

printf("Suma liczb z przedzialu [%d, %d] wynosi %d.", a, b, suma);
A w 3. zacznij od napisania funkcji arctan(double x), która na podstawie podanego wzoru zwraca wartość dla podanego x. Zacznij chociaż, spróbuj - nie licz zawsze na innych.

Pzdr.
s3ba
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 18 sty 2009, o 21:53
Płeć: Mężczyzna
Podziękował: 37 razy
Pomógł: 5 razy

programy w jezyku C

Post autor: s3ba »

Poprzez slowo pomoc nie oczekuje gotowcow, jestem wdzieczny za wszelkie rady i wskazowki

Program do punktu 2 napisalem, mam nadzieje ze o to chodzilo:

Kod: Zaznacz cały

#include <stdio.h>
#include <conio.h>
int main() {
    int i,k,l,c,e,m;
    double tab[8],d=0,u=0,suma=0,a,b,y,z;
    
    for (i=0;i<8;i++)
    {
    printf("a[%d]=",i); scanf("%lf",&tab[i]);
    }  
    for (i=0;i<8;i++)
        {
        if (tab[i]>0)
        d+=tab[i];
        else
        u+=tab[i];
        }
        printf("Suma liczb dodatnich = %lg
",d);
        printf("Suma liczb ujemnych = %lg
",u);
        
        printf("Podaj a: "); scanf("%lf",&y);
        printf("Podaj b: "); scanf("%lf",&z);
        
        if(y>z)
        {a=z;
        b=y;}
        else
        {a=y;
        b=z;}
        
        for(i=0;i<8;i++)
        if(tab[i]>=a && tab[i]<=b)
        suma+=tab[i];
        
        printf("Suma liczb z przedzialu [%lg, %lg] wynosi %lg.
",a,b,suma);
    
    do
    {   printf("Podaj k: "); m=scanf("%d",&c);
        fflush(stdin);
        }while (m==0);
    do
    {   printf("Podaj l: "); m=scanf("%d",&e);
        fflush(stdin);
        }while (m==0);
        
        if(c>e)
        {k=e;
        l=c;}
        else
        {k=c;
        l=e;}
        
        i=k;
        suma=0;
        for(i;i<=l;i++)
        suma+=tab[i];        
        
        printf("Suma liczb z przedzialu indeksow [%d, %d] wynosi %lg.
",k,l,suma);
        
    
    system("pause");
}
W 3 zadaniu jak zapisac w C \(\displaystyle{ \sum_{n=0}^{ \infty }}\)?

Na zajeciach robilismy sumowanie, ale gdzie obie granice byly skonczonymi liczbami. Wtedy obliczalismy wyrazenia za pomoca petli.
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

programy w jezyku C

Post autor: Dedemonn »

Tutaj również górna granica będzie liczbą, bo pętla nieskończona by się nigdy nie skończyła. Ja bym to zrobił tak, że przy każdym obrocie pętli sprawdzałbym ile miejsc po przecinku liczba już posiada (czyli jaką ma dokładność).
s3ba
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 18 sty 2009, o 21:53
Płeć: Mężczyzna
Podziękował: 37 razy
Pomógł: 5 razy

programy w jezyku C

Post autor: s3ba »

Dzieki, a jak sie sprawdza ilosc miejsc danej liczby po przecinku?

Czy moge uzyc do tego warunku if np.

Kod: Zaznacz cały

petla{
if (arctan(x)==nie wiem jak napisac warunek na dana liczbe miejsc po przewcinku)
goto e1;
}
e1: printf("wynik: %lg",&wynik);
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

programy w jezyku C

Post autor: Dedemonn »

Oj, tutaj już chyba nie pomogę, bo musiałbym znać funkcje biblioteczne C. Z braku takowej napisałbym funkcję, parsującą liczbę do stringa i za pomocą pętli for zliczał ilość znaków po przecinku (kropce).

PS. NIGDY nie używaj instrukci goto. Jest ona zła, be, nieoptymalna, wprowadza zamieszanie i utrudnia zrozumienie kodu. W Twoim przypadku nigdzie nawet nie trzeba skakać, tylko wywołać break (wyjście z pętli).


Pozdrawiam.
ODPOWIEDZ