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

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

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

char c;

scanf("%c",&c);

if(c==' ')

{

printf("Vrika keno");

}

else

{

printf("c den einai keno");

}

Θέλω να ελέγξω αν ο c είναι κενό(space) ή όχι. Αλλά όταν στη scanf δίνω κενό(πατάω space) στο terminal(ubuntu έχω) με πάει μια σειρά κάτω και περιμένει μέχρι εγώ κάτι να δώσω. Όμως εγώ θέλω να δώσω κενό... Πως το κάνω; Και άμα το καταφέρω(δηλαδή βοηθήσει κάποιος) η if είναι σωστή(ελέγχω σωστά άμα c==κενό);

Επεξ/σία από tonybest
Δημοσ.

Σε μένα δουλεύει κανονικά, αν και υποφέρει από το κλασικό θέμα των έξτρα σκουπιδιών στη κύρια είσοδο (το ENTER σε αυτή τη περίπτωση).

 

Όπως και να έχει, αυτά που γράφω στο link είναι ο ενδεδειγμένος τρόπος διαβάσματος της κύριας εισόδου στη C. Εδώ και από το επίσημο FAQ της γλώσσας: http://c-faq.com/stdio/scanfprobs.html.

Δημοσ.

Σε μένα δουλεύει κανονικά, αν και υποφέρει από το κλασικό θέμα των έξτρα σκουπιδιών στη κύρια είσοδο (το ENTER σε αυτή τη περίπτωση).

 

Όπως και να έχει, αυτά που γράφω στο link είναι ο ενδεδειγμένος τρόπος διαβάσματος της κύριας εισόδου στη C. Εδώ και από το επίσημο FAQ της γλώσσας: http://c-faq.com/std...canfprobs.html.

 

 

{

int n,i,j; char str[100]; char final[100]; int count; int z; int countX;

int flag2=1; int flag=0;

 

printf("Give the number of words (or sentences)\nthat you would like to check if they are palindromes: ");

scanf("%d", &n);

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

{

flag=0; flag2=1;

count=0; countX=0;

printf("Give word(or sentence) %d: ", i+1);

scanf("%s" , str);

for (j=0 ; j<strlen(str) ; j++)

{

if(str[j]!=' ')

{

final[count]=str[j];

count++;

}int count;

}

countX=count;

final[count]='\0';

if(count%2==0)

{int y=0;

for(z=0 ; z<count/2 ; z++)

{

if((final[y]==final[countX-1]) && (flag2==1))

{flag=1;

y++; countX--;

}

else

{flag2=0;}

 

}

}

else

{int y=0;

for(z=0 ; z<count/2 ; z++)

{

if((final[y]==final[countX-1]) && flag2==1)

{flag=1;

y++; countX--;

}

else{flag2=0;}

}

}

if((flag==1 && flag2!=0 ) || strlen(str)==1)

{

printf("Input is a palindrome\n");

}

else

{

printf("Input is not a palindrome\n");

}

}

return 0;

}

 

Στη γραμμή 14 είναι το πρόβλημα μου. Καν' το compile και θα τρέξ' το. Του δίνεις μια λέξη ή πρόταση και λέει άμα είναι παλίνδρομο(διαβάζεται και ανάποδα). Άμα δώσεις "maoam" θα πει ότι είναι, άμα του δώσεις 'neveroddoreven" το ίδιο, αλλά άμα δώσεις "never odd or even" θα πει όχι(επειδή θα κρατήσει την πρώτη μόνο λέξη και μετά το space τίποτα). Δηλαδή άμα δώσεις "maoam huifsdhuhsai" θα σου πει ότι είναι διότι θα ελέγξει μόνο το "maoam".

Δημοσ.

Βάζε τον κώδικα μέσα σε [ code ] .. [ /code ] tags (χωρίς τα κενά) γιατί έτσι δεν διαβάζεται!

 

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

 

Η συνάρτηση που θέλεις είναι η: s_ispalindrome( const char *s ); με τον παρακάτω κώδικα:

 

 

 

>
/* -------------------------------------------------------------------------------
* int s_ispalindrome( const char *s )
*
* -------------------------------------------------------------------------------
*/
int s_ispalindrome( const char *s )
{
register char *cp1 = NULL, *cp2 = NULL;

if ( !s || !*s )					/* early exit      	*/
	return 0;

	cp2 = (char *)s + strlen(s) - 1;			/* set cp2 at end of s */
for (cp1=(char *)s; cp1 < cp2 && *cp1 == *cp2; cp1++, cp2--)
	;

return (cp1 >= cp2);
}

 

 

 

Αν θες να δουλεύει αγνοώντας τα κενά ανάμεσα στις λέξεις, μπορείς να την χρησιμοποιήσεις σε συνδυασμό με την s_stripspaces( char *s );

 

