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

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

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

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

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 16:52

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

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

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 16:53

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

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

Δημοσίευσηαπό Star_Light » 28 Μαρ 2012, 19:00

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

#include<stdio.h>
int main(void)
{
int num , count , in_count=0 , s_day; // s_day for starting day


printf(" Enter number of days in month: ");
scanf("%d" , &num);
printf(" Enter the starting day of the week (1=Sun , 7=Sat): ");
scanf("%d" , &s_day);

printf(" K Δ Τ Τ Π Π Σ \n");

for(count=1; count<=num; count++)
{
in_count++;

if( (s_day + in_count) > 8)
{
printf("\n");
in_count=1;
}

printf("%3d" , count);
}

return 0;
}


Άσκηση 8 σελ.123 την εχω καταφερει (με τον δικο μου περιεργο τροπο) αλλα ρε γ*****.... πως θα μετατοπισω το 1 να παει κατω απο την Τριτη το ρημαδι :/

καμια ιδεα κανεις ? Θα δω μετα την λυση του King για να δω τι έξτρα μεταβλητες εχω βαλει ενω δεν χρειαζοντουσαν.
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 28 Μαρ 2012, 19:04

Κατι με if και countinue μπορω να κανω σε συνδυασμο με s_day ωστε να μην εμφανίζει στην αρχή κατι και εκει να μηδενιζει και τον μετρητή ωστε οταν φτασει στην Τριτη να αρχισει να μετραει αν s_day = 3
Γνώσεις ⇛ 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

Δημοσίευσηαπό Ilias95 » 28 Μαρ 2012, 19:08

migf1 έγραψε:Ηλία δεν ορίζει MAXTOKENS tokens, αλλά άγνωστο πλήθος tokens μέγιστου μήκους MAXTOKENS χαρακτήρων... είναι σίγουρο (το διασταύρωσα μόλις, όχι με κώδικα, με θεωρία)... άρα όντως είναι λάθος το παράδειγμα στο site μου (νοηματικά τουλάχιστον).

Τότε για ποιον λόγο ο παρακάτω κώδικας:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>

#define MAXTOKENS 2

int s_tokenize(char *s, char *tokens[], const int ntoks, const char *delims)
{
int i = 1;

tokens[0] = strtok(s, delims);
for (i = 1; i < ntoks; i++) {
tokens[i] = strtok(NULL, " ,.-");
if (! tokens[i])
break;
}

return i;
}

int main( void )
{
char s[] = "lots of character to play with";
char *tokens[ MAXTOKENS ] = { NULL };
int ntokens = 0;
register int i = 0;

ntokens = s_tokenize( s, tokens, MAXTOKENS, " " );

if ( ntokens > 0 )
for (i=0; i < ntokens; i++)
puts( tokens[i] );

return 0;
}

Μου δίνει έξοδο:
Κώδικας: Επιλογή όλων
lots
of

Αν το μέγιστο μήκος των strings που περιέχονται στην array tokens ήταν MAXTOKENS (δηλ. 2) δεν θα μπορούσε να αποθηκευτέι το string "lots".

migf1 έγραψε:τι κάνει αν για delimiters του δώσεις π.χ. "abcd"

Μήπως αυτό έχει να κάνει με την strtok() αυτή καθεαυτήν; Ή την χρησιμοποιώ εγώ λάθος;

migf1 έγραψε:τι σου επιστρέφει αν δεν υπάρχει κανένας delimiter μέσα στο s

Πιο λογικό μου ακούγεται να εκχωρεί στο 1ο στοιχείο της λίστας των tokens το ίδιο το string. Ή να κάνω κάτι διαφορετικό;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 28 Μαρ 2012, 19:19

Star_Light έγραψε:.. πως θα μετατοπισω το 1 να παει κατω απο την Τριτη το ρημαδι

Προφανώς θα εκτυπώσεις κενούς χαρακτήρες.
Έτσι όπως το έχεις τώρα ότι starting day και να δώσει ο χρήστης ξεκινάει απ' την Κυριακή και μάλιστα δεν εκτυπώνει καθόλου μέρες κάτω από Παρασκευή και Σάββατο.

Hint1: Εκτύπωσε πρώτα την πρώτη εβδομάδα (έξω από loop) και μετά τις υπόλοιπες.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 28 Μαρ 2012, 19:24

Ilias95 έγραψε:
Star_Light έγραψε:.. πως θα μετατοπισω το 1 να παει κατω απο την Τριτη το ρημαδι

Προφανώς θα εκτυπώσεις κενούς χαρακτήρες.
Έτσι όπως το έχεις τώρα ότι starting day και να δώσει ο χρήστης ξεκινάει απ' την Κυριακή και μάλιστα δεν εκτυπώνει καθόλου μέρες κάτω από Παρασκευή και Σάββατο.

