Aπο pascal σε C...HELP!!

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
spartakos13
Δημοσιεύσεις: 1
Εγγραφή: 29 Μαρ 2010 02:06

Aπο pascal σε C...HELP!!

Δημοσίευση από spartakos13 » 29 Μαρ 2010 02:36

Γεια σας,εχω ενα μικρο προβληματακι εχω φτιαξει μια στιβα σε pascal κ 8ελω να την μετατρεψω σε C.... κ εχω ενα μικρο προβλημα σε αυτο,1ον επειδη δεν γνωριζω κ παρα πολυ καλα και δευτερον με εχουν μπερδεψει οι pointer στη c....
Oριστε λοιπον ο κωδικας σε pascal:

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

                      Program list(input,output);
type pp= ^phit;
phit= record
	am : integer;
	gr : real;
	n : pp;
	end;

	var h , t ,aux :pp;
	c : char;





procedure delete(var x,y:pp);{ayti einai h pop}
var aux:pp;
begin

  if (x=nil) then
       writeln('H lista einai kenh')
    else if &#40;x<>nil&#41; then
    begin

         aux&#58;=x;
         x&#58;=aux^.n;
         dispose&#40;aux&#41;;
         aux&#58;=nil;
         writeln&#40;'Diagrafthke'&#41;;
    end;
end; 








    procedure insert &#40;var x , y &#58; pp&#41;;&#123;ayti einai h push&#125;
    var temp &#58; pp;
begin
     new&#40;temp&#41;;
     write&#40;'Poio stoixeio na proste8ei sti Stiva? a.m., vathmos?'&#41;;
     readln&#40;temp^.am, temp^.gr&#41;;

     if &#40;x <> nil&#41; then
        begin
             temp^.n &#58;= x;
             x &#58;= temp;
        end
     else if &#40;x = nil&#41; then
          begin
               x &#58;= temp;
               y &#58;= temp;
               y^.n &#58;= nil;
          end;
end;



procedure print &#40;x&#58;pp&#41;;
var aux &#58;pp;
begin
	aux &#58;= x;
	if aux <> nil then
	begin
		writeln&#40;'a.m&#58;' , aux^.am , 'vathmos&#58;' , aux^.gr&#58;4&#58;1&#41;;
		aux &#58;= aux^.n;
		print&#40;aux&#41;;
	end;
end;



begin
	c &#58;= '*';
	h &#58;= nil;
	t&#58;=nil;
	while&#40;c<>'q'&#41; do
	begin
		write&#40;'insert,delete,print,quit&#58;'&#41;;
		readln&#40;c&#41;;
			case c of
		'i' &#58; insert&#40;h,t&#41;;
		'p' &#58; print&#40;h&#41;;
		'd' &#58; delete&#40;h,t&#41;;
		end;

		end;
	end.



Eυχαριστω εκ των προτερων...{Και αν γνωριζετε καποιο καλο βιβλιο για c που να δινει ιδιαιτερη βαρυτητα σε pointers και λιστες,αν υπαρχει στα ελληνικα ακομα καλυτερα}

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Aπο pascal σε C...HELP!!

Δημοσίευση από alex599 » 30 Μαρ 2010 12:29

Και να σου δώσουμε έτοιμο κώδικα, θα πρέπει να καταλάβεις πρώτα τι κάνουν οι δείκτες, πως ορίζονται, σε τι εξυπηρετούν κτλ. Νομίζω βέβαια ότι και η Pascal έχει δείκτες αλλά δεν ξέρω Pascal για να είμαι σίγουρος.

1)Ένας δείκτης δεν έχει κάποια αριθμητική τιμή αλλά διεύθυνση, έτσι δείχνει σε κάποια άλλη θέση μνήμης, δηλαδή σε κάποια άλλη μεταβλητή.

2)Ο τελεστή & αποδίδει την διεύθυνση μιας μεταβλητής, έτσι ένας δείκτης που μπορεί ως τιμή να πάρει μόνο την διεύθυνση κάποιας άλλης μεταβλητής ή την τιμή ΝULL θα παίρνει τιμές ως εξής: Δείκτης=&Μεταβλητή;

3)Για να αναφερθείς στο περιεχόμενο της θέσης μνήμης στην οποία δείχνει ένας δείκτης κάνεις το εξής: *Δείκτης;

4)Ένας δείκτης δηλώνεται ως εξής: Τύπος *Δείκτης; Τα * του 3 και του 4 έχουν διαφορετική σημασία που την καταλαβαίνει ο compiler και φυσικά δεν είναι πολλαπλασιασμός.

5)Μια μεταβλητή πχ int καταλαμβάνει 4 bytes στην μνήμη, δηλαδή 4 συνεχόμενες θέσεις μνήμης και 4 διευθύνσεις. Μόνο η πρώτη μπαίνει σε μια μεταβλητή δείκτη.

6)Ενας πίνακας, είναι δείκτης, το όνομα του δηλαδή. Έστω έχει έναν πίνακα ΠΙΝ[Ν] τότε το όνομα ΠΙΝ είναι και δείκτης και μπορείς να προσπελάσεις το i-οστό στοιχείο με δύο τρόπους πλέον: ΠΙΝ; ή *(ΠΙΝ+i);

7)Ένας πίνακας είναι δείκτης όμως ένας δείκτης δεν είνα πίνακας, μπορεί να γίνει όμως.

8)Ειδικοί δείκτες είναι οι NULL (μηδενικός) και void(κενός) που μπορεί να μετατραπεί σε κάποιον άλλο με type cast.

9)Η Αριθμητική των δεικτών έχουν να κάνουν με τα bytes που καταλαμβάνουν οι μεταβλητές στις οποίες δείχνουν, δηλαδή αν δείχνει σε int και κάνεις Δείκτης++ τότε αυτός θα πάρει τέτοια διεύθυνση ώστε να δείχνει στον επόμενο int, δηλαδή θα αυξηθεί κατά 4.

10)Ένας δείκτης γίνεται πίνακας μέσω δυναμικής δεσμευσης μνήμης. Χρήση των malloc(), calloc(), realloc() και free() για την C και new, delete για την C++.

Aν θες να φτιάξεις έναν πίνακα ακέραιων 100 θέσεων γράφεις:

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

int array=&#40;int *&#41;malloc&#40;100*sizeof&#40;int&#41;&#41;;
ή
int array=&#40;int *&#41;calloc&#40;100,sizeof&#40;int&#41;&#41;;
και πιο γενικά αν έχεις εγγραφή (δομές για τη C) έστω struct node θα ηταν

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

struct node *array=&#40;struct node *&#41;malloc&#40;100*sizeof&#40;struct node&#41;&#41;;
Η αποδέσμευση μνήμης γίνεται με την free ως εξής: free(array). Απλά πράγματα.

Έτσι φτιάξεις μια δομή με όνομα node, έχεις ένα δείκτη ως κεφαλή που αρχικά είναι NULL και συνδέεις με δυναμική δέσμευση μνήμης όπως πιο πριν όλους του κόμβους σου.

Σχόλιο: Όταν έχεις έναν δείκτη σε ένα struct, τότε στα πεδία του μπορείς να κάνεις προσπέλαση με δύο τρόπους, ο ένας είναι ο κλασικός με τον τελεστή . ή με τον τελεστή βέλος ως εξής: Δείκτης->Πεδίο αφού πιο πριν έχει κάνεις Δείκτης=&Δομή.

Ελπίζω να βοήθησα.
while(!dead()) ++knowledge;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Aπο pascal σε C...HELP!!

Δημοσίευση από dva_dev » 30 Μαρ 2010 23:50

Φίλε spartakos13, αν ο κώδικας που έχεις στην pascal είναι δικός σου και τον έχεις φτιάξει εσύ, τότε μάλλον το πρόβλημα σου μου μοιάζει να προσδιορίζεται περισσότερο στη διαφορά της σύνταξης στη C σε σχέση με την Pascal.
Οι δείκτες όμως λειτουργούν ακριβώς με τον ίδιο τρόπο. Οτι ξέρεις για την pascal, ισχύει ακριβώς το ίδιο και για τη C. Απλώς τη C μπορείς να είσαι λίγο πιο χαλαρός με το type checking που η pascal κάποιες φορές γίνεται κάπως δυσκοίλια.

Γενικά, μην γράψω και όλη τη γραμματική εδώ, η σύνταξη της pascal με το αντίστοιχο στη C (από κάτω) είναι:
x:=value;
x=value;
---------------------------------------
if (x=value)
if (x==value)
---------------------------------------
if (x<>value)
if (x!=value)
---------------------------------------
begin
{
---------------------------------------
end
}
---------------------------------------
x : dataType;
dataType x;
---------------------------------------
x:record ... end;
struct { ... } x;
---------------------------------------
type datatype1 = ^datatape2;
typedef datatype2 *datatype1;
---------------------------------------
pX : ^datatype; pX^.y = z;
datatype* pX; pX->y = z; ή εναλλακτικά
datatype* pX; (*pX).y = z;
---------------------------------------
procedure foo(...)
void foo(...)
---------------------------------------
function foo(...) : datatype
datatype foo()
---------------------------------------

Νομίζω πως αυτά θα σε βοηθήσουν λιγάκι. Το πως συμπεριφέρονται οι δείκτες, τι κάνουν, πως το κάνουν, και τα αντίστοιχα για τις procedures και functions είναι ακριβώς ίδια. Αν τα ξέρεις για την pascal, τα ξέρεις και για τη C.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες