Programowanie w C, zadania

madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

Programowanie w C, zadania

Post autor: madaf007 »

Muszę zrobić do końca miesiąca parę zadań z programowania. A że na studiach pierwszy raz się z tym stykam mam pewne problemy z zapisem tego w języku C.
Zakładajac, ze od poczatku naszej ery obowiazywał kalendarz gregorianski
(co, prawde mówiac, nie jest prawda), napisz funkcje, która wylicza ile
dni mineło od poczatku ery, do podanej daty. Napisz program, który obliczy ile
dni mineło od daty Twoich urodzin do dnia dzisiejszego. Przelicz to na sekundy.

jedyne co stworzyłem to coś takiego, ale niestety nie działa i nie trzyma się kupy:P
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float d,r;
int i,ii;
int miesiac[12]={31,28,31,30,31,30,31,31,30,31,30,31};
r=r++;

printf("Proszę wpisać rok:");
scanf("%f", &r);
printf("Proszę wpisać miesiac:");
scanf("%f", &miesiac);
printf("Proszę podać dzień:");
scanf("%f",&d);
for(i=0;i<r;i++)
{
if((i%4==0)&&!(i%100==0)||(i%400==0))
{
miesiac[1]+=1;
for(ii=0;ii<12;ii++)
{
d=d+miesiac[ii];
d=d+1;
}
}
else
{
for(ii=0;ii<12;ii++)
{
d=d+miesiac[ii];
}
}
}
printf("Wynik w dniach: %f",d);
}
Nie wiem też jak zrobić to zadanko:
Dla jakich liczb naturalnych n prawdziwa jest nierówność
\(\displaystyle{ 1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}>10}\)? W tym zadaniu program po kompilacji ma po prostu pokazać, że dla n większego czy tam mniejszego od jakiejś liczby?
Awatar użytkownika
steal
Użytkownik
Użytkownik
Posty: 1043
Rejestracja: 7 lut 2007, o 18:35
Płeć: Mężczyzna
Lokalizacja: Białystok|Warszawa
Podziękował: 6 razy
Pomógł: 160 razy

Programowanie w C, zadania

Post autor: steal »

Kod: Zaznacz cały

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

int main(void){
   double sum = 0; //suma lewej części nierówności
   int n = 0; 

   while(sum < 10){ // warunek działania pętli
      ++n;              // zwiększ liczbe n
      sum += 1/n;    // i dodaj do lewej części jej odwrotność
   }

   printf("%d",n);   // wyświetl liczbe n dla ktorej spelniona jest nierownosc

   return 0;
}
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

Programowanie w C, zadania

Post autor: madaf007 »

steal pisze:

Kod: Zaznacz cały

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

int main(void){
   double sum = 0; //suma lewej części nierówności
   int n = 0; 

   while(sum < 10){ // warunek działania pętli
      ++n;              // zwiększ liczbe n
      sum += 1/n;    // i dodaj do lewej części jej odwrotność
   }

   printf("%d",n);   // wyświetl liczbe n dla ktorej spelniona jest nierownosc

   return 0;
}
dziękuję bardzo:) Mniej więcej wiem o co chodzi, ale nie wiem czemu, kiedy kompiluje i uruchamiam włącza mi się tylko konsola i nic nie mogę zrobić jak tlyko ją wyłączyć. Z tego co się orientuje powinna wyskoczyć liczba spełniająca ten warunek.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Programowanie w C, zadania

Post autor: soku11 »

Bo program wpada w nieskończoną pętlę. Powinno być:

Kod: Zaznacz cały

sum+=1.0/n;
Pozdrawiam.
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Programowanie w C, zadania

Post autor: matshadow »

dopisz sobie

Kod: Zaznacz cały

char c;
scanf("%c", &c);
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

Programowanie w C, zadania

Post autor: madaf007 »

soku11 pisze:Bo program wpada w nieskończoną pętlę. Powinno być:

Kod: Zaznacz cały

sum+=1.0/n;
Pozdrawiam.
dzięki już działam. Jeszcze tylko mam pytanie do matshadow, czemu ma służyć dodanie tego wskaźnika?
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Programowanie w C, zadania

Post autor: matshadow »

