Απο ψευδογλώσσα σε c..

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

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

Απάντηση
skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 19 Δεκ 2010 23:51

Καλησπέρα, εχω τον εξής κώδικα σε ψευδογλώσσα.

Αλγοριθμος ασκηση
δεδομένα //n,a//
Για r απο 1 μεχρι n-1
pivot <- arr : t <-r

Για i απο r+1 μεχρι n
Aν |pivot| < |air| τοτε
pivot <- air : t<-i
τελοσ_αν
τελος_επαναληψης
Αν pivot = 0 τοτε εξοδος

Αν t διαφορο r τοτε
Για j απο r μεχρι n+1
αντιμεταθεσε arj,atj
τελοσ_επαναληψης
τελος_αν
Για i απο r+1 μεχρι n
m<- air/pivot
Για j απο r+1 μεχρι n+1
aij<- aij-m*ar;
τελοσ_επαναληψης
τελος_επαναληψης
τελοσ_επαναληψης
Αν ann = 0 τοτε εξοδος
xn<-an,n+1/ann
Για i απο n-1 μεχρι 1 με βημα -1
s<-0
Για j απο i+1 μεχρι n
s<- s+aij*bj
τελος_επαναληψης
xi<-(ai,n+1-s)/aii
τελοσ_επαναληψης
αποτελεσματα //χ//
τελος ασκηση

αναφερω πως στα σημεια air, ann, aij,ai,n+1, ann κτλ κτλ αναφέρομαι σε πίνακες με όνομα πίνακα το a και τα i,j,n,n+1 κτλ κτλ δείκτες τον πινάκων!! απλώς δεν ηξερα πως να τους συμβολησω!!

ο κώδικας c που έχω γράψει είναι ο εξής :

# include <stdio.h>

int main() {
int r,n,t;
int i,j,m,s;
int a[1000];
int x[1000];

for (r=1; r<=n-1; r++)
{
a[r,r] = pivot;
r=t;


for (i=1; i<=r+1; i++)
{

if (abs(pivot) < abs(a[i,r]))
{
a[i,r] = pivot;
i = t;
}

}

if (pivot = 0)
{
break;
}

if (t!=r)
{
for (j=r; j<=n+1; j++)
{
a[r,j] == a[t,j];
}
}

for (i=r+1; i<=n; i++)
{
(a[i,r]/pivot) = m;

for (j=r+1; j<=n+1; j++)
{
a[i,j] - m*a[r];
}
}

}

if(a[n,n]=0)
{
break;
}

(a[n,n+1]/a[n,n]) = x;

for (i=n-1; i>=1; i--)
{
s = 0;
for (j=i+1; j<=n; j++)
{
s = s+(a[i,j]*b[j]);
}
x = (a[i,n+1]-s)/a[i,i];
}

return x;

}

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

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Απο ψευδογλώσσα σε c..

Δημοσίευση από gvre » 20 Δεκ 2010 11:38

Ο τελεστής σύγκρισης στην C είναι == και όχι =
Το a[i,j] πρέπει να γίνει a[j].

ps. Βάζε τον κώδικα σε Code blocks
ps2. Στο internet θα βρεις πολλά tutorials σχετικά με τη C και τους πίνακες. πχ http://www.exforsys.com/tutorials/c-lan ... rrays.html

GReaper
Δημοσιεύσεις: 48
Εγγραφή: 11 Δεκ 2010 21:47
Επικοινωνία:

Απο ψευδογλώσσα σε c..

Δημοσίευση από GReaper » 20 Δεκ 2010 11:44

Η πίνακες τις C είναι από 0 μέχρι και n-1. Να το θυμάσαι αυτό!

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Απο ψευδογλώσσα σε c..

Δημοσίευση από virxen75 » 20 Δεκ 2010 12:56

ο κώδικας σου σε code tags με μικρές διορθώσεις
o πίνακας α είναι δηλωμενος μονοδιάστατος αλλά το προγραμμα σου δεν τον χρησιμοποιεί έτσι.Σύγκρινε τους κώδικες να δεις τα λάθη.Οσον αφορά την λογική δεν το κοίταξα.

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

# include <stdio.h>

