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

απορία σε αλφαριθμητικά


nikopoul

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

Δημοσ.

γεια σας παιδια ειχα ξαναγραψει αυτο το μηνυμα χθες αλλα μαλλον το εβαλα σε λαθος θεμα γιαυτο το παραθετω εδω, θα ηθελα αν μπορειτε να με βοηθησετε σε μια ασκηση που εχω, η εκφωνηση ειναι :

 

"Για την αποθήκευση κάθε γραμμής εισόδου θα πρέπει να χρησιμοποιείσετε τη συνάρτηση

readline η οποία περιέχεται στον κώδικα pattern.c. Θυμηθείτε ότι ο πίνακας χαρακτήρων

που αποθηκεύει τη γραμμή εισόδου περιέχει το χαρακτήρα αλλαγής γραμμής ‘\n’ και,

φυσικά, το χαρακτήρα ‘\0’. Υποθέτουμε ότι κάθε γραμμή αποτελείται μόνο από γράμματα

(πεζά ή/και κεφαλαία) και σημεία στίξης.

2. Κάθε γραμμή εισόδου ελέγχεται αν είναι παλινδρομική, δηλαδή αν διαβάζεται το ίδιο από

τ’ αριστερά προς τα δεξιά και από τα δεξιά προς τ’ αριστερά. Σε αυτή την περίπτωση το

πρόγραμμά σας θα πρέπει να τυπώνει το μήνυμα “the line is palindromic”. Προσέξτε όμως

ότι το πρόγραμμα θα πρέπει να τυπώνει το παραπάνω μήνυμα όχι μόνο στην περίπτωση

που η είσοδος είναι π.χ., το αλφαριθμητικό “anna” αλλά και στην περίπτωση που η γραμμή

εισόδου είναι “Anna” ή ακόμα και “A man, a plan, a canal–Panama!”. Υλοποιήστε τον έλεγχο

αυτό στη συνάρτηση

int ispalindromic(char s[])

η οποία επιστρέφει ένα αν το κείμενο στον πίνακα χαρακτήρων s είναι παλινδρομικό, μη-

δέν διαφορετικά. Για τη συνάρτηση αυτή θα σας φανούν χρήσιμες οι συναρτήσεις του

αρχείου–επικεφαλίδα ctype.h."

 

ο κωδικας του pattern.c ειναι αυτος

 

#include <stdio.h>

 

#define MAXLINE 1000

 

/* Function prototypes */

 

int readline(char s[], int lim);

int strindex(char s[], char t[]);

 

int main()

{

char line[MAXLINE], pattern[] = "ould";

int found = 0;

 

while (readline(line, MAXLINE) > 0) {

if (strindex(line, pattern) >= 0) {

printf("%s", line);

found++;

}

}

 

return found;

}

 

int readline(char s[], int lim)

{

int c, i = 0;

 

while (--lim > 0 && (c = getchar()) != EOF && c != '\n') s[i++] = c;

if (c == '\n') s[i++] = c;

s = '\0';

 

return i;

}

 

int strindex(char s[], char t[])

{

int i, j, k;

 

for (i = 0; s != '\0'; i++) {

for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++);

if (k > 0 && t[k] == '\0') return i;

}

 

return -1;

}

θα μπορουσε κανεις να μου δωσει ιδεες πως να τη λυσω?? Ειδικα το δευτερο ερωτημα που θελει να κανουμε τον ελεγχο , θα πρεπει να χρησιμοποιησω τιμες απο τον πινακα ASCCI ή να χρησιμοποιήσω την strcmp,η strcmp θεωρει διαφορετικο ενα γραμμα μικρο απο ενα κεφαλαιο ? Ακομα στο πρωτο ερωτημα την readline για να τη χρησιμοποιησω πρεπει να κανω include ολοκληρο το αρχειο ή απλο copy paste?

 

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

Δημοσ.

Σχετικά με την strcmp ρίξε μια ματιά στον ακόλουθο σύνδεσμο.

Η strcmp συγκρίνει τα Strings σύμφωνα με το μέγεθος με βάση τους χαρακτήρες που αποτελείτε το κάθε String. Εάν θελήσεις να χρησιμοποιήσεις την strcmp θα πρέπει να σπάσεις το String σου στην μέση και κατ' επέκταση να το αντιστρέψεις και να κάνεις την σύγκριση. Διαφορετικά μπορείς να τοποθετήσεις το String σου σε έναν πίνακα και να κάνεις το έλεγχο του πρώτου και του τελευταίου και goes on.