to żaden wskaźnik po prostu program ci się nie zamknie od razu, jak to dokleisz przed return 0;
Awatar użytkownika
steal
Użytkownik
Użytkownik
Posty: 1043
Rejestracja: 7 lut 2007, o 18:35
Płeć: Mężczyzna
Lokalizacja: Białystok|Warszawa
Podziękował: 6 razy
Pomógł: 160 razy

Programowanie w C, zadania

Post autor: steal »

To nie lepiej wpisać

Kod: Zaznacz cały

system("pause");
?
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Programowanie w C, zadania

Post autor: matshadow »

Szczególnie, że program ma być napisany w C
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

Programowanie w C, zadania

Post autor: madaf007 »

Ok dziękuje:) Mam pytanie jeszcze odnośnie tego pierwszego zadania.
Na laborkach kolega mniej więcej powiedział mi jak mam to zrobić, ale robiąc tak, po drodze znajduję jeden problem:
#include<stdio.h>
#include<stdlib.h>
#define DNIE 365
int main()
{
int miesiace[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int d,m,r;
int x; //zmienna mająca za zadanie wyłonić dni przestępne
x=(r-1)/4;
printf("Prosze podac rok:");
scanf("%d",&r);
printf("Prosze podac miesiac:");
scanf("%d",&m);
printf("Prosze podac dzien:");
scanf("%d",&d);
{
printf("%d",((r-1)*DNIE)+x);
system("PAUSE");
return 0;
}
}
Na początku chcąc wyliczyć tylko dni od początku naszej ery do roku poprzedniego niż ten co został wypisany, po kompilacji i wpisaniu roku np. 2012 wyskakują mi milionowe liczby. I na dodatek ilość tych dni jest zależny od miesiecy i dni jakich wpiszę, mimo, że jeszcze w żadnym działaniu ich nie uwzględniłem. Gdzie tutaj popełniam błąd?

Mażąc tablice policzyło mi już dobrze(później ją muszę uwzględnić), tyle że nie uwzględniło zmiennej x. Nie dodało tych zaległych dni przestępnych.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Programowanie w C, zadania

Post autor: soku11 »

@matshadow, steal:
Tak w ogóle, to nie ma sensu jakoś sztucznie z tym kombinować. Jest to aplikacja strumieniowa i tak ma działać. Jak wam się konsola wyłącza, to po prostu uruchomcie program w terminalu cmd. W cmd, bo zakładam, że nikt z was pod pingwinem nie siedzi

Co do problemu:
Popatrz na tę linijkę:

Kod: Zaznacz cały

int x; //zmienna mająca za zadanie wyłonić dni przestępne
x=(r-1)/4;
Co będzie wartością x? Podpowiedź - nie wiadomo. Zaczynamy liczyć: r-1=? Nie wiadomo ile, bo zmienna r ma na początku losową wartość. Przez to otrzymujesz takie dziwne wartości (na końcu dodajesz właśnie x, który wszystko psuje

Pozdrawiam.
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Programowanie w C, zadania

Post autor: matshadow »

Co kto woli, soku11 Ja osobiście piszę system("pause"), żebym nie musiał za każdym razem do cmd sięgać
P.S. Gratuluję 6000-cznego posta
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

Programowanie w C, zadania

Post autor: madaf007 »

soku11 pisze:@matshadow, steal:
Tak w ogóle, to nie ma sensu jakoś sztucznie z tym kombinować. Jest to aplikacja strumieniowa i tak ma działać. Jak wam się konsola wyłącza, to po prostu uruchomcie program w terminalu cmd. W cmd, bo zakładam, że nikt z was pod pingwinem nie siedzi

Co do problemu:
Popatrz na tę linijkę:

Kod: Zaznacz cały

int x; //zmienna mająca za zadanie wyłonić dni przestępne
x=(r-1)/4;
Co będzie wartością x? Podpowiedź - nie wiadomo. Zaczynamy liczyć: r-1=? Nie wiadomo ile, bo zmienna r ma na początku losową wartość. Przez to otrzymujesz takie dziwne wartości (na końcu dodajesz właśnie x, który wszystko psuje

Pozdrawiam.
Aha takie buty:) Więc jak mam zrobić, żeby r nie miało losowej wartości, tylko tą która wpiszemy? Na razie wypociłem takie coś. Nie bawiłem się z tą zmienna x tylko po prostu wpisałem (r-1)/4 tam gdzie miało być x.
#include<stdio.h>
#include<stdlib.h>
#define DNIE 365
int main()
{

int d,m,r;
int rok;
int suma=0;
int i, dni=0;
printf("Prosze podac rok:");
scanf("%d",&r);
printf("Prosze podac miesiac:");
scanf("%d",&m);
printf("Prosze podac dzien:");
scanf("%d",&d);
rok=(((r-1)*DNIE)+((r-1)/4));
int miesiace[12]={31,28,31,30,31,30,31,31,30,31,30,31};
m=m-1;
if((r%4==0)&&!(r%100==0)||(r%400==0))
miesiace[1]+=1;

for(i=0,i<12,i++)
suma=suma+miesiace;


printf("Wynik w dniach: %d
",rok+suma+d);

system("PAUSE");
return 0;
}


Program niestety nie zlicza miesięcy. Nie wiem jak je uwzględnić.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Programowanie w C, zadania

Post autor: soku11 »

A skąd masz niby wiedzieć NA POCZĄTKU działania programu jaką wartość będzie miała zmienna r? Nie da się tak. Rozwiązanie - oblicz tą wartość (cokolwiek to jest) dopiero jak użytkownik poda ci rok... Proste, nie?

Ponadto radzę formatować kod, bo tak się go nie da czytać.

Co do samego problemu:
To ma liczyć ilość dni od daty 0 do podanej przez użytkownika? Jeśli tak, to na pewno to nie zadziała. Najprościej, to musisz pętlą przejść po każdym roku, zliczyć ile wtedy jest dni i zsumować. Trochę taka metoda jest bez sensu, więc polecam policzyć najpierw ile jest lat przestępnych, ile nieprzestępnych od roku 0 do r-1. Wtedy suma dni, to po prostu: iloscPrzestepnych*366+iloscNieprzestepnych*365. Na końcu trzeba jeszcze policzyć ile jest dni w roku r do podanej daty i dosumować. Ogólnie radzę sobie najpierw na kartce rozpisać metodę postępowania, a później brać się za kod. Bo tak nigdy nic w pełni działającego nie stworzysz :]

Pozdrawiam.
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

Programowanie w C, zadania

Post autor: madaf007 »

soku11 pisze:A skąd masz niby wiedzieć NA POCZĄTKU działania programu jaką wartość będzie miała zmienna r? Nie da się tak. Rozwiązanie - oblicz tą wartość (cokolwiek to jest) dopiero jak użytkownik poda ci rok... Proste, nie?

Ponadto radzę formatować kod, bo tak się go nie da czytać.

Co do samego problemu:
To ma liczyć ilość dni od daty 0 do podanej przez użytkownika? Jeśli tak, to na pewno to nie zadziała. Najprościej, to musisz pętlą przejść po każdym roku, zliczyć ile wtedy jest dni i zsumować. Trochę taka metoda jest bez sensu, więc polecam policzyć najpierw ile jest lat przestępnych, ile nieprzestępnych od roku 0 do r-1. Wtedy suma dni, to po prostu: iloscPrzestepnych*366+iloscNieprzestepnych*365. Na końcu trzeba jeszcze policzyć ile jest dni w roku r do podanej daty i dosumować. Ogólnie radzę sobie najpierw na kartce rozpisać metodę postępowania, a później brać się za kod. Bo tak nigdy nic w pełni działającego nie stworzysz :]

Pozdrawiam.
Jak to ogólnie ma wyglądać to nie mam z tym problemu, gorzej jest z przeniesieniem to na język C. Nie znam jeszcze większości podstaw , w tym jest cały problem. Np. kompletnie nie mogę zczaić zastosowania pętli, tak samo z tablicami mam problem, czy też co pod czym pisać, żeby to w C miało sens. Ciągle nie wiem jak mam włączyć w ten mój kod miesiące. Powiedzmy, że on mniej więcej dobrze liczy. Gdzie i co mam umieścić pod tablicami, żeby uzwględniało mi dni z miesiąca? Ponieważ tam mam zmienną m a tablica nazywa się miesiace i to się nie chce zgrać;]
ODPOWIEDZ