Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιουν 2011, 15:07

Θα μπορούσες να βελτιστοποιήσεις λιγάκι και τον κώδικα της xdays() αφαιρώντας το όρισμα του πρόσημου. Μπορείς να την κάνεις δλδ κάπως έτσι:

Κώδικας: Επιλογή όλων

int xdays(int days)
{
/* Get date after / before X days */
struct tm *timeinfo;
time_t rawtime;

rawtime = time(NULL);
timeinfo = localtime(&rawtime);
timeinfo->tm_mday = timeinfo->tm_mday + days;
sprintf(buffer, "Date %s %d days: ",
days < 0 ? "before" : "after",
days < 0 ? -days : days);

mktime(timeinfo);

fputs(buffer, stdout);
strftime(buffer, SIZE, "%A, %B %d %Y.\n", timeinfo);
fputs(buffer, stdout);

return 0;
}


και κατόπιν να την καλείς είτε με θετικό είτε με αρνητικό όρισμα:
Κώδικας: Επιλογή όλων

xdays(-30); // ή π.χ. xdays(15);


Αφενός το ? : είναι τελεστής και εκτελείται πιο γρήγορα από το απλό if-else, αφετέρου γλιτώνεις ένα όρισμα.

medigeek έγραψε:Διορθώθηκε! Για το setlocale είναι νωρίς ακόμη. :P
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό medigeek » 22 Ιουν 2011, 01:00

Καλό αυτό, σημειώθηκε!
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 22 Ιουν 2011, 17:44

η puts είναι κάτι σαν την printf;
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 18:18

Ναι, αλλά μόνο για strings (και τυπώνει κι ένα ENTER στο τέλος): http://pubs.opengroup.org/onlinepubs/00 ... /puts.html
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 22 Ιουν 2011, 18:23

πες μου τα λάθη μου
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <math.h>
#include <string.h>

// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας d,m,y σε Ιουλιανό αριθμό
//

long int date_2jdn( int d, int m, int y )
{
return ( 1461 * ( y + 4800 + ( m - 14 ) / 12 ) ) / 4 +
( 367 * ( m - 2 - 12 * ( ( m - 14 ) / 12 ) ) ) / 12 -
( 3 * ( ( y + 4900 + ( m - 14 ) / 12 ) / 100 ) ) / 4 +
d - 32075;

}


// ---------------------------------------------------------------------------------
// Μετατροπή Ιουλιανού αριθμού σε ημερομηνία d,m,y
//
void jdn_2date( int *d, int *m, int *y, long int jdn )
{
long int l = jdn + 68569;
long int n = ( 4 * l ) / 146097;
l = l - ( 146097 * n + 3 ) / 4;
long int i = ( 4000 * ( l + 1 ) ) / 1461001;
l = l - ( 1461 * i ) / 4 + 31;
long int j = ( 80 * l ) / 2447;
*d = l - ( 2447 * j ) / 80;
l = j / 11;
*m = j + 2 - ( 12 * l );
*y = 100 * ( n - 49 ) + i + l;

return;
}


// ---------------------------------------------------------------------------------

int main(void)
{
int d1, m1, y1, d2, m2, y2, d3, m3, y3;
long int jdn1, jdn2, jdn3, jdn4;


// διάβασε την 1η ημερομηνία
printf("Ποια είναι η σημερινή ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
jdn1 = date_2jdn( d1, m1, y1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn1);


// διάβασε τη 2η ημερομηνία
do {
printf("Ποια ημερομηνία γεννηθήκατε (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
jdn2 = date_2jdn( d2, m2, y2);
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της 1ης ημερομηνίας, δοκιμάστε ξανά");
} while (jdn2 > jdn1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn2);


// υπολόγισε την διαφορά μεταξύ τον ημερομηνιών
jdn3 = (jdn1 - jdn2);


// μετατροπή σε ημερομηνία
jdn4 = jdn_2date( d3, m3, y3, jdn4 );

//------------------------------------------------------------------------
printf("Είσαι %d χρονών, %d μηνών και %d ημερών", y3, m3, d3);

return 0;
}
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 19:46

Γραμμή 64:
  1. τα d3, m3, y3 πρέπει να περαστούν με & μπροστά, μιας και στον ορισμό της jdn_2date (γραμμή 21) είναι δηλωμένα ως δείκτες (σωστό, για να διατηρούν τις τιμές τους και μετά το πέρας της συνάρτησης)
  2. η συνάρτηση jdn_2date έχει οριστεί να μην επιστρέφει τίποτα (void, γραμμή 21) αλλά εσύ τη χρησιμοποιείς σαν να επιστρέφει κάτι, το οποίο κάτι προσπαθείς να το εκχωρήσεις στη μεταβλητή: jdn4
Επίσης, δεν καταλαβαίνω τι προσπαθείς να κάνεις και σε επίπεδο λογικής με τα: jdn4, d3, m3 και y3.


clepto έγραψε:πες μου τα λάθη μου
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <math.h>
#include <string.h>

// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας d,m,y σε Ιουλιανό αριθμό
//

long int date_2jdn( int d, int m, int y )
{
return ( 1461 * ( y + 4800 + ( m - 14 ) / 12 ) ) / 4 +
( 367 * ( m - 2 - 12 * ( ( m - 14 ) / 12 ) ) ) / 12 -
( 3 * ( ( y + 4900 + ( m - 14 ) / 12 ) / 100 ) ) / 4 +
d - 32075;

}


// ---------------------------------------------------------------------------------
// Μετατροπή Ιουλιανού αριθμού σε ημερομηνία d,m,y
//
void jdn_2date( int *d, int *m, int *y, long int jdn )
{
long int l = jdn + 68569;
long int n = ( 4 * l ) / 146097;
l = l - ( 146097 * n + 3 ) / 4;
long int i = ( 4000 * ( l + 1 ) ) / 1461001;
l = l - ( 1461 * i ) / 4 + 31;
long int j = ( 80 * l ) / 2447;
*d = l - ( 2447 * j ) / 80;
l = j / 11;
*m = j + 2 - ( 12 * l );
*y = 100 * ( n - 49 ) + i + l;

return;
}


// ---------------------------------------------------------------------------------

int main(void)
{
int d1, m1, y1, d2, m2, y2, d3, m3, y3;
long int jdn1, jdn2, jdn3, jdn4;


// διάβασε την 1η ημερομηνία
printf("Ποια είναι η σημερινή ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
jdn1 = date_2jdn( d1, m1, y1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn1);


// διάβασε τη 2η ημερομηνία
do {
printf("Ποια ημερομηνία γεννηθήκατε (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
jdn2 = date_2jdn( d2, m2, y2);
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της 1ης ημερομηνίας, δοκιμάστε ξανά");
} while (jdn2 > jdn1);
printf("Ο Ιουλιανός αριθμός είναι: %ld\n\n", jdn2);


// υπολόγισε την διαφορά μεταξύ τον ημερομηνιών
jdn3 = (jdn1 - jdn2);


// μετατροπή σε ημερομηνία
jdn4 = jdn_2date( d3, m3, y3, jdn4 );

//------------------------------------------------------------------------
printf("Είσαι %d χρονών, %d μηνών και %d ημερών", y3, m3, d3);

return 0;
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 22 Ιουν 2011, 20:59

η λογική μου ήταν λάθος...την ξανασκέφτηκα τώρα...
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 22 Ιουν 2011, 23:26

Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <math.h>
#include <string.h>

#define isleap(y) ( !((y) % 4) && ( (y) % 100 || !((y) % 400) ) )


// ---------------------------------------------------------------------------------
// Μετατροπή ημερομηνίας d,m,y σε Ιουλιανό αριθμό
//

long int date_2jdn( int d, int m, int y )
{
return ( 1461 * ( y + 4800 + ( m - 14 ) / 12 ) ) / 4 +
( 367 * ( m - 2 - 12 * ( ( m - 14 ) / 12 ) ) ) / 12 -
( 3 * ( ( y + 4900 + ( m - 14 ) / 12 ) / 100 ) ) / 4 +
d - 32075;

}


// ---------------------------------------------------------------------------------
// Μετατροπή Ιουλιανού αριθμού σε ημερομηνία d,m,y
//
void jdn_2date( int *d, int *m, int *y, long int jdn )
{
long int l = jdn + 68569;
long int n = ( 4 * l ) / 146097;
l = l - ( 146097 * n + 3 ) / 4;
long int i = ( 4000 * ( l + 1 ) ) / 1461001;
l = l - ( 1461 * i ) / 4 + 31;
long int j = ( 80 * l ) / 2447;
*d = l - ( 2447 * j ) / 80;
l = j / 11;
*m = j + 2 - ( 12 * l );
*y = 100 * ( n - 49 ) + i + l;

return;
}


// ---------------------------------------------------------------------------------

int main(void)
{
int d1, m1, y1, d2, m2, y2, days, months, years;
long int jdn1, jdn2;
int mdays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };


// διάβασε την 1η ημερομηνία
printf("Ποια είναι η σημερινή ημερομηνία (η μ χ): ");
scanf("%d %d %d", &d1, &m1, &y1);
jdn1 = date_2jdn( d1, m1, y1);


// διάβασε τη 2η ημερομηνία
do {
printf("Ποια ημερομηνία γεννηθήκατε (η μ χ); ");
scanf("%d %d %d", &d2, &m2, &y2);
jdn2 = date_2jdn( d2, m2, y2);
if (jdn2 > jdn1)
puts("\tπρέπει να είναι μικρότερη της τωρινής ημερομηνίας, δοκιμάστε ξανά");
} while (jdn2 > jdn1);


// υπολογισμός ηλικίας

days = (d1-d2);
months = (m1-m2);
years = (y1-y2);

if (months <0) {
months += 12;
years--;
}

if (days < 0) {
days += mdays[m2-1];
if ( m2 == 2 && isleap(y2) )
days++;
months--;
}


printf("\nΕίστε %d χρονών, %d μηνών και %d ημερών \n", years, months, days);

getchar();
printf("\npress ENTER to exit...");
fflush(stdin); getchar();

return 0;
}


κάποια παρατήρηση πρόταση;
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 23:40

Μια χαρά δείχνει :)

Έλεγχο να μη δέχεται άκυρες ημερομηνίες χρειάζεται (π.χ. 31 4 2011. 29 2 2010, 52 23 2000, κλπ)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 22 Ιουν 2011, 23:44

αυτό για τα δίσεκτα έτη δεν ξέρω να το κάνω...
θα προσθέσω κάποια πράγματα για τις άκυρες ημερομηνίες...


κάποιο άλλο project να ξεκινήσω έχεις να μου προτείνεις;
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι