Kezdőoldal » Számítástechnika » Programozás » Hogyan lehet c-ben kiszámoni,...

Hogyan lehet c-ben kiszámoni, hogy hány nap telt el két dátum között (beépített függvények nélkül)?

Figyelt kérdés
Beadandóhoz kellene. Két karakterekből álló tömmben van megadva a dátum (pl. char maiDatum[12] = "2021.12.19.";). Valami olyan lenne a lényeg, hogy külön kéne bontani a pontok mentén, és utána számolni vele.

2021. dec. 19. 14:06
 1/8 anonim ***** válasza:
91%

"Valami olyan lenne a lényeg, hogy külön kéne bontani a pontok mentén, és utána számolni vele"


Igy van, ezt kell csinalni.

Nyilvan erdemes felvenni elotte, hogy melyik honap hany napos, illetve figyelni a szokoevekre.

2021. dec. 19. 14:39
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:

Es te vagy valaki innen esetleg segitene, hogy nez ki pontosan ez a kodreszlet? Tettem emelt info erettsegit meg gimiben, de ott java-ban szerencsetlenkedtunk, es kb. mindegy volt hogy nez ki a kod vagy milyen fuggyvenyt hasznalunk, csak mukodjon, es eleve inkabb a tobbi reszet nyomattak nekunk, progibol az volt a lenyeg hogy kaparjunk ossze par pontot a beolvasassal. Most igyekszem igenyesebben csinalni, de mar elegge belekavarodtam.

Koszonom a valaszod egyebkent! :)

2021. dec. 19. 15:06
 3/8 A kérdező kommentje:
Pointerek is belekavarnak, es nem ertem hogyan nez ki a gyakorlatban ez a felosztas. Az oke, hogy scanf-el bekerunk egy datumot a felhasznalotol es eltaroljuk egy tombbe. Scanf-el allitolag fel is lehet darabolni a pontok menten. De ha nem a felhasznalo irja be a datumot? Nem ertem hogy lehetne megoldani.
2021. dec. 19. 15:29
 4/8 anonim ***** válasza:
0%

Lehet hogy a következő link segít neked.

[link]

2021. dec. 19. 15:52
Hasznos számodra ez a válasz?
 5/8 anonim ***** válasza:

#4: A gond az, hogy a feladatban C nyelvről van szó, és nem lehet használni semmilyen dátummal kapcsolatos segédfüggvényt, a dátumok között eltelt időt manuálisan kell kiszámolgatni.


A Javascriptben a Date objektum a dátumot az 1970 január 1. 00:00:00 óta eltelt ezredmásodpercek számában reprezentálja:

"Date objects contain a Number that represents milliseconds since 1 January 1970 UTC."

[link]

úgy persze könnyű vele számolni.

2021. dec. 19. 16:48
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:

Ez egy lehetséges megoldás: [link]

Itt strtok() függvénnyel darabolom fel a stringet, utána unsigned short-ra alakítom és úgy számolok vele. Fordításkor van néhány warning, de amúgy jó, nagyjából...


Itt egy másik megoldás: [link]

Ha már a scanf-re megyünk rá...


Egyik sem validálja a formátumokat, tehát ha hülyeséget adsz meg neki, akkor hülyeség lesz a végeredmény is, vagy segfault. A te dolgod lesz ellenőrzéseket tenni bele.


Illetve még egy bug van mindkettőben, ugyanis a Wikipedia szerint: "Szökőévek a következők: minden néggyel osztható év, kivéve a százzal is oszthatókat. Szökőévek viszont a 400-zal osztható évek. Vagyis a századfordulók évei közül csak azok szökőévek, amelyek 400-zal is oszthatók."


Én ebből csak a 4-gyel való oszthatóságot ellenőrzöm, így nálam minden 4-gyel osztható év szökőév.

2021. dec. 19. 17:35
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:

"Pointerek is belekavarnak"


Mondjuk ezt nem csodálom.

Itt az szokott lenni a probléma, hogy az ember nem tudja, mikor kell a címképző (&) operátor, és mikor nem.

Nézzük meg ezt a kódot:


#include <stdlib.h>

#include <stdio.h>


int main() {

char s[5];

scanf("%s", s);

printf("%s\n", s);


char *p = s;

scanf("%s", p);

printf("%s\n", s);


int i;

scanf("%d", &i);

printf("%d\n", i);

return 0;

}


Első esetben nincs &, második esetben sincs, harmadik esetben szintén van.

Miért nincs az első esetben dereferencia operátor? Azért, mert a tömb az eleve egy pointer!

Pontosabban ez nem teljesen igaz, de a gyakorlatban a tömbökkel nyugodtan lehet úgy bánni, mint ha pointerek lennének. Pontosan ezért működik ez:

char *p = s;

Még warningot sem kapsz rá, mert itt gyakorlatilag az egyik pointert adod értékül a másiknak, nincs típuseltérés.

És ez is: *(++p). Így az s-re mutató pointert növeltük eggyel, majd egy erre mutató pointert adtunk vissza. Ugyanaz, mint ez: s[1]



Az utolsónál pedig azért van &, mert a scanf pointert vár, a & pedig pointert ad vissza (jelen esetben az i-re mutató pointert).

2021. dec. 19. 18:02
Hasznos számodra ez a válasz?
 8/8 anonim ***** válasza:

"Scanf-el allitolag fel is lehet darabolni a pontok menten."


Igen, a scanf a formátumstring mentén darabol. Pl.:


#include <stdio.h>


int main () {

char str1[20];


printf("Enter name: ");

scanf("%20s", str1);

return 0;

}


Itt a formátumstring ez: "%19s"

Ez azt jelenti a scanf számára, hogy 20 karakterből álló stringet olvasson be. Bár engedni, hogy beírj neki többet is, de a 20-on felüli karaktereket eldobja, nem teszi bele str1-be.

Ha így adod meg:

int a, b, c, d;

scanf("%d.%d.%d.%d", &a, &b, &c, &d);

Akkor a scanf azt várja, hogy a beírt string úgy néz ki, hogy egy decimális szám, aztán egy pont, megint egy decimális szám, megint egy pont, és így tovább. Ha a megadott formátumban írod be a stringet, akkor az a, b, c, d változókba bekerülnek a megadott számok.


A második programomban, amit írtam, ez van:

scanf("%u.%u.%u.", &year2, &month2, &day2);

Ez azt jelenti a scanf számára, hogy következni fog egy unsigned int, egy pont, még egy unsigned int, még egy pont, végül megint egy unsigned int és megint egy pont. Ha ebben a formátumban adod meg a stringet, akkor a számok bekerülnek a year2, month2, day2 változókba.

2021. dec. 19. 18:15
Hasznos számodra ez a válasz?

További kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!