No entiendo que esta mal(en C)

Iniciado por oxi12pek, 2 Noviembre 2012, 15:52 PM

0 Miembros y 1 Visitante están viendo este tema.

oxi12pek

Hola a todos!!! Soy nuevo en este foro y lo que mayormente me a impulsado a hacerme parte de el es la frustracion cuando no se porque el programa que e creado no funciona como querria. En este caso e creado este programa que lee dos palabras y comprueba si son o no anagramas. Todo va como la seda hasta que llega el momento donde la funcion equal_array devuelve true o false. Ayuda por favor. Frustraccion... :huh: . Aqui os dejo el programa copiado tal y como lo tengo:

#include<stdio.h>
#include<stdbool.h>
#define N 26


   
bool equal_array(int counts1[N],int counts2[N])
  {
    int i,x=0;
    printf("Contador final: ");
    for(i=0;i<N;i++){
      counts1-=counts2;
      printf("%d ",counts1);
    }
    printf("\n");
    for(i=0;i<N;i++){
      if(counts1!=0){
   x++;}
    }
    printf("X: %d",x);
    printf("\n");
    if(x=0) return true;
    if(x>0)return false;
  }

int main(void)
{
  char x;
  int a[N],b[N];
  int i,j;
  printf("Escribe dos palabras y sabras si son anagramas on no\n");
 
  //ARRAYS A CERO//
  for(i=0;i<N;i++){
    a=0;
    b=0;
  }
  //LECTURA DE LA PRIMERA PALABRA//
  printf("Escribe la primera palabra: ");
  for(i=0;i<N;i++){
    scanf("%c",&x);
    if((x>='A')&&(x<='Z'))
      a[x-65]++;
    if((x>='a')&&(x<='z'))
      a[x-97]++;
    if(x=='\n') break;
  }
 
  //COMPROBACION LECTURA DE LA PRIMERA PALABRA//
  printf("Contador de la primera palabra: ");
  for(i=0;i<N;i++)
    printf("%d ",a);
  printf("\n");
  read_word(a);

  //LECTURA DE LA SEGUNDA PALABRA//
  printf("Escribe la segunda palabra: ");
  for(i=0;i<N;i++){
    scanf("%c",&x);
    if((x>='A')&&(x<='Z'))
      b[x-65]++;
    if((x>='a')&&(x<='z'))
      b[x-97]++;
    if(x=='\n') break;
  }
  //COMPROBACION LECTURA DE LA SEGUNDA PALABRA//
  printf("Contador de la segunda palabra: ");
  for(i=0;i<N;i++)
    printf("%d ",b);
  printf("\n");

  //FINAL:COMPROBACION DE SI ES O NO ANAGRAMA//
  printf("
  if(equal_array(a,b)==true)
    printf("Las palabras son anagramas\n");
  else
    printf("Las palabras no son anagramas\n");

}
Algun dia lo sere...

$Edu$

Que error te da?

//FINAL:COMPROBACION DE SI ES O NO ANAGRAMA//
  printf("

Eso no esta incompleto?

rir3760

#2
Otro error se encuentra en la función "equal_array":
if(x=0) return true;
if(x>0)return false;

Utilizas el operador de asignación "=" cuando debería ser el de comparación "==", debido a ello el valor de retorno de la función es "no definido".

Edito:

Considerando lo que hace la funcion "equal_array" su codigo es excesivamente largo, ella se puede reducir a:
bool equal_array(int a[],int b[])
{
   int i;
   
   for (i = 0; i < N && a[i] == b[i]; i++)
      ;
   
   return i == N;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

oxi12pek

UI ese printf se me a colado.Lo siento. En cuanto a la funcion equal_array podrias explicar un poco tu version, es que no lo veo muy claro.
Muchas gracias, ya funciona. Como se nota que soy un misero nobato...
Soys unos maquinas gracias!!!
Algun dia lo sere...

Blaster

Aqui tienes uno mio:

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

int anagrama(char cad[], int j) {
   char str1[100];
   int k,l;
   l=0;
   for(k=0; k<strlen(cad); k++)
      if (k!=j) {
         str1[l] = cad[k];
         l++;
      }
   str1[strlen(cad)-1] = '\0';
   strcpy (cad,str1);
   return 0;
}
int main(){
 char cadena1[100], cadena2[100], letra;
 int i,j;
 
 printf("Introduzca las dos cadenas: ");
 scanf("%s" "%s" ,cadena1, cadena2);
 
 if (strlen(cadena1) != strlen(cadena2))
    printf("Las cadenas no son anagramas\n");
 else
 {
      for(i=0; i<strlen(cadena1); i++)
      {
          for (j=0; j < strlen(cadena2); j++) {
              if (cadena1[i] == cadena2[j]) {
                 anagrama(cadena2,j);                  
                 break; }
          }
      }
      if(strlen(cadena2)==0)
        printf("Las cadenas son anagramas\n");
      else
        printf("Las cadenas no son anagramas\n");
 }
 return 0;
}


Espero te sirva  ;)

oxi12pek

Es una buena manera de conseguir el mismo resultado. En mi caso se me especificaba de que manera hacerlo por lo tanto no podia utilizar la libreria de string,etc. Pero muchisimas gracias de todos modos porque me a servido para entender otras cosas.
Gracias a todos por tomaros un tiempo en responder!!!
Saludos
Algun dia lo sere...

oxi12pek

Oye y aqui en los punteros que ocurre. Haciendo indireccion estoy asignando todos los valores del array sumados a x no???
void avg_sum(double a[],int n,double *avg, double *sum)
  {
  int i;
  for(i=0;i<n;i++)
    *sum+=a;
  *avg=(*sum/n);
  }
int main(void)
{
  double A[]={1,2,3,4,5,6.6,7.7,88.8,1,4},x,y;
  int j;

  avg_sum(A,j,&y,&x);
  printf("Suma total del array: %f\n",x);
  printf("Promedio del array: %f\n",y);
}
Algun dia lo sere...

oxi12pek

LO SIENTOOOOO. AHORA MISMO ME HE DADO CUENTA DE QUE NO HE INICIALIZADO J.
LO SIENTO DE NUEVO!!
Algun dia lo sere...