Δημοσ.

σε αυτον τον ελεγχο που μου προτηνεις αρκει το == ? Δλδ για παραδειγμα ο ελεγχος if (σ[1]==σ[2]) οπου ο πινακας σ ειναι πινακας αλφαριθμητικων λειτουργει οπως και με τους αριθμους? Αν εχουμε να ελεξουμε πχ χ==Χ το θεωρει ιδιο ή διαφορετικο?

Δημοσ.

Παρόμοια θέματα έχουν τεθεί εδώ πολλές φορές στο παρελθόν.

Θυμάμαι ήδη δυο ή τρία, ψάξε εδώ μέσα και θα βρεις όλο το υλικό να το κάνεις.

 

Αναλυτικά τα βήματα για το δεύτερο ερώτημα (ένας τρόπος) :

α) Βρες μια συνάρτηση που γράφει ένα string καρκινικά.

(Έχουν παρουσιαστεί ένα σωρό τρόποι εδώ στο insomnia παλιότερα - κι' εγώ έχω δώσει.)

β) Πάρε το string που δίνει ο χρήστης και βάλτο σ' ένα άλλο προσωρινό, έστω s1.

γ) Κάνε το s1 να έχει μόνο μικρά ή κεφαλαία για να λυθεί το ζήτημα case-sensitive κατά την σύγκριση.

(Επίσης έχουν παρουσιαστεί τρόποι εδώ. Υπάρχουν και έτοιμες συναρτήσεις όπως η touppers.

δ) Γράψε το s1 καρκινικά με την συνάρτηση που έχεις από το α) και βάλε το σε ένα άλλο προσωρινό string s2.

ε) Kάνε και το s2 μόνον μικρά ή κεφαλαία για να λυθεί και εδώ το ζήτημα case-sensitive.

ζ) Σύγκρινε τα δυο stringς s1 και σ2.

Και γι' αυτό υπάρχει έτοιμη συνάρτηση (strcmp ή κάτι τέτοιο) αν δεν θέλεις να κάνεις δική σου..

 

Στο ερώτημα σου, post#3, όπως βλέπεις από τα γ), ε) υπάρχει διαχωρισμός πεζών κεφαλαίων : το Χ δεν είναι ίδιο με το x.

 

Καλή επιτυχία...

Δημοσ.

Φτιαχνεις δυο αρχεια (name.h name.c)

 

name.h

>

#ifndef NAME_H
#define NAME_H
#include <string>
#include <ctype.h>
#include <stdio.h>
void readline(const char *str);
int ispalind(const char *str);
#endif

βλεπε http://en.wikipedia.org/wiki/Include_guard

 

name.c

>
#include "name.h"

void readline(const char *str)
{
scanf("%[^\n]s",str);
}
int ispalind(const char *str)
{
int f = 0,e = strlen(str)-1 , t = e / 2;
for(; f < t ; f++,e--)
	if(tolower(str[f]) != tolower(str[e]))
		return 0;
return 12341234;
}

 

τελος στη main σου, χρησιμοποιεις τις συναρτησεις readline ispalind που ειναι στο name.h ( βαζεις #include "name.h" και κανεις compile τη main.c και name.c)

Δημοσ.

1) πρώτα από όλα θα πρέπει να δημιουργήσεις ένα νέο string αφαιρώντας από αυτό που ελέγχεις

ότι δεν είναι γράμμα (isalpha) και όλα τα κεφαλαία γράμματα να τα κάνεις πεζά (tolower)

 

Λύσεις

===========

1) strrev,strcmp:αντιστρέφεις το string και ελέγχεις την ισότητα του με το αρχικό

 

2) με for : ελέγχεις το πρώτο με το τελευταίο,το δευτερο με το προτελευταίο ......αν όλα ίσα τότε είναι καρκινικό

 

3) με αναδρομή

Δημοσ.

ευχαριστω παιδια το ελυσα! Αλλα θα ηθελα να ρωτησω στο post#6 τον Ευγενιο στην name.h εκει που κανει include to string γιατι το κανει? Μηπως ειναι ο pointer που αποθηκευσε το αλφαριθμητικο?

ευχαριστω και παλι!!

Δημοσ.

ευχαριστω παιδια το ελυσα! Αλλα θα ηθελα να ρωτησω στο post#6 τον Ευγενιο στην name.h εκει που κανει include to string γιατι το κανει? Μηπως ειναι ο pointer που αποθηκευσε το αλφαριθμητικο?

ευχαριστω και παλι!!

 

Link

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

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

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