int main&#40;&#41; &#123;
int r,n,t;
int i,j,m,s;
int a&#91;1000&#93;&#91;1000&#93;;
int x&#91;1000&#93;;

for &#40;r=0; r<n-1; r++&#41;&#123;
   a&#91;r&#93;&#91;r&#93; = pivot;
   r=t;
   for &#40;i=0; i<r+1; i++&#41;&#123;
      if &#40;abs&#40;pivot&#41; < abs&#40;a&#91;i&#93;&#91;r&#93;&#41;&#41;&#123;
         a&#91;i&#93;&#91;r&#93; = pivot;
         i = t;
      &#125;
  &#125;
  if &#40;pivot == 0&#41;&#123;
   break;
  &#125;
  if &#40;t!=r&#41;&#123;
     for &#40;j=r; j<=n+1; j++&#41;&#123;
        a&#91;r&#93;&#91;j&#93; = a&#91;t&#93;&#91;j&#93;;
     &#125;
  &#125;
  for &#40;i=r+1; i<=n; i++&#41;&#123;
     m=&#40;a&#91;i&#93;&#91;r&#93;/pivot&#41; ;
    for &#40;j=r+1; j<=n+1; j++&#41;&#123;
       a&#91;i&#93;&#91;j&#93;=a&#91;i&#93;&#91;j&#93; - m*a&#91;r&#93;;
    &#125;
  &#125;

&#125;

  if&#40;a&#91;n&#93;&#91;n&#93;==0&#41;&#123;
    break;
  &#125;

x&#91;i&#93;=&#40;a&#91;n&#93;&#91;n+1&#93;/a&#91;n&#93;&#91;n&#93;&#41;;

for &#40;i=n-1; i>=1; i--&#41;&#123;
   s = 0;
   for &#40;j=i+1; j<=n; j++&#41;&#123;
     s = s+&#40;a&#91;i&#93;&#91;j&#93;*b&#91;j&#93;&#41;;
   &#125;
   x&#91;i&#93; = &#40;a&#91;i&#93;&#91;n+1&#93;-s&#41;/a&#91;i&#93;&#91;i&#93;;
&#125;

printf&#40;"\n apotelesma x=%d",x&#41;;
getchar&#40;&#41;;
return 0;
&#125; 

skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 20 Δεκ 2010 16:49

Ευχαριστώ πολύ για την βοήθεια, αλλα μου βγάζει ακόμα λάθη.
Τρέχω τον κώδικα σε dev c compiler και μου βγάζει τα εξής λάθοι:

c:\users\skoufos\folders... in function 'main'.
c:\users\skoufos\folders... line 30: invalid operands to binary*
c:\users\skoufos\folders... line 37: break statement not within loop or switch
c:\users\skoufos\folders... line 45: 'b' undeclared (first use in this function)
(Each undeclared identifier is reported only once
for each function it appears in.)
(Build error) (main.o) Error 1

skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 20 Δεκ 2010 16:55

Συγνώμη για την παράλειψη, για να μη μετρατε γραμμές,
η line 30 : a [j]=a [j] - m*a[r];
η line 37 : break;
η line 45 : s = s+(a [j]*b[j]);

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

Απο ψευδογλώσσα σε c..

Δημοσίευση από dva_dev » 20 Δεκ 2010 17:06

Tα προβλήματα που έχεις, είναι στον ψευδοκώδικα και απλώς τα μεταφέρεις στον C κώδικα. Πρέπει πρώτα να διορθώσεις τον ψευδοκώδικα σου και μετά κοιτώντας τι διορθώσεις έχει κάνει ο virxen75 πως προς τη σύνταξη των πινάκων λογικά θα είσαι εντάξει.

Επίσης, να θυμάσαι ότι μια απάντηση είναι εντελώς άχρηστη, αν δεν γνωρίζεις την ερώτηση στην οποία απαντά. Ο ψευδοκώδικας είναι η απάντηση. Η ερώτηση ποιά είναι;

skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 20 Δεκ 2010 17:16

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

skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 20 Δεκ 2010 17:28