Π.χ.:

 

>
int boolean = s_ispalindrome( s_stripspaces( string ) );

Δημοσ.

Βάζε τον κώδικα μέσα σε [ code ] .. [ /code ] tags (χωρίς τα κενά) γιατί έτσι δεν διαβάζεται!

 

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

 

Η συνάρτηση που θέλεις είναι η: s_ispalindrome( const char *s ); με τον παρακάτω κώδικα:

 

 

 

>
/* -------------------------------------------------------------------------------
* int s_ispalindrome( const char *s )
*
* -------------------------------------------------------------------------------
*/
int s_ispalindrome( const char *s )
{
register char *cp1 = NULL, *cp2 = NULL;

if ( !s || !*s )					/* early exit      	*/
	return 0;

	cp2 = (char *)s + strlen(s) - 1;			/* set cp2 at end of s */
for (cp1=(char *)s; cp1 < cp2 && *cp1 == *cp2; cp1++, cp2--)
	;

return (cp1 >= cp2);
}

 

 

 

Αν θες να δουλεύει αγνοώντας τα κενά ανάμεσα στις λέξεις, μπορείς να την χρησιμοποιήσεις σε συνδυασμό με την s_stripspaces( char *s );

 

Π.χ.:

 

>
int boolean = s_ispalindrome( s_stripspaces( string ) );

 

 

Επειδή το έχω ως άσκηση και δεν έχουμε μάθει κάποια από αυτά που λες, υπάρχει άλλος τρόπος, πιο απλός; Αλλά γιατί να μην δέχεται το space ως χαρακτήρα, αφου χαρακτήρας είναι, πρέπει sony και καλά να δώσω κάποιον άλλο.

Δημοσ.

Βάλε τον κώδικά σου μέσα σε [ code ] tags στο προηγούμενο post σου για να μπορέσω να τον διαβάσω, γιατί έτσι θα βγάλω τα μάτια μου (και δεν είμαι σε τέτοια φάση τώρα :P)

Δημοσ.

Βάλε τον κώδικά σου μέσα σε [ code ] tags στο προηγούμενο post σου για να μπορέσω να τον διαβάσω, γιατί έτσι θα βγάλω τα μάτια μου (και δεν είμαι σε τέτοια φάση τώρα :P)

 

 

>
#include <stdio.h>
#include <string.h>
int main(void)
{
int n,i,j; char str[100]; char final[100]; int count; int z; int countX;
int flag2=1; int flag=0;

printf("Give the number of words (or sentences)\nthat you would like to check if they are palindromes: ");
scanf("%d", &n);
for(i=0 ; i<n ; i++)
{
flag=0; flag2=1;
count=0;  countX=0;                                 
printf("Give word(or sentence) %d: ", i+1);
scanf("%s" , str);
for (j=0 ; j<strlen(str) ; j++)
{
	if(str[j]!=' ')
	{
	final[count]=str[j];
	count++;
	}int count;
}
countX=count;
final[count]='\0';
if(count%2==0)		
{int y=0;	
	for(z=0 ; z<count/2 ; z++)
	{ 
		if((final[y]==final[countX-1]) && (flag2==1))
		{flag=1; 
		y++; countX--;			
		}
		else
		{flag2=0;}

	}		
}
else
{int y=0;
	for(z=0 ; z<count/2 ; z++)
	{
		if((final[y]==final[countX-1]) && flag2==1)
		{flag=1;
		y++; countX--;
		}
		else{flag2=0;}
	}	
}
if((flag==1 && flag2!=0 ) || strlen(str)==1)
{
printf("Input is a palindrome\n");		
}
else
{
printf("Input is not a palindrome\n");
}
}
return 0;
}

 

 

 

Δημοσ.

Φίλε tonybest, γίνεται ένας χαμός εκεί μέσα... απορώ πως βγάζεις άκρη κι εσύ ο ίδιος (ακαταλαβίστικα ονόματα μεταβλητών, κυκεώνας από if-else, σχόλια πουθενά, κλπ)

 

Τέσπα, το 1ο σου πρόβλημα είναι η scanf()... σου έχω δώσει ήδη 2 σχετικά links για το πως να διαβάζεις την κύρια είσοδο στη C χωρίς τη scanf() ... στην προκειμένη περίπτωση, το πρόβλημα σου είναι πως η scanf() έτσι όπως την έχεις δεν διαβάζει κενά διαστήματα μέσα στο str (τα απορρίπτει)... βασικά διαβάζει μόνο την 1η λέξη (ένα από τα πολλά "προβλήματα" με τη scanf() )

 

