migf1 έγραψε:Αφού γράφω ξεκάθαρα: Microsoft, Google, κλπ (προφανώς για πληροφορικάριους)
Star_Light έγραψε:Οταν λεει πχ οτι για καθε προγραμμα ορίζονται 3 μέρη μεσα στην μνημη εκ των οποιων το ενα ειναι το DATA SECTION το αλλο το CODE SECTION και το αλλο το STACK SECTION εννοει ουσιαστικα οτι το DATA SECTION καταρχην αν εχω φτιαξει εγω ενα προγραμμα το οποιο ζηταει εισοδο απο το πληκτρολογιο απο τον χρηστη ουσιαστικα η εισοδος θα ειναι αυτα τα DATA? Το code section οκ θα ειναι πες οι εντολες του... ενω το STACK SECTION θα ειναι οι διευθυνσεις των επομενων εντολων στην μνημη ??? τα σκεφτομαι καλα?
έγραψε:
Π.Σ Παντως τωρα καταλαβαινω την σπουδαιοτητα των λιστων.... στον σκληρο δισκο που διαβαζα χθες και στους κομβους ευρετηριου i-nodes ολα αυτα υλοποιουνται ας πουμε με συνδεδεμενες λιστες.... η δομη της λιστας πχ ειναι τα χαρακτηριστικα ενος αρχειου... και ο δεικτης σε επομενο δειχνει στο επομενο μπλοκ που ειναι το ονομα του επομενου αρχειου κτλπ. Ειλικρινα αν εχεις καταλαβει λιστες και στοιβες εχεις κανει μεγαλα βηματα.
migf1 έγραψε:
[snip]
Βασικά έχω κάνει 2 υλοποιήσεις, μια στην οποία η αντιστροφή γίνεται απευθείας στην main() και οι λέξεις τυπώνονται απευθείας στην οθόνη, και μια όπου η αντιστροφή γίνεται μέσα σε συνάρτηση που δέχεται ως όρισμα την αρχική πρόταση και την επιστρέφει με αντεστραμμένες τις λέξεις της.
Παραθέτω (σε spoiler) την πρώτη υλοποίηση που είναι πιο εύκολη κι όταν μου δώσετε το οκ θα παραθέσω και την υλοποίηση με τη συνάρτηση.
Και οι 2 υλοποιήσεις είναι ανεξάρτητες από το πλήθος των λέξεων στην αρχική πρόταση και χρησιμοποιούν τον ίδιον αλγόριθμο για την αντιστροφή.Spoiler: show
/* ------------------------------------------------------------
* Από: migf1 Έκδοση με Συνάρτηση
*
* Αντιστροφή λέξεων μιας πρότασης. Π.χ. το "γειά σου κόσμε"
* γίνεται "κόσμε σου γεια"
*
* Αλγόριθμος:
* πρώτα αντιστρέφεται η αρχική πρόταση και κατόπιν διασπάται
* στις λέξεις της, οι οποίες αντιστρέφονται εκ νέου πριν
* τυπωθούν μια προς μια στην οθόνη.
* ------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ------------------------------------------------------------------------------------
// Αντιγράφει έως n-1 χαρακτήρες του string src στο string dst, το οποίο κι επιστρέφει
// προσθέτοντας τον μηδενικό χαρακτήρα στο τέλος.
// ΣΗΜΑΝΤΙΚΟ: τα dst και src πρέπει να είναι ήδη δημιουργημένα και να έχουν χώρο για
// τουλάχιστον n χαρακτήρες (συμπεριλαμβανομένου του μηδενικού στο τέλος)
//
char *s_ncopy( char *dst, const char *src, int n )
{
char *save = dst;
while ( (dst-save) < n-1 && (*dst=*src) != '\0' )
dst++, src++;
if ( *dst )
*dst = 0;
return save;
}
// ------------------------------------------------------------------------------------
// Αντιστρέφει το string s. Βάζει από έναν δείκτην στην αρχή και το τέλος του s, κι
// εναλλάσει τους χαρακτήρες τους μέχρι να συναντηθούν οι δυο δείκτες στη μέση του s
// ΣΗΜΑΝΤΙΚΟ: το s πρέπει να είναι ήδη δημιουργημένο.
//
char *s_reverse(char *s)
{
if ( !s ) // early exit
return NULL;
char *cp1, *cp2, dummy;
cp2 = s + strlen(s) - 1; // set cp2 at end of s
for (cp1=s; cp1 < cp2; cp1++, cp2--) {
dummy = *cp1;
*cp1 = *cp2;
*cp2 = dummy;
}
return s;
}
// ------------------------------------------------------------------------------------
// Αντιστρέφει τις λέξεις του string s κι επιστρέφει το αλλαγμένο s (δείτε στην αρχή
// του αρχείου τον αλγόριθμο).
// ΣΗΜΑΝΤΙΚΟ: το s πρέπει να είναι ήδη δημιουργημένο πριν περαστεί στη συνάρτηση
//
char *s_revwords(char *s)
{
size_t slen = strlen(s) + 1; // strlen() excludes '\0', so +1
char t[ slen+1 ]; // t will have an extra space at the end
char *delims=" \t\n", *cp = NULL;
*t = '\0'; // must be done, for strcat() below
s_reverse(s);
cp = strtok(s, delims);
while (cp != NULL)
{
strcat(t, s_reverse(cp) );
strcat(t, " ");
cp = strtok(NULL, delims);
}
s_ncopy(s, t, slen ); // exclude final space char ' '
return s;
}
// ------------------------------------------------------------------------------------
int main( void )
{
char s[256];
printf("Enter a sentence: ");
fgets(s, 256, stdin);
printf("%s\n", s_revwords(s));
exit( EXIT_SUCCESS );
}
migf1 έγραψε:
[snip]
Γράψτε μια συνάρτηση: int myatoi( char *str ) η οποία θα μιμείται τη στάνταρ συνάρτηση: atoi().
Η συνάρτηση δέχεται ως όρισμα ένα string και επιστρέφει τον ακέραιο αριθμό στον οποίον αντιστοιχεί σε αυτό το string. Θα πρέπει να λαμβάνει υπόψη της τα εξής:* η κανονική atoi() ως αρνητικό όριο επιστρέφει το INT_MIN (και όχι το -INT_MAX) αλλά δεν χρειάζεται να το κάνετε έτσι
- αρχικά κενά διαστήματα αγνοούνται
- τα πρόσημα + και - υπολογίζονται κανονικά (αν δεν υπάρχει πρόσημο, ο ακέραιος θεωρείται θετικός)
- αν ο πρώτος μη κενός χαρακτήρας δεν είναι ούτε πρόσημο ούτε ψηφίο, η συνάρτηση επιστρέφει 0
- χαρακτήρες που δεν είναι ψηφία και ακολουθούν κανονικό αριθμό (με ή χωρίς πρόσημο) αγνοούνται
- αν ο υπολογισμένος αριθμός είναι μεγαλύτερος του INT_MAX, η συνάρτηση επιστρέφει INT_MAX
- αν ο υπολογισμένος αριθμός είναι μικρότερος του -INT_MAX, η συνάρτηση επιστρέφει -INT_MAX *
[snip]
/* ---------------------------------------------------------------------------
* Από: migf1
* Υλοποίηση συνάρτησης: int myatoi(char *str) που μιμείται την συνάρτηση
* int int atoi(char *str) της στάνταρ βιβλιοθήκης stdlib
* ---------------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
// ------------------------------------------------------------------------------------
int myatoi( const char *s )
{
if ( !s || !*s ) // ανύπαρκτο ή μηδενικό s
return 0; // πρόωρη έξοδος
//αγνοούμε τυχόν κενούς χαρακτήρες στην αρχή
while (*s && isspace(*s) )
s++;
if ( !*s )
return 0;
// απαιτούμε ο 1ος χαρακτήρας να είναι είτε πρόσημο είτε ψηφίο
if ( *s != '+' && *s != '-' && !isdigit( *s ) )
return 0;
int num = 0, sign = 0; // ΣΗΜΑΝΤΙΚΕΣ αρχικοποιήσεις σε 0
// καθορισμός προσήμου (αν υπάρχει)
if ( *s == '+') {
sign = 1;
s++;
}
else if ( *s == '-') {
sign = -1;
s++;
}
// μετατροπή σε ακέραιο
while ( *s ) // όσο υπάρχουν χαρακτήρες
{
if ( isdigit(*s) ) // ψηφίο, επεξεργάσου το
{
int temp = num * 10 + *s - '0'; // υπολογισμός
if ( INT_MAX - temp < 0 ) { // έλεγχος για overflow
puts("integer overflow");
num = INT_MAX;
break;
}
num = temp;
s++;
}
else // μη-ψηφιο, μην συνεχίσεις!
break;
}
// προσθήκη προσήμου
if ( sign != 0 )
num = num * sign;
return num;
}
// -------------------------------------------------------------------------------------
int main( void )
{
char s[255+1] = "";
printf("Enter a number (%d): ", INT_MAX);
fgets(s, 256, stdin);
printf("%d\n", myatoi2(s) );
exit( EXIT_SUCCESS );
}
linuxs έγραψε:Να βάλω και τις δυο υλοποιήσεις στο πρώτο ποστ? :/ Είναι η ίδια άσκηση απλά με συνάρτηση...να δώσω μήπως κάποιο λινκ μόνο? :/ για πε...
/* ------------------------------------------------------------
* Από: migf1
* υπολογισμός του χώρου που πιάνει στη μνήμη μια μεταβλητή τύπου struct,
* χωρίς χρήση του τελεστή sizeof
*/
#include <stdio.h>
#include <stdlib.h>
// --------------------------------------------------------------------------------------
int main( void )
{
struct test {
int a;
float b;
char c[100];
} test;
struct test *p = &test;
printf("The size of \"struct test\" is: %d bytes\n", (char *)(p+1) - (char *)p );
exit( EXIT_SUCCESS );
}
migf1 έγραψε:Υπολογισμός του χώρου που πιάνει στη μνήμη μια μεταβλητή τύπου struct, χωρίς χρήση του τελεστή sizeof...
- Κώδικας: Επιλογή όλων
/* ------------------------------------------------------------
* Από: migf1
* υπολογισμός του χώρου που πιάνει στη μνήμη μια μεταβλητή τύπου struct,
* χωρίς χρήση του τελεστή sizeof
*/
#include <stdio.h>
#include <stdlib.h>
// --------------------------------------------------------------------------------------
int main( void )
{
struct test {
int a;
float b;
char c[100];
} test;
struct test *p = &test;
printf("The size of \"struct test\" is: %d bytes\n", (char *)(p+1) - (char *)p );
exit( EXIT_SUCCESS );
}