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

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

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

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

Δημοσίευσηαπό Star_Light » 11 Οκτ 2011, 16:16

migf1 έγραψε:
Thanks ρε συ, αλλά δεν έχω σκαλώσει επειδή δεν μπορώ να το κάνω. Έχω σκαλώσει επειδή είναι χρονοβόρο κι επειδή χρειάζονται πολλές δοκιμές μετά για να βεβαιωθώ πως λειτουργεί σωστά.


:lol: :lol:

ok! Παντως ειδα και το gui του , γ@μ@το ρε φιλε!

Δεν μπορεσα βεβαια να δω τον κωδικα γιατι θα πρεπει να γινω μελος πρωτα
στο insomnia και δεν εχω γινει ακομη .

Btw το φορουμ που ηθελα να σου συστησω ειναι το C board !!!
Γνώσεις ⇛ 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, 19:10

Ουφ, βρήκα και εγώ χρόνο να κάνω λίγο C καθημερινή!
Λοιπόν, έκανα κάμποσες διορθώσεις στον κώδικα αλλά πάλι έχουμε προβλήματα με το input....
http://ideone.com/Da2my
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό sokoban4ever » 12 Οκτ 2011, 01:22

@Star_Light
Για την προπροηγούμενη δήλωση ..(κάπου έκει)...
Για κάθε εμφωλεμένο loop έχεις και συν ένα στην δύναμη της "χρονική πολυπλοκότητα" του αλγόρυθμου σου
αν κάθε επανάληψη σε κάθε for είναι ισάρυθμη...
πχ το παρακάτω είναι της τάξης n^3
Κώδικας: Επιλογή όλων
for ... {α}
for ... {β}
for ...{γ}

Σημείωση:
Αν το α=β=γ τότε ο αλγόριθμος έχει πολυπλοκότητα n^3
σε άλλες περιπτώσεις πρέπει να υπολογίζεις τους χρόνους συνθέτωντας ένα πολυώνυμο των χρόνων των μεταβλητών...
στο τέλος εκείνο που χαρακτηρίζει τον βαθμό χρονικής πολυπλοκότητας του αλγορίθμου είναι
είναι η μέγιστη τάξη (δύναμη) του πολυώνυμου που θα "βγάλεις" αναλύοντας βήμα βήμα τον αλγόριθμο ( απο τον κώδικα)

Μια ωραία εξήγηση έχει εδώ στο stackoverflow
http://stackoverflow.com/questions/3255 ... 66#4852666

Φιλικά :)
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 12 Οκτ 2011, 01:44

@sokoban4ever

Ευχαριστωωω!!!!

Οταν λες ομως α=β=γ ποια εννοεις??? Τα n μεσα στα 3 loops?
Πχ τα i,j,z να ειναι μικρότερα ή ισα με το ιδιο n ?

ΕDIT: Κατάλαβα ουσιαστικά εννοεις για ιδιο αριθμο επαναλήψεων σε κάθε λούπα! Οποτε αν έχω 3 loops 1 εξωτερικο και 2 εσωτερικα τοτε

n^2+1 = n^3 => O(n^3)

Η Ο(nlogn) βγαινει απο δυαδικό δέντρο οποτε πρεπει να διαβασω συγκεκριμένα πράγματα!
Γνώσεις ⇛ 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 » 12 Οκτ 2011, 01:58

sokoban4ever έγραψε:@Star_Light
Για την προπροηγούμενη δήλωση ..(κάπου έκει)...
Για κάθε εμφωλεμένο loop έχεις και συν ένα στην δύναμη της "χρονική πολυπλοκότητα" του αλγόρυθμου σου
αν κάθε επανάληψη σε κάθε for είναι ισάρυθμη...
πχ το παρακάτω είναι της τάξης n^3
Κώδικας: Επιλογή όλων
for ... {α}
for ... {β}
for ...{γ}

Σημείωση:
Αν το α=β=γ τότε ο αλγόριθμος έχει πολυπλοκότητα n^3
σε άλλες περιπτώσεις πρέπει να υπολογίζεις τους χρόνους συνθέτωντας ένα πολυώνυμο των χρόνων των μεταβλητών...
στο τέλος εκείνο που χαρακτηρίζει τον βαθμό χρονικής πολυπλοκότητας του αλγορίθμου είναι
είναι η μέγιστη τάξη (δύναμη) του πολυώνυμου που θα "βγάλεις" αναλύοντας βήμα βήμα τον αλγόριθμο ( απο τον κώδικα)

Μια ωραία εξήγηση έχει εδώ στο stackoverflow
http://stackoverflow.com/questions/3255 ... 66#4852666

Φιλικά :)


Αν έχεις κάποιο χειρόγραφο πανεπιστημιακό παράδειγμα θα με ενδιέφερε να βγάλουμε μια πολυπλοκότητα
που δεν έχει ίσα τα α=β=γ που λες εξαρχής. Ειπαμε τα α=β=γ καθε ενα απο αυτα ειναι το πλήθος των επαναλήψεων της
κάθε λούπας έτσι? :)
Γνώσεις ⇛ 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 » 12 Οκτ 2011, 03:22

