2016-12-17 1 views
0

J'essaye actuellement d'écrire une fonction qui va vérifier combien de mots palindroms sont dans une chaîne donnée et retourner ce nombre à main. Mon approche était de vérifier la longueur d'une chaîne et de la copier dans une autre à l'envers, puis de comparer les deux. Tout en vérifiant à chaque fois que j'atteins un espace videString palindrom check

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

int palindrom(char str1[81]); 

int main(){ 

    char str[81]; 
    gets(str); 
    printf("%d pali\n", palindrom(str)); 


} 


int palindrom(char str[81]) { 

    int i, j=0, k = 0, pali_count = 0, length = 0, flag=0; 
    char rev[81], c; 
    for (i = 0; str[i] != '\0'; i++){}//getting the string length 

    while (i >= 0) {//revrsing the string 
     rev[j++] = str[--i]; 
    } 
    rev[j-1] = '\0'; 
    printf("%s", rev); 


    length = j - 2; 
    k = length; 
    j = 0; 
    while (k >= 0) { 
     k--; 
     j++; 
     c = rev[k]; 
     if (rev[k] != str[j]) 
      flag++; 
     if (c == ' ') { 
      if (flag == 0) 
       pali_count++; 
      flag = 0; 
      continue; 
     } 

     return pali_count; 

    } 





    return 0; 

} 
+3

et quelle est la question/problème? – Derlin

+0

ok mais quelle est la question, ou où est le problème –

+0

Je suppose qu'il ne reçoit pas le bon nombre de palindrome. –

Répondre

1

Il y a beaucoup d'erreurs dans votre code. Permettez-moi de vous expliquer un par un:

  • Dans while loop (où vous vérifiez la chaîne inverse avec chaîne en cours) vous revenez pali_count après une itération qui soit toujours égale à zéro.
  • Si votre dernier mot est un mot de palindrome, il ne vous donnera jamais de palindrome parce qu'il n'y a pas d'espace dans votre dernier mot.
  • Et enfin tout votre algorithme est faux. Consultez l'exemple ci-dessous:

    Supposons que, str = « Sabuj »

    après inverser le mot, il sera: « Jubas » = rev

    maintenant si vous vérifiez le dernier caractère avec le premier caractère puis tout char sera le même, d'où il vous donne un mauvais résultat. vous devez vérifier d'abord le caractère avec le premier caractère et non le premier avec le dernier puisque vous avez déjà inversé la chaîne.

    Ici, vous devrez également faire face à un autre problème en cas de phrase comme mahedi sabuj sera vérifié dans jubas ideham ce qui est également faux parce que nous trouvons ici le premier mot avec le deuxième mot et vice versa.

Maintenant, voici la solution:

  • de Split la phrase avec space
  • prendre chaque mot est que palindrome
  • si oui augmenter le nombre

ici est le code:

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

int palindrom(char str1[81]); 

int main(){ 

    char str[81]; 
    gets(str); 

    int result = 0; 

    char *p = strtok(str, " "); // split word by space 

    while(p != NULL) 
    { 
     result += palindrom(p); 
     p = strtok(NULL, " "); 
    } 


    printf("%d pali\n", result); 
} 


int palindrom(char str[81]) 
{ 

    int i, j=0, k = 0, pali_count = 0, length = 0, flag=0; 
    char rev[81], c; 

    for (i = 0; str[i] != '\0'; i++){} //getting the string length 

    while (i >= 0) //revrsing the string 
    { 
     rev[j++] = str[--i]; 
    } 

    rev[j-1] = '\0'; 

    length = j - 2; 
    k = length; 
    j = length; 

    while (k >= 0) 
    { 
     if (str[j] != rev[k]) 
     return 0; 

     k--; 
     j--; 
    } 

    return 1; 
} 

Sample E/S:

Madame mm Sabuj -> 2 pali

Sabuj -> 0 pali

+0

bien je ne peux pas utiliser de chaîne.h fonction libary et je ne sais pas vraiment comment utiliser les pointeurs mais merci beaucoup! –

+0

@GalElmaleh, je mets à jour la réponse avec une explication, vous pouvez vérifier. –

+0

Et à propos de la division du mot, vous pouvez lancer une vérification de boucle si vous avez trouvé un espace puis vérifiez le mot avant l'espace et recommencez à répéter et faire le processus d'espace. [Vous devez ajouter un espace après le dernier caractère de votre chaîne entrée comme 'str = str + '' ' –

0

Ne pas utiliser gets, utilisez fgets à la place.

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

#define STRSIZE 81 

int is_palindrome(char *word); 

int 
main(void) { 
    char str[STRSIZE]; 
    size_t slen; 
    char *word; 
    const char *delim = " "; 
    int ispal = 0; 

    printf("Enter some text: "); 
    if (fgets(str, STRSIZE, stdin) == NULL) { 
     printf("Cannot read text into buffer.\n"); 
     exit(EXIT_FAILURE); 
    } 

    slen = strlen(str); 
    if (slen > 0) { 
     if (str[slen-1] == '\n') { 
      str[slen-1] = '\0'; 
     } else { 
      printf("Too many characters entered.\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    if (!*str) { 
     printf("No text entered.\n"); 
     exit(EXIT_FAILURE); 
    } 

    word = strtok(str, delim); 
    while (word != NULL) { 
     if (is_palindrome(word)) { 
      ispal++; 
     } 
     word = strtok(NULL, delim); 
    } 

    printf("%d palindromic words found.\n", ispal); 
    return 0; 
} 

int 
is_palindrome(char *word) { 
    int start, end; 

    if (!word) { 
     return 0; 
    } 

    if (strlen(word) == 1) { 
     return 1; 
    } 

    start = 0; 
    end = strlen(word) - 1; 
    while (start < end) { 
     if (word[start++] != word[end--]) { 
      return 0; 
     } 
    } 

    return 1; 
} 
0
import java.util.Scanner; 

public class Javatips { 

    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     String x = in.next(); 
     int n = x.length(); 
     boolean isPalindrom = true; 
     for (int i = 0; i < n/2 - 1; i++) { 
      if (x.charAt(i) == x.charAt(n - 1 - i)) { 
       isPalindrom = true; 
      } else { 
       isPalindrom = false; 
      } 
      if (isPalindrom) { 
       System.out.println("the String " + x + " is palindrom"); 
      } else { 
       System.out.println("the String " + x + " is not palindrom"); 
      } 
     } 
    } 
} 
+0

Voici mon code. – Florin