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

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

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

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 14:15

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

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

Δημοσίευσηαπό Ilias95 » 03 Μαρ 2012, 14:20

Καλημέρα.

Το 6ο programming project σελ.179 ζητάει να πάρουμε ένα string απ' τον χρήστη και να αποθηκεύσουμε σε μία array τον κάθε χαρακτήρα που θα περιέχεται στο string.
Το πρόβλημα είναι ότι δεν μπορούμε να ξέρουμε από πριν το μέγεθος της array γιατί δεν ξέρουμε το μέγεθος του string που θα δώσει ο χρήστης.
Έχουμε δει πως μπορούμε να χρησιμοποιήσουμε variable-length arrays. Μπορούμε να κάνουμε έναν loop και να πάρουμε το μέγεθος του string.
Όμως θα έχουμε διαβάσει όλη την είσοδο και δεν θα μπορούμε να πάρουμε μετά έναν έναν τους χαρακτήρες για να τους βάλουμε στην λίστα.

Είσοδο έχουμε μάθει προς το παρών να παίρνουμε μόνο με scanf() και gechar().

Πως θα μπορούσε να γίνει το παραπάνω;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 03 Μαρ 2012, 14:29

migf1 έγραψε:Ηλία πως τα βλέπεις τα πράγματα με τη C; Ζόρικα ή OK; (αν και είναι αρχή ακόμα)

Δεν μπορώ να πω πως ζορίζομαι προς το παρών. Βέβαια όπως είπες κάποια πράγματα μου φαίνονται περίεργα και είναι λογικό.
Όμως μπορώ να πω πως απολαμβάνω να μαθαίνω τι συμβαίνει "από κάτω" όπως επίσης και πράγματα που μια interpreted γλώσσα μου κρύβει. :)
(Βέβαια απ' τη στιγμή που κάποιος απλά θέλει να πάρει αποτέλεσμα πολύ καλά κάνει και του τα κρύβει :P )
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 14:39

Ilias95 έγραψε:
...
(Βέβαια απ' τη στιγμή που κάποιος απλά θέλει να πάρει αποτέλεσμα πολύ καλά κάνει και του τα κρύβει :P )

Εννοείται! Όταν η ταχύτητα παραγωγής είναι σημαντικότερη από τις επιδόσεις, η C δεν είναι σε καμία περίπτωση ανάμεσα στις πρώτες επιλογές (με εξαίρεση τις περιπτώσεις όπου οι προγραμματιστές είναι ήδη εξοικειωμένοι με εξωτερικές βιβλιοθήκες της C που ταιριάζουν με τις ανάγκες του πρότζεκτ, οπότε η χρησιμοποίησή τους ανεβάζει κατακόρυφα και την ταχύτητα παραγωγής).

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

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 14:44

Μια που ανέφερα βιβλιοθήκες, έχεις δει μια μικρή βιβλιοθήκη που είχα φτιάξει ειδικά για ανάγνωση της κύριας εισόδου; prompt_for την έχω ονομάσει: http://forum.ubuntu-gr.org/viewtopic.ph ... or#p228976.

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

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

Δημοσίευσηαπό Ilias95 » 03 Μαρ 2012, 14:50

Ναι την έχω ήδη υπόψιν.
Προς το παρών όμως θέλω να δω τα standard που μου προσφέρει η γλώσσα.
Αργότερα και αφού θα έχω καταλάβει γιατί δεν "πρέπει" να χρησιμοποιούνται συναρτήσεις όπως η scanf() θα ψάξω για τις εναλλακτικές λύσεις.
(Προς το παρών χρησιμοποιώ την yourSCANF() :P )
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 14:56

Ok, αρκεί να έχεις υπόψη σου πως η mySCANF() αυτή είναι περισσότερο για να αντιμετωπίζει αυτόματα προβλήματα με το line-buffering, δεν αποτελεί πιστή αντικατάσταση της κανονικής scanf (όπως διαπίστωσες και μόνος σου με το loop ;) ).

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

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 15:03

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

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

Δημοσίευσηαπό Ilias95 » 03 Μαρ 2012, 15:17

migf1 έγραψε:Παρεμπιπτόντως, ωραία η άσκηση 6 :)

Να μια λύση:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <ctype.h>

int main(void)
{
int i = 0, x;
char characters[251+1], ch;

printf("Enter message: ");
while ((ch = getchar()) != '\n')
characters[i++] = ch;

printf("In B1FF-speak: ");
for (x = 0; x < i; x++) {
ch = toupper(characters[x]);
switch (ch) {
case 'A': putchar('4'); break;
case 'B': putchar('8'); break;
case 'E': putchar('3'); break;
case 'I': putchar('1'); break;
case 'O': putchar('0'); break;
case 'S': putchar('5'); break;
default: putchar(ch); break;
}
}
printf("!!!!!!!!!!");

return 0;
}


