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

Ευκολη άσκση στην c


nik324

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

  • Απαντ. 99
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ. (επεξεργασμένο)

Επειδή να σου λύσω εγώ την άσκηση δεν παίζει, θα σου δώσω μερικά hints...

 

- για την αποθήκευση των λέξεων θέλεις έναν 2-διάστατο πίνακα χαρακτήρων: char wordslist [ NWORDS ][ WORDSIZE ];

- για το μέτρημα της κάθε λέξης θέλεις έναν μονοδιάστατο πίνακα από int, που θα τον αρχικοποιήσεις να έχει όλα του τα στοιχεία ίσα με 0: wordsfreq[ NWORDS ] = {0};

 

Τώρα, κάθε λέξη που διαβάζεις θα κοιτάς πρώτα αν υπάρχει ήδη μέσα στον πίνακα wordslist. Αν δεν υπάρχει, τότε θα την προσθέτεις στο τέλος της λίστας και θα κρατάς τη θέση στην οποία προστέθηκε. Αν υπάρχει ήδη μέσα στον wordslist τότε απλά θα κρατάς τη θέση στην οποία βρέθηκε. Την θέση στην οποία προστέθηκε ή βρέθηκε η λέξη στον wordlists θα τη χρησιμοποιείς για να αυξήσεις κατά 1 την τιμή της αντίστοιχης θέσης στον πίνακα wordsfreq.

 

Οπότε με υποθετικό input: η κότα έκανε το αυγό ή το αυγό την κότα;

 

Στο τέλος θα έχεις φτιάξει αυτό...

 

wordslist[ ][ ] : { "η", "κότα", "έκανε", "το", "αυγό", "ή", "την" }

wordsfreq[] : { 1, 2, 1, 2, 2, 1, 1 }

 

Για να τυπώσεις τα αποτελέσματα, θα κάνεις κάτι σαν κι αυτό:

 

>
void print_results( int lastpos, char wordslist[ NWORDS ][ WORDSIZE ], int wordsfreq[ NWORDS ] )
{
register int i = 0;

for (i=0; i < lastpos; i++)
       	printf("%s : %d times\n", wordslist[ i ], wordsfreq[ i ] );

return;
}

 

ΥΓ. Η σύγκριση strings γίνεται με την strncmp()

Επεξ/σία από migf1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν παίζει να λύσω κάτι τέτοιο....Εχω βασικές ελείψεις....

 

Κοιτάω τόση ώρα τον κώδικα αυτό αλλα δε μπορώ να καταλάβψ που βρίσκεται το λάθος...στην δεύτερη επανάλήψη το κάνει λάθος

 

>

#include <stdio.h>
#define N 100

