PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

Problema para correr el programa(Guia 7 ej 10) #73

Open WaluiguiVevo opened 2 weeks ago

WaluiguiVevo commented 2 weeks ago

Buenas, Estoy con varios problemas para poder correr este codigo. Pido ayuda por favor.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <ctype.h>
#define BLOCK 10

void agrega(char *v, int *dim)
{
    char n;
    while (n = getchar() != 0)
    {
        if (*dim % BLOCK == 0)
        {
            v = realloc(v, sizeof(char) * (BLOCK + *dim));
        }
        strcpy(v[*dim++], toupper(n));
    }
    v = realloc(v, sizeof(char) * (*dim));
    return;
}

char *nuevo(int *dim)
{
    char *v = NULL;
    agrega(v, &dim);
    return v;
}

void elliberador(char *v, int *dim)
{
    for (int i = 0; i < *dim; i++)
    {
        free(v[i]);
    }
    free(v);
    return;
}

int compara(char v[], int lon, char c)
{
    int flag = 0;
    for (int i = 0; i < lon || flag == 1; i++)
    {
        if (v[i] == c)
        {
            flag++;
        }
    }
    return flag;
}

int laposta(char v[], int longitud)
{
    char c;
    int letras = longitud;
    do
    {
        printf("Ingrese su letra/n");
        c = toupper(getchar());
    } while (strlen(c) == 1);
    int i;
    for (i = 0; i < BLOCK || letras == 0;)
    {
        if (compara(v, longitud, c) == 1)
        {
            letras--;
        }
        else
        {
            i++;
        }
    }
    return (i == 10 ? 0 : 1);
}

void jugar(char *v, int *dim)
{
    int x, longitud, w;
    char n;
    do
    {
        printf("Precione 1 para empezar a jugar, precione culaquier otra tecla para terminar/n");
        n = getchar;
        if (n == "1")
        {
            x = rand() % *dim;
            char l;
            l = strcpy(l, v[x - 1]);
            longitud = strlen(l);
            w = laposta(l, longitud);
        }
        printf("%s /n", w == 1 ? "GANASTE" : "PERDISTE");
    } while (n != "1");
    return;
}

int main(void)
{
    int dim = 0;
    char *v = nuevo(&dim);
    int n;
    if (dim != 0)
    {

        while (n != 0)
        {
            printf("Precione 0 para salir,1 para jugar y 2 para agregar palabras/n");
            do
            {
                n = getchar();
            } while (n == 0 || n == 1 || n == 2);
            if (n == 1)
            {
                jugar(v, &dim);
            }
            else if (n == 2)
            {
                agrega(v, &dim);
            }
        }
        elliberador(v, &dim);
    }
    return 0;
}```
Desde ya muchas gracias
marcelogarberoglio commented 2 weeks ago

¿Qué problemas?

Para empezar, recordemos que una función no puede cambiar una variable que se le pasa por parámetro ya que recibe una copia de la misma, ya sea una variable, int, char o int *. Entonces cuando hacés

char *v = NULL;
agrega(v, &dim);

le estás pasando una copia de v que vale NULL. Cuando la función agrega termine v seguirá valiendo NULL. En todo caso podría ser así:

char * agrega(char *v, int *dim)
{
    char n;
    while ((n = getchar()) != 0)     PRECEDENCIA !!!
    {
        if (*dim % BLOCK == 0)
        {
            v = realloc(v, sizeof(char) * (BLOCK + *dim));
        }
        strcpy(v[(*dim)++], toupper(n));    //  PRECEDENCIA
    }
    v = realloc(v, *dim);    // NO ES NECESARIO MULTIPLICAR POR sizeof(char)
    return v;
}

... 
    char *v = NULL;
    v = agrega(v, &dim);
WaluiguiVevo commented 2 weeks ago

Muchas gracias Marcelo. Me olvide de eso y disculpa que me colgue con mandar los mensaje de error.

marcelogarberoglio commented 2 weeks ago

Revisalo completo porque hay varios errores, por ejemplo

n = getchar; faltan paréntesis if (n == "1") "1" es un vector,. es la dirección donde está el '1'

pero sobre todo no te compliques haciendo el menú, las palabras crealas fijas en un vector. Que no haya un menú de opciones ni que el usuario pueda ingresar palabras nuevas