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

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


Lomar

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

Δημοσ.

Χαίρεται!

 

έχω το εξής πρόβλημα:

 

Να γραφεί πρόγραμμα το οποίο:

 

a) Θα τοποθετεί σε εναν μονοδιάστατο πίνακα Α τους 10 πρώτους περιττούς αριθμούς σε αύξουσα σειρά, κάνοντας χρήση μιας επαναληπτικής δομής.

 

B) Να σχαματίζει έναν δεύτερο πίνακα Β του οποίου το στοιχείο Β είναι το άθροισμα των στοιχείων Α[1], Α[2], ... , Α του πρώτου πίνακα (για παράδειγμα το στοιχείο Β[4] είναι το άθροισμα των 4 πρώτων στοιχείων του πίνακα Α).

 

c) Θα εμφανίζει τα στοιχεία και των δύο πινάκων.

 

 

Να η λύση που έδωσα:

 

>
#include <stdio.h>

int main()

{

int k,i,a[10],b[10];

k=0;

for (i=1;i<20;i+2)
{ 
a[k]=i; 
k++;
}

for (i=0;i<=10;i++)
{ 
while (k<=i)
  b[i]+=a[k];
}

printf ("\n PINAKAS A: \n");


for (i=0;i<=10;i++)
printf ("  %d ",a[i]);

printf ("\n PINAKAS B: \n");

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

return 0;
}

 

To ζήτημα τώρα είναι πως ο compiler (της Pacific C) δεν μου βγάζει κανένα λάθος, αλλά το πρόγραμμα δεν τρέχει!!!!

 

Έναν οριζόντιο κέρσορα μου εμφανίζει μόνο!!! Η εντολή Ctrl+C δεν λειτουργεί, προκειμένου να σταματήσει το πρόγραμμα! Δλδ κολλάει το πρόγραμμα!

 

Μπορεί τουλάχιστον να μου πεί κανείς αν υπάρχει κάποιο λάθος στον αλγόριθμο;;

 

Ευχαριστώ εκ των προτέρων, αύριο γράφω και φοβάμαι μήπως κάνω κανένα γελοίο λάθος...

Δημοσ.

Στην πρώτη λούπα βάλε i=i+2 αντί για i+2.

Στο while της 2ης λούπας δεν αυξάνεις το k (εκεί κολλάει μάλλον). Πριν το while, δεν κάνεις initialize το k=0;

 

;)

Δημοσ.

Επίσεις το κάθε Loop πρέπει να περικλείεται από αγκύλες {}. Μετά την συνθήκη της For While πρέπει να ανοίξεις αγκύλες.

π.χ. while (i>1) {

εντολές;

}

 

και για την For το ίδιο. Δοκίμασε το και πες αν σου δουλεύει. Αλλιώς πες ακριβώς τι σου λέει ο compiler.

 

Επίσεις όταν εμφανίζεις τον πίνακα θέλει For (i=0;i<=9;i++){

εντολές ;

}

γιατί ουσιαστικά τον πας να εμφανίσει το στοιχείο α[10] του πίνακα. Όμως η C ξεκινάει από το 0 το μέτρημα άρα του ζητάς να εμφανίσει το 11 στοιχείο του πίνακα το οποίο είναι λάθος.

Δημοσ.

peran tis simeiwsis tou Dikemou pou o dikos mou o compiler de to dexetai an koitakseis ligo ton algorithmo sou katalavaineis oti exei kai logical errors...diladi mpaineis se endless loop.

agkiles de xreiazontai otan ekteleis mono mia entoli.

for (i=1;i<20;i=i+2)

{

a[k]=i;

k++;

}

afto to loop trexei 10 fores ara k = 10 sto telos

for (i=0;i<=10;i++)

{

while (k<=i)

b+=a[k];

}

to i ginetai 10 kai ara mpainei sto while loop....sto opoio kaneis ti?tou les gia oso to i (10) einai <= tou k (10) mpes ekei....e den allazeis tin timi tou k pouthena ara den vgainei pote apo kei mesa...

Δημοσ.

thnks a lot!!!! :D

 

@Aerico Οι αγκύλες δεν έχουν σημασία όταν ακολουθεί μια εντολή πχ

 