Λοιπον μετα απο σκέψη και μερικα ωραια πραγματακια που βρηκα και καταλαβα και απο την Wiki είπα να μεταφερθούν οι συζητήσεις μας περι πολυπλοκότητας εδω => https://forum.ubuntu-gr.org/viewtopic.php?f=61&t=20487

αυριο θα φτιαξω τον μινι οδηγο που έχω εκει... γιατι προς στιγμην κουτουλαω και ειμαι πολυ κουρασμενος!

Τα λεμε αυριο... @Sokoban4ever μετεφερε τα εκει ας πουμε αυτα περι πολυπλοκοτητας , πιστευω ειναι απαραιτητο ενα ξεχωριστο θρεντ

για αυτην μιας και ο τομεας αυτος αποτελει σιγουρα ξεχωριστη συζητηση!

Νυχταάάάάάάά
Γνώσεις ⇛ 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 » 12 Οκτ 2011, 10:48

Star_Light έγραψε:
migf1 έγραψε:
Thanks ρε συ, αλλά δεν έχω σκαλώσει επειδή δεν μπορώ να το κάνω. Έχω σκαλώσει επειδή είναι χρονοβόρο κι επειδή χρειάζονται πολλές δοκιμές μετά για να βεβαιωθώ πως λειτουργεί σωστά.


:lol: :lol:

ok! Παντως ειδα και το gui του , γ@μ@το ρε φιλε!

Δεν μπορεσα βεβαια να δω τον κωδικα γιατι θα πρεπει να γινω μελος πρωτα
στο insomnia και δεν εχω γινει ακομη .

Btw το φορουμ που ηθελα να σου συστησω ειναι το C board !!!

Thanks, αν κι αυτά είναι απλά δείγματα textures, που δεν ξέρω κιόλας αν κάνουν (μάλλον είναι πολύ μεγάλα). Το GUI θα το φτιάξει εκείνο το παλικάρι, κι ανάλογα πως θα επιλέξει να υλοποιήσει το πλέγμα θα χρειαστεί να φτιαχτούν αντίστοιχα textures.

Thanks και για το φόρουμ (αν και το γνωρίζω ήδη, μαζί με αρκετά ακόμα :) )

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

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

Δημοσίευσηαπό stamatiou » 17 Οκτ 2011, 21:06

stamatiou έγραψε:Ουφ, βρήκα και εγώ χρόνο να κάνω λίγο C καθημερινή!
Λοιπόν, έκανα κάμποσες διορθώσεις στον κώδικα αλλά πάλι έχουμε προβλήματα με το input....
http://ideone.com/Da2my

Καμιά ιδέα;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 18 Οκτ 2011, 19:37

Off topic:
Αυτό το καιρό διαβάζω ένα βιβλίο, το "Hacking - The art of exploitation". Πολύ ωραίο και εξηγεί κάμποσα πράγματα τα οποία δεν πολύ είχα για C (μιλάμε για περίπου 100 σελίδες προγραμματισμό σε C! :D). Κάπου έχει και ένα απλό πρόγραμμα σημειώσεων το οποίο δουλεύει με user id έτσι ώστε κάθε χρήστης να έχει τα δικά του. Αλλά δεν καταλαβαίνω τον αλγόριθμο που ψάχνει να βρει το επόμενο note του user. Επίσης αυτό που κάνει ουσιαστικά είναι να φτιάχνει ένα αρχείο ξεχωριστά για κάθε user;
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "hacking.h"

#define FILENAME "/var/notes"

int print_notes(int, int, char *); // note printing function
int find_user_note(int, int); // seek in file for a note for user
int search_note(char *, char *); // search for keyword function
void fatal(char *); // fatal error handler

int main(int argc, char *argv[]) {
int userid, printing=1, fd; // file descriptor
char searchstring[100];

if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]); // that is the search string
else // otherwise
searchstring[0] = 0; // search string is empty

userid = getuid();
fd = open(FILENAME, O_RDONLY); // open the file for read-only access
if(fd == -1)
fatal("in main() while opening file for reading");

while(printing)
printing = print_notes(fd, userid, searchstring);
printf("-------[ end of note data ]-------\n");
close(fd);
}

// A function to print the notes for a given uid that match
// an optional search string
// returns 0 at end of file, 1 if there are still more notes
int print_notes(int fd, int uid, char *searchstring) {
int note_length;
char byte=0, note_buffer[100];

note_length = find_user_note(fd, uid);
if(note_length == -1) // if end of file reached
return 0; // return 0

read(fd, note_buffer, note_length); // read note data
note_buffer[note_length] = 0; // terminate the string

if(search_note(note_buffer, searchstring)) // if searchstring found
printf(note_buffer); // print the note
return 1;
}