int main(void){
       int A[N],i,j=0;
       for(i=0;i<100;++i)
               A[i] = i+1;
       i = 0;
       while(j < N){
               if(A[i]){
                       printf("%3d died..\n",A[i]);
                       A[i] = 0;
                       i = (i+2) % N;
                       ++j;

               }
               else
                       ++i;
       }
       return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν παίζει να λύσω κάτι τέτοιο....Εχω βασικές ελείψεις....

 

Κοιτάω τόση ώρα τον κώδικα αυτό αλλα δε μπορώ να καταλάβψ που βρίσκεται το λάθος...στην δεύτερη επανάλήψη το κάνει λάθος

 

>

#include <stdio.h>
#define N 100

int main(void){
       int A[N],i,j=0;
       for(i=0;i<100;++i)
               A[i] = i+1;
       i = 0;
       while(j < N){
               if(A[i]){
                       printf("%3d died..\n",A[i]);
                       A[i] = 0;
                       i = (i+2) % N;
                       ++j;

               }
               else
                       ++i;
       }
       return 0;
}

 

--EDIT:

Χμ.. συμφωνώ με τον migf1, τι έξοδο θέλεις να πάρεις από τον παραπάνω κώδικα; Στην δεύτερη επανάληψη "σκοτώνεις" απλά τους ζωντανούς φυλακισμένους και μηδενίζει τον πίνακα, οπότε??

 

(Κατέβασα το προηγούμενο post διότι δεν είμαι σίγουρος τι θέλεις να κάνεις & δεν θέλω να μπερδευτείς).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η ακριβής υλοποίηση της άσκησης του αρχικού post πάντως υποτιμήθηκε και νομίζω καμία από τις προτεινόμενες λύσεις δεν δίνει το ζητούμενο output. Μιας και έληξε η προσθεσμία της, έκατσα να την κάνω πριν από λίγο και διαπίστωσα πως το ζητούμενο να τυπώνεται ο επιζήσαντας είναι το όλο ζουμί της.

 

Προφανώς θα υπάρχουν πιο κομψές υλοποιήσεις από την παρακάτω, αλλά σε αυτή κατέληξα στον χρόνο που ασχολήθηκα:

 

>
#include <stdio.h>
#include <stdlib.h>

#define VERBOSE		0	/* change it to 1 for more... wordy output */

#define N		100
#define ISEVEN(n)	( (n) % 2 == 0 )

int main( void )
{
register int i = 1, last = i, remain = N, step = 2;

while ( remain > 0 )
{
	if ( VERBOSE )
		printf(	"%d has the knife\n", last );

	if ( i >= N )
		step = 4;

	remain -= (step / 2);
	if ( remain <= 0 )
		break;

	i += step;
	last = i > N ? ( ISEVEN(N) ? i % N : (i % N )-1 ) : i;
}
printf("\nPrisoner %d survived!\n\n", last);

return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

Βρε βρε βρεεε ! Να και ενας συμφοιτητης μου στο insomnia B)

nik324 που την ειδες την ευκολη ?(συμφωνα με τις γνωσεις μας στη C παντα) :P 2 ημερονυκτα παλευα.Ολημερις την εχτιζα, το βραδυ γκρεμιζοταν ενα πραγμα :P .Και στο τελος εκει που ειχα βγαλει ενα αποτελεσμα (που νομιζω οτι ειναι σωστο) :unsure: την εκανα compile και τιποτα :( :angry: .Παρακατω δινω τον κωδικα που εχω γραψει για την ασκηση με τους μελλοθανατους.Οποιος εχει ορεξη ας την κοιταξει και ας μου πει που βρισκεται το λαθος γιατι θα σκασω αν δεν το βρω.

 

 

 

>

#include <stdio.h>
#include <string.h>

void Game(int p){
int t,i,q,e,temp1,temp2,j,k,z,Num[p+2];

for (i=0;i<p;i++){
       Num[i] = i+1;
       }
       Num[p]=0;
       Num[p+1]=0;

do{
   
          t=0;
e=p ;
    while (Num[t] != 0){  
         
          Num[t+1]=0;
          t+=2;
          e--;
          }  
          
       if (e%2!=0){  //perittos arithmos paixton//
                  
                                temp2=Num[e-1];            //kratao ton teleutaio epeidh exei to maxairi//
                                for (q=(p-2);q>=1;q--){    //metakino olous mia thesi mprosta kai vazo ton teleutaio proto//
                                    Num[q+1]=Num[q];       //epeidh o teleutaios exei to maxairi kai tha ksekinisei protos//
                                    }                      //ston epomeno gyro - kyklo//
                                Num[0]=temp2;
                                for (i=1;i<p;i++){
                                    if (Num[i-1]==0){
                                temp1=Num[i-1];
                                Num[i-1]=Num[i];
                                Num[i]=temp1;
                                }                                       
                                                   }
                                                   }
                  else {                                          //artios arithmos paixton//
                                                              
                                     for (j=2;j<p;j++){
                                          if (Num[i-1]==0)  {     //Otan p artios panta o protos exei to maxairi// 
                                         temp1=Num[j-1];          // taksinomo ton pinaka//
                                         Num[j-1]=Num[j];         //áapo tin 2h thesh kai meta oste na ksekinisei protos autos pou exei to maxairi //
                                         Num[j]=temp1;            // ston epomeno gyro - kyklo //
                                         }
                                                      }                                                                 
                       }              
                         
              
}while (e!=1);                                              
                   printf ("%d\n",Num[0]);                                        
                                    
       }
  

int main(){
   
   int p;
   
   printf("How many players are going to play?: ");
   scanf ("%d",&p);
  
   Game(p);  
   
   system("pause");
   return 0;
   }

 

 

Οσο για το μπαχαλο με τις μεταβλητες δε θελω σχολια :whistle: :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Οποιος εχει ορεξη ας την κοιταξει και ας μου πει που βρισκεται το λαθος γιατι θα σκασω αν δεν το βρω.

 

 

 

>

#include <stdio.h>
#include <string.h>

void Game(int p){
int t,i,q,e,temp1,temp2,j,k,z,Num[p+2];

for (i=0;i<p;i++){
       Num[i] = i+1;
       }
       Num[p]=0;
       Num[p+1]=0;

do{
   
  		t=0;
e=p ;
	while (Num[t] != 0){  
         
  		Num[t+1]=0;
  		t+=2;
  		e--;
  		}  
  		
       if (e%2!=0){  //perittos arithmos paixton//
      			
                    			temp2=Num[e-1];            //kratao ton teleutaio epeidh exei to maxairi//
                    			for (q=(p-2);q>=1;q--){    //metakino olous mia thesi mprosta kai vazo ton teleutaio proto//
                        			Num[q+1]=Num[q];   	//epeidh o teleutaios exei to maxairi kai tha ksekinisei protos//
                        			}                      //ston epomeno gyro - kyklo//
                    			Num[0]=temp2;
                    			for (i=1;i<p;i++){
                        			if (Num[i-1]==0){
                    			temp1=Num[i-1];
                    			Num[i-1]=Num[i];
                    			Num[i]=temp1;
                    			}                           			
                                                   }
                                                   }
      			else {                                          //artios arithmos paixton//
                                                  			
                                     for (j=2;j<p;j++){
                              			if (Num[i-1]==0)  { 	//Otan p artios panta o protos exei to maxairi// 
                                         temp1=Num[j-1];          // taksinomo ton pinaka//
                                         Num[j-1]=Num[j]; 		//áapo tin 2h thesh kai meta oste na ksekinisei protos autos pou exei to maxairi //
                                         Num[j]=temp1;            // ston epomeno gyro - kyklo //
                                         }
                                          			}                                                     			
                       }              
                         
  			
}while (e!=1);                                              
                   printf ("%d\n",Num[0]);                                        
                        			
       }
  

int main(){
   
   int p;
   
   printf("How many players are going to play?: ");
   scanf ("%d",&p);
  
   Game(p);  
   
   system("pause");
   return 0;
   }

 

 

Οσο για το μπαχαλο με τις μεταβλητες δε θελω σχολια :whistle: :P

 

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

 

Αυτό που διαπίστωσα πάντως όταν έλυσα την άσκηση είναι πως το βασικό πρόβλημα είναι πως όταν το μαχαίρι ξανά-φτάσει στον 1ο φυλακισμένο μετά πρέπει να αλλάξει το βήμα εξέτασης (από 2 σε 4) γιατί πλέον ο επόμενοςς φυλακισμένος μετά τον 1ο είναι αυτός που πριν ήταν 5ος. Αυτό + το αν το αρχικό πλήθος των φυλακισμένων είναι περιττός ή άρτιος αριθμός είναι που δυσκολεύει το να τυπώσεις ποιος φυλακισμένος επέζησε με αρίθμηση συνεπή ως προς το αρχικό τους πλήθος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Και με το δικιο σου :P ...

Παρακατω εξηγω τι ακριβως κανει αυτο το "μπαχαλο" :P που εχω γραψει.

 

1)Φτιαχνω πινακα και στα κελια βαζω τον αριθμο του καθε παιχτη.Στον πινακα βαζω 2 παραπανω κελια και τα γεμιζω με 0.Μετα με μια while αναζητω τα κελια που δεν εχουν 0 και τους γραφω μεσα 0 αν δεν εχουν.Στο τελος ο μετρητης αυξανει κατα 2 και ο αριθμος των παιχτων μειωνεται κατα 1 (για καθε επαναληψη). Η επαναληψη σταματαει οταν συναντησει μηδεν σε καποιο κελι (εξ ου και τα 2 παραπανω κελια με 0 για να μπορεσει να σταματησει στον 1ο γυρο)

 

2)Με μια if εξεταζω αν εχω περιττο ή αρτιο αριθμο ΖΩΝΤΑΝΩΝ παιχτων.Αν ειναι περιττος ο τελευταιος ΠΑΝΤΑ οταν τελειωνει ο γυρος εχει το μαχαιρι.Κραταω τον τελευταιο,μετακινω ολους μια θεση μπροστα στον πινακα και βαζω τον τελευταιο πρωτο επειδη εχει το μαχαιρι και στον δευτερο γυρο σκοτωνει πρωτος.Μετα ταξινομω τον πινακα ως εξης: μετακινω με ταξινομηση ολα τα μηδεν στο τελος και κραταω τους αριθμους των παιχτων