for (i=0;i<=10;i++)

while (mpla mpla)

for (mpla mpla)

 

dn xreiazontai agiles, kai pali omws to dokimasa opws m eipes k tpt, anavosvinei o idios orizontios kersoras, mono auto tpt allo k fusika to gnosto krasarisma! :(

 

@Dikemou

 

Eixes dikio!!! ksexasa o anapiros na valw to k++; !!!!!!!!!

Twra omws allo bug!!! trexei kurile, alla meta ton peritto arithmo 17 anti gia 19 m vgazei: 22486 gia ton pinaka A kai meta ston pinaka B:

 

22486 -29 -1235 97 -1239 1098 141 -1224 15 17 24820

 

:confused:

 

parepiptontws o debuges kwdikas by Dikemou

 

>#include <stdio.h>

int main()

{

int k,i,a[10],b[10];

for (i=1;i<20;i=i+2)
{ 
a[k]=i; 
k++;
}

k=0;

for (i=0;i<=10;i++)
{ 
while (k<=i)
  {
  b[i]+=a[k];
  k++;
  }
}

printf ("\n PINAKAS A: \n");


for (i=0;i<=10;i++)
printf ("  %d ",a[i]);

printf ("\n PINAKAS B: \n");

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

return 0;
}

 

to initialize gia to k to eixa kanei k pio prin apla twra, to evala pio panw apo to while opws k mou proteines... Twra omws??

Δημοσ.

@kickeras

 

to k THELW na ginei 10 sto telos (to zitaei h askisi) apla to evala mesa sthn loupa prokeimenou na anevazei ton metriti tou pinaka (a[k] anti gia a)

 

Episis to while ekteleitai i fores!!! oxi 10! thn ekfwnisi ths askisis thn diavases protou me rwtiseis giati to kanw? giati to stoixeio b tha prepei na einai: b=a[i-1]+a[i-2]+...+a gia auto to kanw.

Δημοσ.

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

 

Ευχαριστώ εκ των προτέρων... :)

Δημοσ.

den me katalaves. katarxin me ton kainourgio kwdika ekei pou exeis valei to k=0 tha prepe na sou xtipaei sto run-time kathoti xristimopoieis to variable k apo panw xwris na to xeis kanei initialize.

kata defteron to while den ekteleitai i fores. ston proigoumeno kwdika ekteloutan apeires kai se afton ekteleitai mia dioti les while (k<=i)....to k exei timi 10. ara i sinthiki ginetai alithis mono otan i = 10 diladi tin teleftaia fora pou trexei to for loop. ekei pera me ton kainourgio kwdika sou mpainei mesa, kanei b+=a[k]; kai meta k++ dld k = 11. meta otan ksanapaei na elegksei tin sinthiki leei while (k(11)<=i(10)) pou den isxiei...vgainei eksw kai bye bye...

triton xrisimopoieis ton pinaka b xwris na exeis kanei initialize. an de tou xeis dwsei arxika tin timi 0 kai kaneis gia p.x. i = 5 b+=a[k]; prostheteis to a[k] se poia timi?

meta otan kaneis printf trexeis to loop 11 fores oxi 10 giati ksekinas apo to 0 kai ftaneis sto 10. prosexe ta conditions otan thes na kaneis xrisi loops

anyway afto nomizw theleis

>#include <stdio.h>
int main()
{
int k,i,a[10],b[10];
k=0;
//initialize array b
for (i=0; i<10;i++)
b[i]=0;

for (i=1;i<20;i=i+2)
{ 
a[k]=i; 
k++;
}

for (i=0;i<10;i++)
{
k = i;
while(k >= 0)
{
	b[i]+=a[k];
	k--;
}
}
printf ("\n PINAKAS A: \n");

for (i=0;i<10;i++)
printf ("  %d ",a[i]);

printf ("\n PINAKAS B: \n");

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

return 0;
}

Δημοσ.

@kickeras

 

thnks dude, τώρα την άκουσα άσχημα, έχεις δίκιο... απογοητεύτηκα τώρα :(, θα το τρέξω στον compiler μου να δω τι ακριβώς παίζει, εκεί που έκανεσ την αλλαγή στον κώδικά μου το b αυξάνεται κατα i α[ι] στοιχεία; thnks πάντως... :)