migf1 έγραψε:Τώρα που το ξανασκέφτομαι, αν θέλεις να χρησιμοποιήσει VLA, μπορείς να ρωτάς τον χρήστη ποιο είναι το μέγιστο μέγεθος για το string ;)

Δεν νομίζω ότι είναι τόσο βολικό και πρακτικό. Θα πρέπει να γίνεται και έλεγχος μήπως έδωσε μέγεθος μεγαλύτερο αυτού που δήλωσε.

Τα αρνητικά του να δηλώσουμε κατευθείαν ένα μεγάλο μέγεθος (251+1 πχ) ποια είναι; Θα "σπαταληθεί" περισσότερη μνήμη;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 15:50

Ilias95 έγραψε:
migf1 έγραψε:Παρεμπιπτόντως, ωραία η άσκηση 6 :)

Να μια λύση:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <ctype.h>

int main(void)
{
int i = 0, x;
char characters[251+1], ch;

printf("Enter message: ");
while ((ch = getchar()) != '\n')
characters[i++] = ch;

printf("In B1FF-speak: ");
for (x = 0; x < i; x++) {
ch = toupper(characters[x]);
switch (ch) {
case 'A': putchar('4'); break;
case 'B': putchar('8'); break;
case 'E': putchar('3'); break;
case 'I': putchar('1'); break;
case 'O': putchar('0'); break;
case 'S': putchar('5'); break;
default: putchar(ch); break;
}
}
printf("!!!!!!!!!!");

return 0;
}


Ωραίος! Να και μια πιο συνεπτυγμένη εκδοχή του ίδιου κώδικα...
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <ctype.h>

#define MAXINPUT (255+1)

int main(void)
{
int i = 0;
char msg[MAXINPUT] = {'\0'};

for (i=0; '\n' != (msg[i] = toupper(getchar())); i++ )
switch (msg[i]) {
case 'A': putchar('4'); break;
case 'B': putchar('8'); break;
case 'E': putchar('3'); break;
case 'I': putchar('1'); break;
case 'O': putchar('0'); break;
case 'S': putchar('5'); break;
default: putchar(msg[i]); break;
}
puts("!!!!!!!!!!");
return 0;
}

Βέβαια δεν ξέρω αν εννοεί αυτό ακριβώς η άσκηση (ίσως π.χ. να εννοεί να μπουν τα θαυμαστικά μέσα στον πίνακα, δεν το ξεκαθαρίζει).

έγραψε:
migf1 έγραψε:Τώρα που το ξανασκέφτομαι, αν θέλεις να χρησιμοποιήσει VLA, μπορείς να ρωτάς τον χρήστη ποιο είναι το μέγιστο μέγεθος για το string ;)

Δεν νομίζω ότι είναι τόσο βολικό και πρακτικό. Θα πρέπει να γίνεται και έλεγχος μήπως έδωσε μέγεθος μεγαλύτερο αυτού που δήλωσε.

Yeap :) Σε πραγματικό πρόγραμμα θα χρειαζόταν αυτός ο έλεγχος έτσι κι αλλιώς (με τη συγκεκριμένη υλοποίηση, γιατί με δυναμική μνήμη απλώς θα δεσμεύσαμε συνεχώς όση νέα μνήμη χρειαζόμασταν όσο μας πληκτρολογούσε ;) )

έγραψε:Τα αρνητικά του να δηλώσουμε κατευθείαν ένα μεγάλο μέγεθος (251+1 πχ) ποια είναι; Θα "σπαταληθεί" περισσότερη μνήμη;

Ναι! Βέβαια στην προκειμένη περίπτωση μιλάμε για 252 bytes (στις περισσότερες πλατφόρμες το sizeof(char) είναι 1 byte). Επίσης, οι φλοιοί έχουν μέγιστο πλήθος χαρακτήρων που σε αφήνουν να πληκτρολογήσεις στη γραμμή εντολών (στα Windows είναι 256, στον bash δεν ξέρω)... δεν θυμάμαι μήπως υπάρχει κάποιο predefined #define στα στάνταρ header files που να το έχει (πρέπει να υπάρχει σε κάνα stdio.h, αλλά δεν θυμάμαι... για filenames υπάρχει ένα, FILENAME_MAX ή κάπως έτσι).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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