Hint1: Εκτύπωσε πρώτα την πρώτη εβδομάδα (έξω από loop) και μετά τις υπόλοιπες.


hehehe σωστος! Και εγω αυτο σκεφτηκα οτι πρεπει να εκτυπωνει κενους χαρακτηρες.
Ευχαριστω για το hint φαινεται καλο θα το δοκιμασω !!!! ;)
Γνώσεις ⇛ 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

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

Ilias95 έγραψε:
Τότε για ποιον λόγο ο παρακάτω κώδικας:

...
Μου δίνει έξοδο:
...
Αν το μέγιστο μήκος των strings που περιέχονται στην array tokens ήταν MAXTOKENS (δηλ. 2) δεν θα μπορούσε να αποθηκευτέι το string "lots".

Έχω φάει σκάλωμα με το *p[] και το (*p)[] τελευταίως... μην μου δίνεις πολύ σημασία, θα μου περάσει :lol: (σωστό πρέπει να είναι τελικά ;) )

έγραψε:Πιο λογικό μου ακούγεται να εκχωρεί στο 1ο στοιχείο της λίστας των tokens το ίδιο το string. Ή να κάνω κάτι διαφορετικό;

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

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

Δημοσίευσηαπό migf1 » 28 Μαρ 2012, 20:32

Star_Light έγραψε:
Ilias95 έγραψε:

Hint1: Εκτύπωσε πρώτα την πρώτη εβδομάδα (έξω από loop) και μετά τις υπόλοιπες.


hehehe σωστος! Και εγω αυτο σκεφτηκα οτι πρεπει να εκτυπωνει κενους χαρακτηρες.
Ευχαριστω για το hint φαινεται καλο θα το δοκιμασω !!!! ;)

Μπορούν να γίνουν όλα σε ένα μόνο loop...

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

#define MAXINPUT (255+1)

int main( void )
{
char input[ MAXINPUT ] = {'\0'};
int i, max, wd = 0, ndays = 0; /* wd: month's starting weekday (1=Sun, 7=Sat) */

do {
printf( "How many days in month (28-31)? " );
fgets( input, MAXINPUT, stdin);
ndays = atoi(input);
} while (ndays < 28 || ndays > 31);

do {
printf( "Weekday of month's 1st (1=Sun, 7=Sat)? " );
fgets( input, MAXINPUT, stdin);
wd = atoi(input);
} while (wd < 1 || wd > 7);

puts( "\nSun Mon Tue Wed Thu Fri Sat" );

--wd;
max = ndays + wd;
for (i=0; i < max; i++)
{
if ( 0 != i && i % 7 == 0 )
putchar('\n');
if ( i < wd )
printf(" ");
else
printf("%-4d", i - wd + 1);
}
putchar('\n');

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

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

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

migf1 έγραψε:
Για αυτό σου έγραψα το μεσημέρι πως δεν είναι τόσο απλό να την κάνεις γενικής χρήσης. Διότι πέρα από τον κώδικα, πρέπει να βρεις/διαλέξεις/αποφασίσεις τι και ποια ορίσματα θα της περνάς, πως θα τα διαχειρίζεσαι, πως θα αντινετωπίζεις ενδεχόμενα σφάλματα και τι θα επιστρέφεις από την συνάρτηση ;)

Πρόσθεσα και έλεγχο για το αν τα string είναι κενά:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>

#define MAXTOKENS 20

int s_tokenize(char *s, char *tokens[], const int ntoks, const char *delims)
{
int i;

if (! s[0] || ! delims[0])
return 0;

tokens[0] = strtok(s, delims);
for (i = 1; i < ntoks; i++) {
tokens[i] = strtok(NULL, delims);
if (! tokens[i])
break;
}
return i;
}

int main( void )
{
char s[] = "lots of character to play with";
char *tokens[MAXTOKENS] = {NULL};
int ntokens = 0;

ntokens = s_tokenize(s, tokens, MAXTOKENS, "abcd");

if (ntokens > 0)
for (int i=0; i < ntokens; i++)
puts(tokens[i]);

return 0;
}

Από εκεί και πέρα δεν ξέρω τι άλλο να ελέγξω, αλλά δεν ξέρω αν είναι και τόσο ουσιώδες να το κάνω για τώρα.
Α, πριν που έβγαζε περίεργα αποτελέσματα ήταν επειδή είχα αφήσει κατά λάθος μέσα στο loop το παρακάτω "tokens[i] = strtok(NULL, " ,.-");" το οποίο το διόρθωσα.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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