Το 2ο σου πρόβλημά είναι ο αχρείαστα πολύπλοκος αλγόριθμος !

 

Για να βρεις αν ένα string είναι παλινδρομικό ή όχι, αρκεί να βάλεις έναν δείκτη στην αρχή του κι έναν δεύτερο στο τέλος του (αν δεν έχετε μάθει δείκτες, μπορείς να το κάνεις με 2 ακέραιους μετρητές, π.χ. i και j). Κατόπιν αρχίζεις να αυξάνεις τον 1ο και να μειώνεις τον 2ο μέχρι να συναντηθούν ή μέχρι να μην περιέχουν ίδιους χαρακτήρες

 

ΥΓ1. Btw, ο τρέχων κώδικάς σου, το string "aabb" το δίνει εσφαλμένα ως μη-παλινδρομικό.

Δημοσ.

Φίλε tonybest, γίνεται ένας χαμός εκεί μέσα... απορώ πως βγάζεις άκρη κι εσύ ο ίδιος (ακαταλαβίστικα ονόματα μεταβλητών, κυκεώνας από if-else, σχόλια πουθενά, κλπ)

 

Τέσπα, το 1ο σου πρόβλημα είναι η scanf()... σου έχω δώσει ήδη 2 σχετικά links για το πως να διαβάζεις την κύρια είσοδο στη C χωρίς τη scanf() ... στην προκειμένη περίπτωση, το πρόβλημα σου είναι πως η scanf() έτσι όπως την έχεις δεν διαβάζει κενά διαστήματα μέσα στο str (τα απορρίπτει)... βασικά διαβάζει μόνο την 1η λέξη (ένα από τα πολλά "προβλήματα" με τη scanf() )

 

Το 2ο σου πρόβλημά είναι ο αχρείαστα πολύπλοκος αλγόριθμος !

 

Για να βρεις αν ένα string είναι παλινδρομικό ή όχι, αρκεί να βάλεις έναν δείκτη στην αρχή του κι έναν δεύτερο στο τέλος του (αν δεν έχετε μάθει δείκτες, μπορείς να το κάνεις με 2 ακέραιους μετρητές, π.χ. i και j). Κατόπιν αρχίζεις να αυξάνεις τον 1ο και να μειώνεις τον 2ο μέχρι να συναντηθούν ή μέχρι να μην περιέχουν ίδιους χαρακτήρες

 

ΥΓ1. Btw, ο τρέχων κώδικάς σου, το string "aabb" το δίνει εσφαλμένα ως μη-παλινδρομικό.

 

aabb και bbaa διαφέρουν. μήπως ξέρεις τι να κάνω με τη scanf; Μη σε πειράζει ο μακρύς κώδικας μου, αφού σωστός είναι...

Δημοσ.

aabb και bbaa διαφέρουν. μήπως ξέρεις τι να κάνω με τη scanf;

Ουπς, σωστά... μάλλον τα 'παιξα από το πολύ coding :lol:

Για την scanf() σου έχω δώσει links σε προηγούμενο post μου

 

Μη σε πειράζει ο μακρύς κώδικας μου, αφού σωστός είναι...

Το "σωστός" είναι σχετικό, διότι είναι τελείως inefficient ... μπορεί να τρέχει και 1000 φορές πιο αργά από τον νορμάλ αλγόριθμο που σου έγραψα (μόνο και μόνο που υπολογίζεις το strlen(str) μέσα στο 1o for-loop σε κάθε επανάληψη, δηλαδή για κάθε χαρακτήρα του str, καταλαβαίνεις τι γίνεται... αν π.χ. δώσεις λέξη με 15 γράμματα, μόνο & μόνο για να της αφαιρέσεις τα κενά, κάνεις 15 *15 επαναλήψεις !!!!!!!!!!!!!!

Δημοσ.

Ουπς, σωστά... μάλλον τα 'παιξα από το πολύ coding :lol:

Για την scanf() σου έχω δώσει links σε προηγούμενο post μου

 

 

Το "σωστός" είναι σχετικό, διότι είναι τελείως inefficient ... μπορεί να τρέχει και 1000 φορές πιο αργά από τον νορμάλ αλγόριθμο που σου έγραψα (μόνο και μόνο που υπολογίζεις το strlen(str) μέσα στο 1o for-loop σε κάθε επανάληψη, δηλαδή για κάθε χαρακτήρα του str, καταλαβαίνεις τι γίνεται... αν π.χ. δώσεις λέξη με 15 γράμματα, μόνο & μόνο για να της αφαιρέσεις τα κενά, κάνεις 15 *15 επαναλήψεις !!!!!!!!!!!!!!

 

Σε αυτό το σημείο που βρισκόμαστε δε μας πειράζει...

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...