π.χ. 10305 --> 51030 -->51300

 

Αν ειναι αρτιος ο αριθμος των παιχτων το μαχαιρι γυριζει στον πρωτο οταν τελειωσει ο γυρος (προσοχη! στον πρωτο του συγγεκριμενου γυρου αν αριθμος αρτιος).Αρα κανω απλα μια ταξινομηση και μετακινω τα μηδεν στο τελος.

 

3)Ολα αυτα ειναι μεσα σε μια μεγαλη do while οπου εκτελειται μεχρι ο αριθμος των παιχτων να γινει 1,δηλαδη να μεινει ενας ζωντανος παιχτης ο οποιος ειναι και ο νικητης του παιχνιδιου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Και με το δικιο σου :P ...

Παρακατω εξηγω τι ακριβως κανει αυτο το "μπαχαλο" :P που εχω γραψει.

 

1)Φτιαχνω πινακα και στα κελια βαζω τον αριθμο του καθε παιχτη.Στον πινακα βαζω 2 παραπανω κελια και τα γεμιζω με 0.Μετα με μια while αναζητω τα κελια που δεν εχουν 0 και τους γραφω μεσα 0 αν δεν εχουν.Στο τελος ο μετρητης αυξανει κατα 2 και ο αριθμος των παιχτων μειωνεται κατα 1 (για καθε επαναληψη). Η επαναληψη σταματαει οταν συναντησει μηδεν σε καποιο κελι (εξ ου και τα 2 παραπανω κελια με 0 για να μπορεσει να σταματησει στον 1ο γυρο)

