Ayuda: programa en lenguaje C

Iniciado por Dayleap, 28 Abril 2016, 18:26 PM

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

Dayleap

Hola buenas, os pido ayuda con este programa. Lo que quiero es ordenar unos caracteres de tal manera que primero se impriman '*' , luego '|' y final mente' _ '. Para eso tiene que  comparar un array predefinido con valor= 1234 , con otro que introducimos por teclado. Si estos dos son iguales el programa para de ejecutarse; sino sigue. Si el valor es correcto ha de escribir ****. Si un numero esta escrito en el array pero esta en una posicion incorrecta | y si no esta en el array una _. Por ejemplo : introducimos 1245 y nos devuelve **|_ , otro ejemplo; introducimos 3524 y devuelve *||_
Muchas gracias!!Y tened paciencia por favor , soy nuevo en programacion.

ADEMAS si no fuera mucho pedir podriais decirme a que se debe este fallo en concreto:

si escribimos cualquier numero mayor de 4 lo da por bueno, cuando deberia de escribir una barra baja ya que en el array solo hay numeros  menores de 4.

#include<stdio.h>
#include<time.h>
#include<ctype.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

int main (){
char cad[5]="1234";
char resp[5];
char resul[5];
char correc[5]="****";
int asteriscos=0, barras=0, bajas=0, intentos=0, controlador=0,i,j,k,q;
  do{
 
 
intentos ++;
printf("Escribe una cadena de 4 numeros + ENTER: ");
scanf("%s", &resp);
for(i=0;i>4;i++){
if(resp[i]<'0'||resp[i]>'9'){
printf("No pueden ser caracteres, tienen que ser numeros");}
else continue;}
if (strlen(resp)!=4 ){//si la cadena escrita es demasiado larga o corta
printf("Error de longitud de cadena ");}




for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){


if (i == j && cad[i]==resp[j]){
asteriscos=asteriscos+1;j==4;}

if(i != j && cad[i]==resp[j]){
barras=barras+1;j==4;}

else {
bajas=bajas+1;j==4;
}
}
}



for(q=0;q<asteriscos;q ++){
resul[q]='*';}
for(q=asteriscos; q<asteriscos+barras; q++){
resul[q]='/';}
for(q=asteriscos+barras; q<4; q++){
resul[q]='_';}
for(k = 0; k<4; k++){
printf("%c", resul[k]);}

printf("\n");

if(strcmp(resul,cad)==0){
intentos==100;}
}while(intentos<100);return 0;}


MOD EDIT: Titulo y etiqueta GeSHi corregidos.

MAFUS

Bueno, vamos con unos pocos fallos, los más fáciles:

Controla las asignaciones porqué lo que haces es mirar igualdad:
donde escribes j==4 e intentos==100
debe haber j=4 e intentos=100

Tienes un fallo en scanf: el nombre de un array ya es un puntero.
donde escribes scanf("%s", &resp)
debes haber scanf("%s", resp)

Para contar el número de asteriscos, barras verticales y barras bajas en cada iteración estos deben empezar a contar a partir de 0. Así después de do{ debe haber
asteriscos=0, barras=0, bajas=0;

Para el problema de lógica: sea cual sea lo que ha ocurrido acabas haciendo que j=4 y por tanto se detiene ese bucle y por tanto siempre comparas cad==resp[0]. Hay que reescribir eso totalmente.

Dayleap

#2
Gracias MAFUS intentare volver a escribirlo desde el principio a ver si corrigo el fallo  muchas gracias por contestar, publicare si soy capaz de corregir algo el codigo o no




Cita de: MAFUS en 28 Abril 2016, 21:36 PM
Bueno, vamos con unos pocos fallos, los más fáciles:

Controla las asignaciones porqué lo que haces es mirar igualdad:
donde escribes j==4 e intentos==100
debe haber j=4 e intentos=100

Tienes un fallo en scanf: el nombre de un array ya es un puntero.
donde escribes scanf("%s", &resp)
debes haber scanf("%s", resp)

Para contar el número de asteriscos, barras verticales y barras bajas en cada iteración estos deben empezar a contar a partir de 0. Así después de do{ debe haber
asteriscos=0, barras=0, bajas=0;

Para el problema de lógica: sea cual sea lo que ha ocurrido acabas haciendo que j=4 y por tanto se detiene ese bucle y por tanto siempre comparas cad==resp[0]. Hay que reescribir eso totalmente.

Bueno, el fallo estaba en donde inicializaba las variables asteriscos, baras y bajas al cambiarlo y pornerlo dentro del do{}while ya funciona correctamente sacando una pequeña cosa que no se como hacer para que pare de ejecutarse el bucle ya que solo para cuando el numero de intentos es igual a 100


MOD EDIT: NO hacer doble post.

MAFUS

Mira si el número de asteriscos en 4. Si es así para el bucle. Puedes ponerlo en la condición del while: intentos<100 && asteriscos!=4

Dayleap

Si , tambien funciona eso que dices. El tema es que tenia un controlador porque tenia que cumplir muchas mas condiciones al final entonces cree la variable tipo int controlador y cuando sea igual a 1 acaba el bucle