Προς το περιεχόμενο

Πρόβλημα με C (αρχάριος!)


Lomar

Προτεινόμενες αναρτήσεις

Δημοσ.

ΑΚΥΡΟ!!! ΒΡΗΚΑ ΛΥΣΗ!!! :)

 

>
#include <stdio.h>

main ()

{

int n,a[100],b[100],i=0,flag=0,k=0,p=0;

do
{
printf ("\n Dwse ton N: \n");
scanf ("%d",&n);
}
while (n<10 && n>100);

for (i=0;i<n;i++)
{
printf ("\n dwse to %d stoixeio: ",i+1);
scanf ("%d",&a[i]);
}

for (i=0;i<n;i++)
b[i]=0;

flag=0;
k=0;

for (i=0;i<n;i++)
{
if (a[i]!=0)
 {
 b[k]=a[i];
 k++;
 flag=1;
 }
p=i; 
while (flag=0)
{
p++;
if (a[p]!=0)
 {
 b[k]=a[p];
 flag=1;
 }
else
 flag=0;
}
}

for (i=0;i<n;i++)
printf ("\n %d ",b[i]);

}

 

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

Δημοσ.

Επειδή δε σε πιάνω εκει με to flag που έχεις ορίσει (βάλε και κάνα σχόλιο δίπλα) , ορίστε μια απλή εξήγηση πως θα το κανα εγώ :

 

Διαβάζεις τον Α;

Αντέγραψε τον Α στον Β;

Για ι απο 0 ως Ν

Αν το Β[ι]==0 τότε κάντε αντιμετάθεση με το Β[ι+1]

Ελέγχεις το ι στοιχείο του πίνακα μέχρι να είναι μη μηδενικό ή μέχρι να χτυπήσεις Ν

Αν χτυπήσεις Ν exit;

 

(Λύση του ποδαριού , βαριόμουνα να ανοίξω compiler)

Δημοσ.

@Mystirios

 

Μα απο την for την τελευταία υπάρχει το κρητίριο για να σταματήσει όλη αυτή η τρελλή λούπα όταν βρεί Ν. thnks πάντως η δική σου ήταν και κατανοητή και εύκολη και μου γλυτώνει και υπολογιστικούς πόρους.

 

Όχι δεν είναι double post, τελικά (Δόξα τον Θεό τον μεγαλοδύναμο, μετά απο 3 ώρες βρήκα την λύση!! - αν μου πάρει τόσο και σήμερα που γράφω την έκατσα την ψαρόβαρκα!!!) βρήκα και εγώ ο καημένος, φτωχός πλήν τίμιος junior programmer μια λύση που να λειτουργεί!!!!

Δημοσ.

Αλγόριθμος (κάνω μια εξήγηση πριν τη C γιατί μου φωνάζετε!!!) :

 

...έχουμε διαβάσει το Α και πάμε να φτιάξουμε το Β. Βάζουμε 2 μετρητές.

Ο i θα μετράει τα στοιχεία του Α.

Ο j θα μετράει τα στοιχεία του Β.

 

Το ζουμί: το j το αυξάνουμε ΜΟΝΟ όταν βάζουμε ένα στοιχείο στο Β. Έτσι τα μη μηδενικά στοιχεία θα μπουν με τη σειρά:

 

>
j = 0; //ξεκινάμε από την αρχή του Β
for (i = 0; i < 100; i++)
 if (A[i] != 0) { //αν είναι μη μηδενικό στοιχείο
   B[j] = A[i];  //βάλτο στην κατάλληλη θέση του Β με τη σειρά
   j++; //το επόμενο μη μηδενικό να μπει στην επόμενη θέση του Β
 }
}

 

Αυτό ήταν, χρειάστηκε ένα μόνο for. Όμως τα τελευταία στοιχεία του Β δεν τα μηδενίσαμε όπως έπρεπε, και συγκεκριμένα τα στοιχεία από τη θέση j ως το τέλος.

Ένα ακόμα for λοιπόν για να βάλουμε τα υπόλοιπα μηδενικά στο Β:

>
for (; j < 100; j++)
 B[j] = 0;

 

Αυτό έχει ένα περίεργο, το ότι στην αρχή του for έχει ένα σκέτο ερωτηματικό. Ποια θέλαμε να μηδενίσουμε; Τα στοιχεία στις θέσεις από j ως 99 (j από το προηγούμενο for ήταν η θέση ακριβώς μετά από το τελευταίο μη μηδενικό στοιχείο).

Άρα έπρεπε να πούμε

for (j = j; j < 100; j++)

και αφού το j = j δεν κάνει τίποτα, το παραλείπουμε...

Δημοσ.

@alkisg ιδιοφυέστατο, αλλά πάλι δεν κατάλαβα και πολλά :oops:

 

Τέσπα, ένα μεγάλο λοιπόν ευχαριστώ στην κοινότητα του Insomnia που με βοήθησε να ξεπεράσω τα ζητήματα της C :)

 

thnks alkisg, Dikemou, Mystirios, Aerico, kickeras, chiossif για την βοήθεια και τον χρόνο σας!!! Βοηθήσατε, πραγματικά πολύ :)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...