...

 

Δεν διάβασα παρακάτω, δηλαδή γεμίζεις τον πίνακα κι αμέσως μετά τον ξανα-μηδενίζεις;

 

EDIT:

 

Μάλλον κάτι άλλο εννοείς... τι ακριβώς προσπαθείς να πετύχεις με αυτό το συγκεκριμένο loop?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ωπ! sorry,δε διευκρινισα σωστα τι κανω.

Αρχικα στη main διαβαζω τον αριθμο των παιχτων.

 

>int main(){
   
   int p;
   
   printf("How many players are going to play?: ");
   scanf ("%d",&p);
  
   Game(p);  
   
   system("pause");
   return 0;
   } 

 

Επειτα καλω την Game και στελνω τον αριθμο εκει και οριζω εναν πινακα με ν+2 θεσεις(οπου ν αριθμος παιχτων).Εκει γεμιζω τον πινακα με τον αριθμο καθε παικτη και στα δυα παραπανω κελια βαζω 0.

 

>void Game(int p){
int t,i,q,e,temp1,temp2,j,k,z,Num[p+2];



for (i=0;i<p;i++){
       Num[i] = i+1;
       }
       Num[p]=0;
       Num[p+1]=0; 

 

Παρακατω,στη while,ελεγχω αν πχ. ο 1ος ειναι ζωντανος και βαζω 0 στο δευτερο.Αυξανω το μετρητη κατα 2. κ.ο.κ. μεχρι να συναντησει 0.Τοτε σταματαει η επαναληψη.Αυτος ειναι και ο λογος που εβαλα 2 παραπανω κελια με 0 στον πινακα για να μπορεσει να σταματησει στον πρωτο "γυρο" η while.

 

>       t=0;
e=p ;
    while (Num[t] != 0){  
         
          Num[t+1]=0;
          t+=2;
          e--;
          }   

 

EDIT:Καλυτερα ετσι :-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είναι πολύ πιο εύκολο να εντοπίζεις bugs όταν ο κώδικάς σου είναι καλογραμμένος και χρησιμοποιείς ονόματα μεταβλητών που βγάζουν νόημα ανά πάσα στιγμή...

 

 

 

>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void Game( int n )
{
/*** ORIGINAL
int t, q, e, j, k, z;
***/
int i=0, j=0, nremain=n, last=0;
int order[ n+2 ] = {0};			// pinakas n+2 ayjontwn arithmwn
					// arxikopoihmenos me mhdenikes times

// gemisma stoixeiwn pinaka me ayjontes arithmoys (oi 2 teleytaioi paramenoyn 0)
for (i=0; i < n-2; i++)
	order[i] = i+1;

do {
	// mhdenismos epomenwn gia opoia stoixeia den einai hdh mhdenismena
	for (i=0, nremain=n; order[i] != 0; nremain--, i += 2)
		order[ i+1 ] = 0;
/*** ORIGINAL
	t = 0;
	e = n ;
	while ( order[ t ] != 0 ) {
		order[ t+1 ] = 0;
		t += 2;
		e--;
	}  
***/
	// apemeine perittos arithmos paixton ?
	if ( nremain % 2 != 0 )
	{
		// kratao ton teleutaio epeidh exei to maxairi
		last = order[ nremain-1 ];

		// metakino olous mia thesi mprosta
		/*** 	gia tetoies metakinhseis, anti gia loop protimame thn:
			memmove()
		***/
		for ( i = n-2; i >= 1; i-- )
			order[i + 1] = order[ i ];	

		// kai vazo ton teleutaio proto epeidh o teleutaios exei to
		// maxairi kai tha ksekinisei protos ston epomeno gyro - kyklo
		order[ 0 ] = last;

		for (i=1; i < n; i++)
		{
			if ( order[ i-1 ] == 0 ) {
				int temp = order[ i-1 ];
				order[ i-1 ] = order[ i ];
				order[ i ] = temp;
			}            	
		}
	}

	// apemeine artios arithmos paixton ?
	else
	{
		// Otan to n einai artios panta o protos exei to maxairi
		// opote taksinomo ton pinaka apo tin 2h thesh kai meta
		// oste na ksekinisei protos autos pou exei to maxairi
		// ston epomeno gyro - kyklo 

		for ( j=2; j < n; j++ )
		{
			/*** AYTO TO i TI EINAI???? ***/
			if ( order[ i-1 ] == 0) {		
				int temp = order[ j-1 ];      	
				order[ j-1 ] = order[ j ];
				order[ j ] = temp;
			}
		}
	}

} while ( nremain != 1 );          	

printf( "%d\n", order[0] );
                                           	
}
  
// ---------------------------------------------------------------------------
int main( void )
{
int n = 0;

printf("How many prisoners?: ");
scanf ("%d", &n);
  
Game( n );

system("pause");
return 0;
}

 

 

 

Δεν προσπάθησα να αναλύσω τη λογική σου, απλά σουλούπωσα λίγο τον κώδικα τόσο σε στοίχιση όσο και σε ονόματα μεταβλητών με την ελπίδα πως ίσως σε βοηθήσει να εντοπίσεις τα όποια λάθη σου... έχω βάλει και κάτι δικά μου σχολια, με /*** ***/ αντί για // που είναι τα δικά σου. Δεν ξέρω βέβαια αν αντιστοιχούν επακριβώς σε αυτό που κάνει ο κώδικάς σου, γιατί όπως σου είπα δε ασχολήθηκα με τη λογική του (ακόμα κια σωστός να είναι πάντως είναι τρομακτικά inefficient... δραματικά αργός δηλαδή! )

 

ΥΓ. Κατά τη γνώμη μου, το readability του κώδικα θα έπρεπε να βαθμολογείται εξίσου με την αποτελεσματικότητά του! Στη C τα περιττά κενά διαγράφονται έτσι κι αλλιώς αυτόματα πριν ξεκινήσει το compilation, οπότε η αχρείαστη συμπύκνωση του κώδικα το μόνο που "καταφέρνει" είναι να μη μπορεί να διαβαστεί και να συντηρηθεί, ακόμα κι από τον ίδιο που τον έγραψε :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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