Δημοσ.

τελικά δέν χρειαζότανε debugging (μόνο μια διόρθωση στη σύνταξη των σχολίων για το initializing του δεύτερου πίνακα)!!! Το initializing του b πινακα το είχα δοκιμάσει στην αρχή ακόμα και δεν απέδιδε, το λάθος μου ήταν στο μέτρημα των στοιχείων a που έπρεπε να προστεθούν στο εκάστοτε b.

 

Λειτουργεί τέλεια, ιδιοφυές το τέχνασμα με το while (k>=0) k--;!!!

Δημοσ.

τώρα που την έλυσες σου στέλνω την δική μου πρόταση-λύση:

 

#include <stdio.h>

#include <stdlib.h>

 

#define MAXEL 10

 

int main() {

int a[MAXEL], b[MAXEL];

register int i, j;

 

for (i=0;i<MAXEL;i++)

a=2*i+1;

for (i=0;i<MAXEL;i++){

b=0;

for (j=i;j>=0;j--)

b+=a[j];

}

for(i=0;i<MAXEL;i++)

printf("%4d\t%4d\t%8d\n",i+1,a,b);

 

return 0;

}

 

Πιστεύω ότι έκανες τα εύκολα δύσκολα. Αλήθεια αν ήσουν δάσκαλος και διόρθωνες την δική σου λύση και την δική μου, ποιά θα σου φαινόταν πιο "αρχάρια";

Δημοσ.

Και μια έκδοση με μία μόνο γραμμή μέσα στο for, εννοείται ότι είναι για πλάκα, όχι για να την παραδώσεις:

>int main(void)
{
 int A[10], B[10], i, sum = 0;

 for (i=0; i < 10; i++)
   printf("%d\t%d\n", A[i] = 2*i + 1, B[i] = sum += 2*i + 1);

 return getchar();
}

Δημοσ.

@chiossif thnks, αλλά δεν κατάλαβα προς τι η ερώτηση σου, η "δική" μου θα μου φαινόταν πιο δύσκολη, επίσης την συνάρτηση που μου γράφεις δεν την ξέρω...

 

@alkisg Ευχαριστώ και εσένα για τον κόπο σου να μου απαντήσεις, αλλά το return getchar (); πρώτη φορά το βλέπω και με μπερδεύει γενικότερα η λύση σου... :(

 

Τώρα έχω και άλλο σκάλωμα! Το γράφω αν και ξέρω πως θα με πάρετε με τις πέτρες... :oops:

 

Να γίνει πρόγραμμα το οποίο:

 

1. Διαβάζει ακέραιο αριθμό Ν απο 10 μέχρι το 100 με έλεγχο στην είσοδο.

 

2. Διαβάζει Ν ακεραίους και τους καταχωρεί στον Α[100].

 

3. Δημιουργεί ένα δεύτερο πίνακα Β, ο οποίος περιέχει τα στοιχεία του Α με την ίδια σειρά έχοντας μετατοπίσει τα μηδενικά στοιχεία στο τέλος του.

 

Για παράδειγμα: άν Α=[1 0 0 9 0 0 6 4 0 0], τότε Β=[1 9 6 4 0 0 0 0 0 0]

 

Η λύση του άσχετου πρωτοεξαμηνήτη:

 

>
#include <stdio.h>

main ()

{

int n,a[100],b[100],i=0,flag=0,p=0;k=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;

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

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

}

 

Όποιος με βοηθήσει στο που έκανα στον αλγόριθμο την λαλακια πριν τις 6 μ.μ.

θα του είμαι βαθύτατα υπόχρεως!!!

 

Υ.Γ. Ο compiler το τρέχει χωρίς κανένα λάθος το πρόγραμμα (κλασσικά), αλλά στην τελευταία εκτύπωση μου βγάζει τον πρώτο αριθμό που εισάγω ακολουθούμενο απο n-1 μηδενικά (0)...:cry: επίσης δοκίμασα και με 2 for και με do while αλλά τπτ γμτ...

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

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

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