Llamando una función en C

Aqui esta mi codigo

#include orders_char(int c1, int c2, int c3); void orders_char(int c1, int c2, int c3) { if(c1 < c2) if(c2 < c3) printf("Ordered characters are: %c %c %c", c1, c2, c3); else if(c3 < c2 && c1 < c3) printf("Ordered characters are: %c %c %c", c1, c3, c2); else if(c2 < c1 if(c1 < c3) printf("Ordered characters are: %c %c %c", c2, c1, c3); else if(c3 < c1 && c3  c3) if (c3  c1) printf("Ordered characters are: %c %c %c", c3, c1, c2); else if(c3 > c2 && c2 < c1) printf("Ordered characters are: %c %c %c", c2, c3, c1); return; } int main(void) { char c1, c2 ,c3; int i = 65; printf("Please enter 3 capital letters with no spaces: \n"); scanf("%c%c%c", &c1, &c2, &c3); orders_char(c1, c2, c3); return 0; } 

Pero me salen los errores:

 8.7.c:3: warning: data definition has no type or storage class 8.7.c:6: error: conflicting types for 'orders_char' 8.7.c:3: error: previous declaration of 'orders_char' was here 8.7.c:6: error: conflicting types for 'orders_char' 8.7.c:3: error: previous declaration of 'orders_char' was here 8.7.c: In function `orders_char': 8.7.c:14: error: syntax error before "if" 

Deberías usar { } para tus expresiones if . Ejecuto su código a través del formateador y se muestra claramente que el ” if y ” else if no” no funciona de la manera que usted quiere que funcione.

EDITAR:

  • Tienes muchos casos, solo hay seis posibles clasificaciones para las tres variables
  • usa int para char, mientras que eso no funciona, mejor use char para caracteres.
 void orders_char(int c1, int c2, int c3); 

Porque sin nada, el valor predeterminado es int.

Nos vemos, beco

Editado:

Por cierto, necesitas una llave en línea

 else if(c2 < c1 

Además, usted no está emparejando if's-else's. El más siempre coincidirá con el cercano si. Asi que:

 if(a>b) if(b>c) printf("a>b>c"); else printf("a<=b"); // <<== wrong! This else matches with if(b>c) 

Necesitas poner algunos corchetes:

 if(a>b) { if(b>c) printf("a>b>c"); } else printf("a<=b"); // <<== right! This else matches with if(a>b) 

Cuídate.

Dos errores que puedo ver:

Uno:

 orders_char(int c1, int c2, int c3); 

debiera ser

 void orders_char(int c1, int c2, int c3); 

Si no especifica el tipo de retorno de una función, el comstackdor asume int . Por lo tanto, se queja más tarde cuando ve que la función vuelve void que no puede decidirse.

Dos:

 else if(c2 < c1 

falta de cierre paren.

Un else siempre se enlaza con el anterior más cercano sin emparejar if. La sangría no muestra lo que realmente está sucediendo aquí.

 if (condition) if (condition2) Something; else if (condition3) SomethingElse; else if (condition4) DoMore; 

Es lo que realmente sucede en el código. Para trabajar como pareces querer, deberás escribirlo así:

 if (condition) { if (condition2) Something; else if (condition3) SomethingElse; } else if (condition4) DoMore; 

Justo en la parte superior:

 orders_char(int c1, int c2, int c3); void orders_char(int c1, int c2, int c3) { //... 

Primero declara y luego define una función.

Pero su statement carece de un tipo de retorno (la primera advertencia) y el comstackdor usará por defecto el retorno de int , y como tal es diferente de la definición (el primer error).

En general, los comstackdores de c luego emitirán una cascada de mensajes de error, por lo que debe mirar solo el primero (o quizás dos) cuando lea los mensajes de error.

Por supuesto, no devolverá nada.

No estás cumpliendo la primera condición si:

 if (c1 < c2) { //all your code is here } 

C usa valores ASCII cuando compara caracteres. Un gráfico ASCII decente está aquí:

http://www.elec-intro.com/logic-ascii

Los valores para SAR son 83, 65, 82. Entonces, su primera si es básicamente:

 if (83 < 65) 

Lo que obviamente es falso. Por lo tanto, ninguno de sus impresores se ve afectado y no se genera nada. La forma más rápida de ordenar los números sería hacer una serie de swaps:

 char temp = c1; if(c1 > c2) { temp = c1; c1 = c2; c2 = temp; } if(c2 > c3) { temp = c2; c2 = c3; c3 = temp; } if(c1 > c3) { temp = c1; c1 = c3; c3 = temp; } 

Edición: Debo decir que esta es probablemente la forma más directa que no usa herramientas integradas o de terceros. Obviamente hay algoritmos de clasificación más rápidos que este.

No necesitas el orders_char en la tercera línea. No es un prototipo apropiado (ya que el tipo de retorno se infiere como int) y de todos modos tiene la definición completa de la función antes de main ().

Sin ofender, pero son habilidades básicas de depuración. Primero verifique que los caracteres ingresen como espera, quizás con un printf () antes de la llamada a orders_char (). Segundo, debes usar std :: sort () para lo que estás tratando de hacer.

std :: vector vC; vC.push_back (c1); vC.push_back (c2); vC.push_back (c3); std :: sort (vC.begin (), vc.end ());

O algo similar. Puedes buscar std :: sort () en tu navegador favorito.

Buena suerte.

Implementación mucho más simple:

 #include  #include  void orders_char (int c1, int c2, int c3); int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } void orders_char (int c1, int c2, int c3) { int a[] = {c1, c2, c3}; qsort(a, 3, sizeof(int), compare); printf("Ordered characters are: %c %c %c\n", a[0], a[1], a[2]); } int main (void) { char c1, c2, c3; int i = 65; printf("Please enter 3 capital letters with no spaces: \n"); scanf("%c%c%c", &c1, &c2, &c3); orders_char(c1, c2, c3); return 0; } 

En general, no tiene sentido intentar reconstruir los algoritmos existentes. Mejor aprender cuáles usar de inmediato.

Por supuesto, hay mejores maneras de implementar lo anterior, pero esto es muy simple y rápido.

Parece ser un código bastante complicado para encontrar la secuencia cuando puede simplemente desenrollar una clasificación de burbujas (y, antes de que alguien ataque el uso de la clasificación de burbujas, debe tener en cuenta que es perfectamente aceptable en ciertos casos, como en el caso de que los datos sean ya están en su mayoría ordenados, o cuando el conjunto de datos es pequeño, en esos casos, muy a menudo puede superar a otros tipos):

 #include  void orders_char(int c1, int c2, int c3) { int tmp; // Unrolled bubble sort for three elements. if (c1 > c2) { tmp = c1; c1 = c2; c2 = tmp; } if (c2 > c3) { tmp = c2; c2 = c3; c3 = tmp; } if (c1 > c2) { tmp = c1; c1 = c2; c2 = tmp; } printf("Ordered characters are: %c %c %c\n", c1, c2, c3); } int main (void) { char c1, c2 ,c3; printf("Please enter 3 capital letters with no spaces: \n"); scanf("%c%c%c", &c1, &c2, &c3); orders_char(c1, c2, c3); return 0; } 

La función anterior simplemente mueve los elementos en el orden correcto con el uso juicioso de tres comparaciones y de cero a tres intercambios, y luego los imprime. Puede intercambiarlas dentro de la función ya que solo son variables locales allí y no afectarán lo que se transfirió desde la persona que llamó.

Si comenta la línea de solicitud (el printf en la función main() ) y ejecuta el siguiente script, puede ver que funciona para todas las entradas:

 pax> for i in abc acb bac bca cab cba ; do ...> echo $i | ./sort3 ...> done Ordered characters are: abc Ordered characters are: abc Ordered characters are: abc Ordered characters are: abc Ordered characters are: abc Ordered characters are: abc