// A function to find the next note for a given userID
// returns -1 if the end of the file is reached
// otherwise it returns the length of the found note
int find_user_note(int fd, int user_uid) {
int note_uid=-1;
unsigned char byte;
int length;

while(note_uid != user_uid) { // loop until a note for user_uid is found
if(read(fd, &note_uid, 4) != 4) // read the uid data
return -1; // if 4 bytes aren't read, return end of file code
if(read(fd, &byte, 1) != 1) // read the newline separator
return -1;

byte = length = 0;
while(byte != '\n') { // figure out how many bytes to the end of line
if(read(fd, &byte, 1) != 1) // read a single byte
return -1; // if byte isn't read, return end of file code
length++;
}
}
lseek(fd, length * -1, SEEK_CUR); // rewind file reading by length bytes

printf("[DEBUG] found a %d byte note for user id %d\n", length, note_uid);
return length;
}

// A function to search a note for a given keyword
// returns 1 if a match is found, 0 if there is no match
int search_note(char *note, char *keyword) {
int i, keyword_length, match=0;

keyword_length = strlen(keyword);
if(keyword_length == 0) // if there is no search string
return 1; // always "match"

for(i=0; i < strlen(note); i++) { // iterate over bytes in note
if(note[i] == keyword[match]) // if byte matches keyword
match++; // get ready to check the next byte
else { // otherwise
if(note[i] == keyword[0]) // if that byte matches first keyword byte
match = 1; // start the match count at 1
else
match = 0; // otherwise it is zero
}
if(match == keyword_length) // if there is a full match
return 1; // return matched
}
return 0; // return not matched
}

stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 22 Οκτ 2011, 08:39

stamatiou έγραψε:Off topic:
Αυτό το καιρό διαβάζω ένα βιβλίο, το "Hacking - The art of exploitation". Πολύ ωραίο και εξηγεί κάμποσα πράγματα τα οποία δεν πολύ είχα για C (μιλάμε για περίπου 100 σελίδες προγραμματισμό σε C! :D). Κάπου έχει και ένα απλό πρόγραμμα σημειώσεων το οποίο δουλεύει με user id έτσι ώστε κάθε χρήστης να έχει τα δικά του. Αλλά δεν καταλαβαίνω τον αλγόριθμο που ψάχνει να βρει το επόμενο note του user. Επίσης αυτό που κάνει ουσιαστικά είναι να φτιάχνει ένα αρχείο ξεχωριστά για κάθε user;
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "hacking.h"

#define FILENAME "/var/notes"

int print_notes(int, int, char *); // note printing function
int find_user_note(int, int); // seek in file for a note for user
int search_note(char *, char *); // search for keyword function
void fatal(char *); // fatal error handler

int main(int argc, char *argv[]) {
int userid, printing=1, fd; // file descriptor
char searchstring[100];

if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]); // that is the search string
else // otherwise
searchstring[0] = 0; // search string is empty

userid = getuid();
fd = open(FILENAME, O_RDONLY); // open the file for read-only access
if(fd == -1)
fatal("in main() while opening file for reading");

while(printing)
printing = print_notes(fd, userid, searchstring);
printf("-------[ end of note data ]-------\n");
close(fd);
}

// A function to print the notes for a given uid that match
// an optional search string
// returns 0 at end of file, 1 if there are still more notes
int print_notes(int fd, int uid, char *searchstring) {
int note_length;
char byte=0, note_buffer[100];

note_length = find_user_note(fd, uid);
if(note_length == -1) // if end of file reached
return 0; // return 0

read(fd, note_buffer, note_length); // read note data
note_buffer[note_length] = 0; // terminate the string

if(search_note(note_buffer, searchstring)) // if searchstring found
printf(note_buffer); // print the note
return 1;
}

// A function to find the next note for a given userID
// returns -1 if the end of the file is reached
// otherwise it returns the length of the found note
int find_user_note(int fd, int user_uid) {
int note_uid=-1;
unsigned char byte;
int length;

while(note_uid != user_uid) { // loop until a note for user_uid is found
if(read(fd, &note_uid, 4) != 4) // read the uid data
return -1; // if 4 bytes aren't read, return end of file code
if(read(fd, &byte, 1) != 1) // read the newline separator
return -1;

byte = length = 0;
while(byte != '\n') { // figure out how many bytes to the end of line
if(read(fd, &byte, 1) != 1) // read a single byte
return -1; // if byte isn't read, return end of file code
length++;
}
}
lseek(fd, length * -1, SEEK_CUR); // rewind file reading by length bytes

printf("[DEBUG] found a %d byte note for user id %d\n", length, note_uid);
return length;
}

// A function to search a note for a given keyword
// returns 1 if a match is found, 0 if there is no match
int search_note(char *note, char *keyword) {
int i, keyword_length, match=0;

keyword_length = strlen(keyword);
if(keyword_length == 0) // if there is no search string
return 1; // always "match"

for(i=0; i < strlen(note); i++) { // iterate over bytes in note
if(note[i] == keyword[match]) // if byte matches keyword
match++; // get ready to check the next byte
else { // otherwise
if(note[i] == keyword[0]) // if that byte matches first keyword byte
match = 1; // start the match count at 1
else
match = 0; // otherwise it is zero
}
if(match == keyword_length) // if there is a full match
return 1; // return matched
}
return 0; // return not matched
}


Τι έγινε βρε παιδιά; Γιατί τόση σιωπή; :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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