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

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


nik324

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

Είναι λίγο νωρίς νομίζω για να ασχοληθεί με debugger!

 

Η getchar() διαβάζει κι επιστρέφει έναν χαρακτήρα από την κύρια είσοδο (πληκτρολόγιο)

 

Η isalpha(ch) επιστρέφει TRUE αν ο χαρακτήρας ch είναι γράμμα.

 

To s = ch; βάζει τον χαρακτήρα ch στην i-οστή θέση του πίνακα s

 

ΥΓ, Στη C ο τύπος δεδομένων char είναι υποσύνολο του τύπου δεδομένων int (οπότε ένας char μπορεί με ασφάλεια να διαχειριστεί ως int)

 

για IDE σε windows καλο ειναι το visual studio γιατι εχει ευχριστο debugger

 

Και το Code::Blocks και η Pelles C (και αρκετά άλλα IDE) έχουν εύχρηστους debuggers ;) Εννοώ, δεν είναι κάτι που αποτελεί προνόμιο του VS.

 

H getchar διαβάζει χαρακτήρες μόνο όταν αυτοί συνοδευονται από το enter σωστά; δηλαδή στο τέλος πρεπει να πατηθεί το εντερ αλλιώς δεν διαβάζωνται από την συνάρτηση...σωστά κατάλαβα;;

 

Εδώ υπάρχει ένα θέμα με τη C. Όλα τα input είναι line-buffered, που σημαίνει πως διαβάζονται μόλις πατήσει ENTER ο χρήστης. Οπότε, η getchar() για παράδειγμα θα διαβάζει μονάχα τον 1ο χαρακτήρα από όσους έχει πληκτρολογήσει ο χρήστης πριν πατήσει το ENTER.

 

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

 

Π.χ. αν έχεις στον κώδικα 2 συνεχόμενα getchar() και πληκτρολογήσεις 2 χαρακτήρες και ENTER, τότε ο 1ος θα διαβαστεί από το 1ο getchar() και ο 2ος από το 2ο... αυτό αποτελεί πρόβλημα. Φαντάσου π.χ. τον παρακάτω κώδικα:

 

>
...
char c;
int n;

c = getchar();
scanf("%d", &n);
...

 

Αν εσύ λοιπόν πληκτρολογήσεις π.χ 7 συνεχόμενους χαρακτήρες και πατήσεις ENTER, o 1ος θα διαβαστεί ως char στο c, και οι υπόλοιποι αν δεν περιέχουν κενό θα περαστούν αυτόματα στη scanf() που θα επιχειρήσει να τους διαβάσει ως int (όλους μαζί) και να τους αναθέσει στο n.

 

Όλα αυτά αποφεύγονται, αν διαβάζεις εξαρχής από μόνος σου όλη τη γραμμή ως ένα string με την π.χ fgets() και κατόπιν διαχειρίζεσαι μόνος σου τα επιμέρους της τμήματα, με συναρτήσεις όπως οι sscanf(), atoi(), atof(), atol(), strtok() κλπ... γκοουγκλαρέ τες ή αναζήτησέ τες στα βιβλία σου.

 

Ένα παράδειγμα που κάνει ότι ο παραπάνω κώδικας χωρίς να υποφέρει από τυχόν έξτρα "σκουπίδια" στην κύρια είσοδο είναι το εξής:

 

>
...
char line[ 1024+1] = {'\0'};
char c;
int n;

if ( fgets(line, 1024+1, stdin) )
sscanf(line, "%c %d", &c, &n);
...

 

Ένα άλλο, παραπλήσιο παράδειγμα είναι...

 

>
...
char line[ 1024+1] = {'\0'};
char c;
int n;

if ( fgets(line, 1024+1, stdin) )
{
c = line[0];
n = atoi( &line[1] );
}
...

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

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

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

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

Πιστεύω ότι κατάλαβα αρκετά καλά αυτα που μου είπες...Δεν μπορώ όμως να καταλάβω που κολλάει η άρνηση != μαζί με το ''\n''...

 

Ευχαριστώ πολύ πάντως

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

while ((ch = getchar()) != '\n')

 

Αρα όλη η παραπάνω εκφραση διαβάζει ενα γραμμα από το πληκτρολόγιο το αποθηκεύει σε μια μεταβλητή τύπου int και στη συνέχεια αν δεν πατηθεί το έντερ ξανά διαβάζει ένα γράμμα κοκ...σωστά;; στο τέλος καταλήγουμε να έχουμε έναν πίνακα από χαρακτήρες

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

Όχι πίνακα χαρακτήρων, μέσα στο ch αποθηκεύεται το κάθε γράμμα, ένα τη φορά σε κάθε επανάληψη του while-loop (μέχρι να πατηθεί ENTER)

 

>
while ( (ch = getchar()) != '\n ') 
putchar( ch );

 

Το παραπάνω θα σου τυπώσει τους χαρακτήρες που διάβασε πριν το ENTER.

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

Αν ένα πρόγραμμα ήθελε να διαβάζει ν λέξεις και να βρίσκει την πιο συχνή λέξη,δλδ αυτή που εμφανίζεται περισσότερες φορές θα μπορούσε να υλοποιηθεί ως εξής:

 

Για αρχή μπαίνουν όλες οι λέξεις σε έναν πίνακα χαρακτήρων N Θέσεων

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

 

Τώρα που ξανα διαβάζω την σκέψη μου μου φαίνεται βλακεία...

Αλλα χωρίς να το θέλω σκεύτομαι όπως όταν εγραφα προγράμματα στην τρίτη Λυκείου με την ΓΛΩΣΣΑ, δεν ξερω αν αυτό πρέπει να γίνεται...

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

Δεν έχουμε κάνει δομές δεδομένων...Η πρώτη σειρά ασκήσεων είναι αυτή...Η άσκηση λέει

Το πρόγραμμα θα διαβάζει από το πληκτρολόγιο έναν αριθμό N και N λέξεις, θα υπολογίζει την λέξη που εμφανίζεται περισσότερες φορές ανάμεσα στις N και θα την

τυπώνει.

 

Δηλαδή να μην κάτσω νε την λύσω έτσι όπως ανέφερα παραπάνω;

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

Δεν ξέρω τι έχετε μάθει και τι όχι. Επίσης δεν ξέρω αν λέγοντας "πίνακα χαρακτήρων" εννοείς "string" (που είναι η σωστή ερμηνεία) ή αν εννοείς "πίνακα από strings" (που είναι αυτό που χρειάζεσαι)

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

Αυτό θα κάνω μόλις τελειώσω μια άλλη.....Μου έπεσαν μαζεμένεις βλέπεις... :) :)

 

εάν έχεις ενα array N έστω int A[N]

τότε εάν A[j] != 0 , j = (j+2) mod N , οπου j o ετοιμοθάνατος αλλιώς μπορείς να αυξάνεις το j κατα 1

αυτά μέσα σε ένα loop που θα κοιτά εάν έχουν πεθάνει όλοι -> πόσοι πέθαναν (i) και πόσοι μένουν (N)

 

code: [Πριν δείς την απάντηση προσπάθησε να το λύσεις μόνος σου]

 

 

>
#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;
}

 

 

 

 

 

δεν λέει όμως ποιος μένει ζωντανόςςς..... pfffff....

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

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

 

Με δομές δεν μπορώ να το λύσω γιατί δεν έχουμε κάνει

Μήπως η άσκηση μπορεί να λύθεί χωρίς πίνακα;;;

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

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

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

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

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

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

Σύνδεση

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

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

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