Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

HEEEEELP

Iniciado por juguefre, Mayo 10, 2018, 04:43:12 AM

Tema anterior - Siguiente tema
Mayo 10, 2018, 04:43:12 AM Ultima modificación: Mayo 11, 2018, 12:06:50 AM por BAMF
Ojala @pioj no me considere merecedor de un ban por este post.....
 
Bueno esta sección es offtopic....así que aquí va mi problema, estoy aprendiendo C (SI C, no C# ni C++) y tengo que comprobar la edad y el sexo de una persona como parte de un ejercicio y no logro dar con la forma correcta (el programa se crashea justo después de ingresar los datos).


esta es la parte donde ya no se que hacer:
 


 
 

   if ((edad>17) && (strcmp(sexo, "masculino")==0) )    {
            
        printf ("%s", nombre);
        printf ("  es masculino");
}

 
El problema esta especificamente en la parte en rojo despues del if, ya se como comprobar cada una por separado pero ni idea de como comprobar las 2 y si ambas son ciertas pues imprimir la respuesta en pantalla.


Gracias y me avisan si esta prohibido preguntar cosas de C o cosas no relacionadas a unity.

Mayo 10, 2018, 05:17:08 AM #1 Ultima modificación: Mayo 10, 2018, 05:18:22 AM por lightbug
sexo es un string literal , por ej le pasas "masculino" como parámetro o es una string propiamente dicha (un arreglo char con algun 0 en algun lugar, el final de la string) ? en donde tenés metido eso? en una función?
 
vamos a aprovechar antes de que pioj te de ban jaja

Mayo 10, 2018, 05:45:43 AM #2 Ultima modificación: Mayo 11, 2018, 12:07:16 AM por BAMF
te pongo todo el codigo del ejercicio:
 

///////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
int main (){
    
    char nombre[30],sexo[20]; 
    int edad;
    
    printf ("digite el nombre: ");
    gets (nombre);                    
    
    printf ("digite el sexo: ");
    gets (sexo);
    
    printf ("digite la edad: ");
    scanf ("%i",edad);
    
    
    if ((edad>17) && (strcmp(sexo, "masculino")==0) )    {
            
        printf ("%s", nombre);
        printf (" es masculino");
    
    }
    
    else {
        printf ("%s", nombre);
        printf (" NO es masculino");
    }
        
    return 0;
    
}
//////////////////////////////////////////////////

 
Al ejecutar me pide el nombre, el sexo, la edad y justo despues de eso se crashea.
 
Si, hagamos desorden mientras Pioj no esta.

Mayo 10, 2018, 06:08:15 AM #3 Ultima modificación: Mayo 10, 2018, 06:10:04 AM por lightbug
en la linea
 
scanf ("%i",&edad);
 
le tenés que poner la direccion, de los warnings seguramente tengas que
 
%i espera un int* cuando le estas pasando el valor int
 
 
 
Como edad seguramente esté en cero, le estabas pasando un Null supongo o una dirección incorrecta/reservada

AAAARGH es ahí @lightbug
 
 
 
scanf ("%i",edad);
 
le falta el &
 
con ponerlo como me indicaste
 
scanf ("%i",&edad);
 
ahora todo funciona.......estaba seguro que habia revisado y no me faltaba nada.

Bueno mil gracias Y ahora si que se venga ese ban. 

Jaja de nada
 
el ban habrá valido la pena
 
Saludos

Mayo 10, 2018, 03:26:20 PM #6 Ultima modificación: Mayo 11, 2018, 12:08:58 AM por BAMF
para recoger un int con scanf no era %d ???
 
scanf (%d, &edad);
 
???
 
el caracter ampersand se utiliza para pasar por referencia, sino la variable edad sera pasado como dato, y si la modificas no se guardara el nuevo valor en la variable, porque es una variavle volatil que se destruye al terminar las operaciones de la funcion en la que la usas... para que la "guarde" tiene que ser como referencia
 
ej: tienes definidas tres variable
 

int a = 1;
int b = 2;
int resultado = 0;

 
 
 
 
 
pasando referencia de la variable resultado:
 

int main () {
   suma (a, b, &resultado);
   return 0;
}

 
 
 
 
 
el tercer valor (result) va con asterisco para decir que es un puntero (apunta a una direccion de memoria, en este caso a la variable que le pasemos por regerencia)
 
 
 

void suma (int val1, int val2, int *result) { 
*result = val1 + val2;
}

 
es "void" porque no devuelve valor, ella misma se encarga de alnacenar el valor en la variable que le hayas pasado como referencia...
 
 
 
esto mismo ejemplo de suma se puede hacer de varias formas... sin utilizar punteros... porejemplo asi:
 

int main() {
   resultado = suma(a, b)
}
int suma (int val1, int val2) {
   return val1 + val2;
}

 
 
 
pero lo suyo es aprender bien a usarlos.... saber cuando hay que pasar por referencia y cuando por valor...

Mayo 10, 2018, 10:40:41 PM #7 Ultima modificación: Mayo 10, 2018, 10:46:55 PM por lightbug
Cita de: Igor date=1525958780el caracter ampersand se utiliza para pasar por referencia, sino la variable edad sera pasado como dato, y si la modificas no se guardara el nuevo valor en la variable, porque es una variavle volatil que se destruye al terminar las operaciones de la funcion en la que la usas... para que la "guarde" tiene que ser como referencia
   


en los dos casos (por valor y por "referencia" entre comillas, porque las referencias aparecen creo que en C++) todo se crea y destruye en el stack, pasa que el argumento es un int*, entonces crea un puntero (que apunta a donde vos le pasas, el &edad por ej) luego hace todo modificando al oriyinal, y cuando termina ese puntero deja de existir, pero es uno nuevo cada vez, al igual que pasaba con valor (si le pasabas edad por ej). Esto lo podés ver mejor si tenés varias funciones encastradas cada una con un argumento int* entonces dentro de cada una imprimis el contenido y direccion del puntero.
 

#include<stdio.h>
 void func1(int* ptr);
 void func2(int* ptr);
 void func3(int* ptr);
int main (){
    int var = 24;
    printf("-----------\Main , value = %i\n" , var);
printf("Func 1 , address = %i\n" , &var);
    func1(&var);
    return 0;
}
void func1(int* ptr)
{
    printf("-----------\nFunc 1 , prt = %i\n" , ptr);
printf("Func 1 , &prt = %i<----\n" , &ptr);
func2(ptr);
}
void func2(int* ptr)
{
printf("-----------\nFunc 2 , prt = %i\n" , ptr);
printf("Func 2 , &prt = %i<----\n" , &ptr);
func3(ptr);
}
void func3(int* ptr)
{
printf("-----------\nFunc 3 , prt = %i\n" , ptr);
printf("Func 3 , &prt = %i<----\n" , &ptr);
}

 

 
todas apuntan a lo mismo, pero son "distintos" punteros
 
Yo en C es muy raro que devuelva directamente el valor, ya que al realizar alguna operación (sobretodo en MCUs) es muy común devolver el estado de la misma, osea por ej SUCCESS = 0 , FAIL = 1 , NODISK = 2 , EXIST = 8 , etc, entonces terminás usando punteros para casi todo.
 
 

Etiquetas: