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

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

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

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

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 15:09

migf1 επειδη ειχα καποια κενα στις δομες.... αραξα για λιγη εξασκηση....

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

#include <stdio.h>
#define N 254 + 1
typedef struct person
{
int age;
char name[N];
char surname[N];
}kostas ;


int main(void)
{

kostas someone ;


printf("Dwse to onoma sou: ");
fgets(someone.name,254,stdin);

printf("Dwse to epwnumo sou: ");
fgets(someone.surname,254,stdin);

printf("\nDwse tin ilikia sou ");
scanf("%d",&someone.age);

printf("\n%s",someone.name);
printf("\n%d",someone.age);
printf("\n%s",someone.surname);


return 0;
}


το προβλημα ειναι οτι δεν μου εκτυπωνει καθολου το name ... γιατι?

EDIT : Λογω κεκτημενης ταχυτητας εκανα λαθος στο 2ο fgets ηθελε someone.surname αντι του someone.name που διορθωσα τωρα.

ΕΠισης ξεκαθαρισα κατι σημαντικο νομιζω στις δομες... που αν δεν το ξεκαθαρισει καποιος δεν μπορει να παει παρακατω... την διαφορα
δομης & μεταβλητης δομης
ας πουμε

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


CASE 1:
struct person {
.................
} kostas;

// Εδω το kostas ειναι μεταβλητη δομης.

CASE 2:

typedef struct person {
................
} kostas;

// εδω το kostas ειναι μια ολοκληρη δομη και βαζοντας το διπλα απο ενα τυχαιο ονομα (στην αρχη ενος τυχαιου ονοματος σαν επικεφαλιδα) ουσιαστικα το 2ο (αυτο που επεται) θα ειναι η μεταβλητη αυτη τη φορα.

Πχ

kostas nikos; //Τωρα το nikos (αυτο που έπεται) ειναι μεταβλητη δομης kostas (επικεφαλιδα , το τυχαιο ονομα που λεω πιο πανω δεν ειναι αυτο αλλα το nikos)

Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 11 Σεπ 2011, 15:36

Η Bool table_fill_randomly( Table *table, const int maxval ) θα πρέπει να γεμίζει όλο τον πίνακα ή από το πρώτο κενό;
Επίσης γίνεται να δημιοργούμε τους τυχαίους αριθμούς μέσα στη συνάρτηση; Αν ναι πώς;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 17:28

Παιδια... δεν ξερω αν προχωρησετε εσεις... αλλα εγω εβαλα "αλλο προγραμμα" πρωτα καταλαβα τις δομες καλα με προσπελαση μεσω τελεστη τελειας... + typedef μετα θα κανω τα ιδια αλλα με τελεστες -> (δεικτες) και τελος θα παιξω με συναρτησεις και δομες και μετα και με δεικτες σε απλα παραδειγματα και αφου καταλαβω αυτα μετα θα παω στο παραδειγμα του migf1 , δυστυχως ή ευτυχως ;)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 17:29

Καλησπέρα (έριξα έναν υπνάκο :) )

@Star_Light: Ωραίος, είναι όντως σημαντικός ο διαχωρισμός που επισημαίνεις! Προσωπικά σπάνια (έως ποτέ) χρησιμοποιώ σκέτα struct δίχως να τα έχω κάνει typedef πρώτα (οπότε ότι ακολουθεί το άγκιστρο κλεισίματος είναι πάντα πρόσθετος τύπος δεδομένων).

@Stamatiou: Πολύ καλή ερώτηση! Έλεγα να γεμίζει όλον τον πίνακα, αλλά μετά την ερώτησή σου μου φαίνεται καλύτερη ιδέα να γεμίζει μονάχα όσα στοιχεία είναι κενά :) Οπότε ας το κάνουμε έτσι. Όσο για τα τυχαία νούμερα, εννοείται πως θα δημιουργούνται μέσα στη συνάρτηση, με χρήση της: rand()
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 18:30

Star_Light έγραψε:Παιδια... δεν ξερω αν προχωρησετε εσεις... αλλα εγω εβαλα "αλλο προγραμμα" πρωτα καταλαβα τις δομες καλα με προσπελαση μεσω τελεστη τελειας... + typedef μετα θα κανω τα ιδια αλλα με τελεστες -> (δεικτες) και τελος θα παιξω με συναρτησεις και δομες και μετα και με δεικτες σε απλα παραδειγματα και αφου καταλαβω αυτα μετα θα παω στο παραδειγμα του migf1 , δυστυχως ή ευτυχως ;)

Κάτι τέτοιο σε βοηθάει καθόλου;
Κώδικας: Επιλογή όλων

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

#define MAXINBUF 254+1

#define MAXLEN_NAME 10+1
#define MAXLEN_LNAME 15+1
#define MAXLEN_TEL 10+1

typedef struct person {
char fname[ MAXLEN_NAME ];
char lname[ MAXLEN_LNAME ];
char tel[ MAXLEN_TEL ];
} Person;

// ------------------------------------------------------------------------------------
char *s_getflushed(char *s, size_t len)
{
char *cp;
for (cp=s; (*cp=getc(stdin)) != '\n' && (cp-s) < len-1; cp++ )
;

if ( *cp != '\n') { // len reached withoutn '\n'
*cp = '\0'; // null terminate s and
while (getchar() != '\n') // flush remaining chars
;
}
else // '\n' found
*cp = '\0'; // null-terminate

return s;
}
// ------------------------------------------------------------------------------------
void read_data( Person *persons, const int maxpersons )
{
register int i = 0;

for (i=0; i < maxpersons; i++ )
{
printf("Εγγραφή #%d\n----------\n", i+1);

printf("Όνομα : ");
s_getflushed( persons[ i ].fname, MAXLEN_NAME );

printf("Επώνυμο: ");
s_getflushed( persons[ i ].lname, MAXLEN_LNAME );

printf("Τηλ : ");
s_getflushed( persons[ i ].tel, MAXLEN_TEL );

putchar('\n');
}

return;
}

// ------------------------------------------------------------------------------------
void print_data( Person *persons, const int maxpersons )
{
register int i = 0;

puts("Ε Μ Φ Α Ν Ι Σ Η Λ Ι Σ Τ Α Σ Ε Γ Γ Ρ Α Φ Ω Ν\n");
puts("Θέση\tΌνομα\t\tΕπώνυμο\t\t\tΤηλέφωνο\n-----\t-----\t\t-------\t\t\t--------");

for (i=0; i < maxpersons; i++ )
printf("%02d\t%-15s\t%-20s\t%-15s\n", i+1, persons[i].fname, persons[i].lname, persons[i].tel );

putchar('\n');


return;
}
// ------------------------------------------------------------------------------------
int main( void )
{
char inbuf[ MAXINBUF ] = {'\0'};
int maxpersons = 0;
Person *persons = NULL;

printf("Πόσες εγγραφές; ");
s_getflushed( inbuf, MAXINBUF );
maxpersons = atoi( inbuf );

putchar('\n');

persons = calloc( maxpersons, sizeof( Person ) );
if ( !persons ) {
puts("*** ανεπρακής μνήμη, τερματισμός προγράμματος");
exit( EXIT_FAILURE );
}

read_data( persons, maxpersons );
print_data( persons, maxpersons );

if ( persons ) {
free( persons );
persons = NULL;
}

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

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

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 18:37

δεν εχω μπει ακομη στις συναρτησεις μαζι με δεικτες και δομες... τωρα τελειωνω και τους δεικτες με τις δομες ;)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 18:43

Κώδικας: Επιλογή όλων
#include <stdio.h>
#define N 254 + 1
typedef struct person
{
int age;
char name[N];
char surname[N];
} kostas ;


int main(void)
{

kostas someone;
kostas *p;

p=&someone;


printf("Dwse to onoma sou: ");
fgets((*p).name,254,stdin);

printf("Dwse to epwnumo sou: ");
fgets((*p).surname,254,stdin);

printf("Dwse tin ilikia sou: ");
scanf("%d",&someone.age);

printf("========================================");

printf("\nTo onoma pou edwses einai: %s",(*p).name);
printf("H ilikia pou edwses einai: %d",(*p).age);
printf("\nTo epwnimo pou edwses einai: %s",(*p).surname);

return 0;
}


εδω ειμαι τωρα :D

Να ρωτησω κατι... δεν μπορεις να αρχικοποιησεις απευθειας μια κυρια δομη ε???? πχ

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


struct person {
int a;
int b;
};

main()
{
person.a=...
person.b=....

}
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 20:05

Star_Light έγραψε:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#define N 254 + 1
typedef struct person
{
int age;
char name[N];
char surname[N];
} kostas ;


int main(void)
{

kostas someone;
kostas *p;

p=&someone;


printf("Dwse to onoma sou: ");
fgets((*p).name,254,stdin);

printf("Dwse to epwnumo sou: ");
fgets((*p).surname,254,stdin);

printf("Dwse tin ilikia sou: ");
scanf("%d",&someone.age);

printf("========================================");

printf("\nTo onoma pou edwses einai: %s",(*p).name);
printf("H ilikia pou edwses einai: %d",(*p).age);
printf("\nTo epwnimo pou edwses einai: %s",(*p).surname);

return 0;
}


εδω ειμαι τωρα :D

Το p είναι περιττό, στον κώδικα αυτόν. Μπορείς να δουλέψεις απευθείας με το someone. Αλλά ακόμα κι αν το έχεις κάνει απλά για δοκιμή, το (*p).name είναι καλύτερα να το γράφεις: p->name (εφόσον το p είναι δείκτης).

έγραψε:
Να ρωτησω κατι... δεν μπορεις να αρχικοποιησεις απευθειας μια κυρια δομη ε???? πχ

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


struct person {
int a;
int b;
};

main()
{
person.a=...
person.b=....

}

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

int main( void )
{
person a = {.a=0, .b=0 }; // ή σκέτο: person a = { 0, 0 };
}

Πριν την C99 δεν μπορούσαμε (ούτε στον διευθυνσιογράφο το χρησιμοποιούμε, για να έχει συμβατό κώδικα σε όλους τους compilers).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 11 Σεπ 2011, 21:12

Λοιπόν, νομίζω είναι σωστή:

Spoiler: show
Κώδικας: Επιλογή όλων
Bool table_fill_randomly( Table *table, const int maxval ) {
int i;
if(!table || !table->buffer) {
printf("ΠΑΡΟΥΣΙΑΣΤΗΚΕ ΣΦΑΛΜΑ!");
return 1;
}else if(table->buflen == table->bufmaxlen) {
printf("Ο ΠΙΝΑΚΑΣ ΕΙΝΑΙ ΓΕΜΑΤΟΣ!");
return 2;
}

for(i = table->buflen;i < table->bufmaxlen;i++) {
table->buffer[i] = rand() % maxval+1;
}
return 0;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 21:22

Ναι σιγουρα ειναι περιττο μιας και μπορω να δουλεψω απευθειας με τον τελεστη (.) απλα το εβαλα για λοφους δοκιμης.

ΟΚ δηλαδη το οτι θες μεταβλητη για να αρχικοποιησεις μια δομη ειναι τελικα θεμα μεταγλωττιστη και οχι λογικης ή κανονων της γλωσσας ε? ;)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

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