Αλλαξα την break; με την exit(0); και τωρα το μονο πρόβλημα που μου εμφανίζει μετά το compilation είναι:
line 30 : a [j]=a [j] - m*a[r];
και λεει δίπλα invalid operands to binary*

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Απο ψευδογλώσσα σε c..

Δημοσίευση από gvre » 20 Δεκ 2010 17:35

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

int a&#91;1000&#93;&#91;1000&#93;;

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

line 30 &#58; a&#91;i&#93; &#91;j&#93;=a&#91;i&#93; &#91;j&#93; - m*a&#91;r&#93;; 
Το a είναι πίνακας 2 διαστάσεων άρα κάτι λείπει από το τέλος της γραμμής 30 για να διαβάσεις τον ακέραιο.

skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 20 Δεκ 2010 17:41

Για να είμαι ειλικρηνής δεν κατάλαβα τι εννοείς grve, αν έχει να κάνει με τα κένα πάντως το δοκίμασα και πρίν και τζίφος!!!

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Απο ψευδογλώσσα σε c..

Δημοσίευση από gvre » 20 Δεκ 2010 17:44

Εννοώ ότι για να διαβάσεις από τον πίνακα a θα πρέπει να του δώσεις σωστά τη θέση από την οποία θέλεις να διαβάσεις.
πχ a[0][1] αντί a[0] (αυτό δεν είναι ακέραιος). Στη γραμμή 30 χρειάζεσαι κάτι τέτοιο m * a[r][εδω κάτι λείπει];

skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 20 Δεκ 2010 18:25

Κατάλαβα τι εννοείς, και το διόρθωσα!! Τώρα είναι κομπλέ!!
Ευχαριστώ πολύ!!!!!!!!!!!!!
Εχω ένα τελευταίο θεματάκι, το πρόγραμα πρέπει να πέρνει κάποια στοιχεία (αριθμούς) απο ένα αρχείο που ονομάζεται 'Gauss_in.txt' και τα αποτελέσματα θα τα εξάγει με ένα αρχείο που θα ονομάζεται 'Gauss_out.txt'.
To αρχείο εισόδου θα περιέχει αριθμούς και θα είναι του τύπου:
2
3
4
3
1
2
1
όπου η πρώτη γραμμή συμβολίζει τον αριθμό των εξισώσεων
και στην συνέχεια οι υπόλοιποι αριθμοί συμβολίζουν τους συντελεστές κάθε εξίσωσεις γραμμη - γραμμή.
Παράδειγμα: αν έχουμε τις εξισώσεις : 3*χ1+4*χ2 = 3
χ1+2*χ2=1
Τότε το αρχείο εισόδου θα είναι της μορφής :
2
3
4
3
1
2
1
και το αρχείο εξόδου θα είναι της μορφής :
1
0
όπου τα 1 και 0 είναι οι λύσεις τον χ1 και χ2 αντίστοιχα!!
Οπότε τι πρέπει να συμπληρώσω στπν κώδικα για να είναι εντάξει??
Ευχαριστώ!!!!!!!!!!!!!

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Απο ψευδογλώσσα σε c..

Δημοσίευση από gvre » 20 Δεκ 2010 18:38

Να διαβάσεις πώς γίνεται η διαχείριση αρχείων :) Δες το Intro to File Input/Output in C για αρχή. Κάνε πρώτα την ανάγνωση από το αρχείο εισόδου και όταν το φτιάξεις να δουλεύει σωστά θα κάνεις και την εγγραφή στο αρχείο εξόδου.

skoufos
Δημοσιεύσεις: 20
Εγγραφή: 10 Δεκ 2010 19:02

Απο ψευδογλώσσα σε c..

Δημοσίευση από skoufos » 20 Δεκ 2010 20:06

Διαβάζω το αρχείο που θέλω με το όνομα Gauss_in.txt
κάνω τον έλεγχο που πρέπει για να τερματίσει αν το αρχείο είναι άδειο και μετά δεν μπορώ να διαβάσω τους αριθμούς που έχει μέσα το άρχειο. Διάβασα για την fscanf και την getc αλλα δεν βγάζω άκρη. Πώς θα το κάνω αυτο?? το αρχείο περιέχει σε κάθε γραμμή έναν αριθμό.

Απάντηση

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

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

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