Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - K-YreX

#171
Programación C/C++ / Re: Ayuda con arreglo char
4 Noviembre 2020, 18:45 PM
Los problemas que tienes son los siguientes:
  • No inicializas las cadenas por lo que tienen basura y por eso te aparecen caracteres extraños.
    En el ejemplo que te puse solo usé strcat() para que vieras su uso pero si la cadena no está inicializada hay que usar primero strcpy() para copiar el contenido y borrar la posible basura que haya y luego ya strcat().

    int main(){
      char frase[] = "Hola";
      int n = 3;
      char fraseN[strlen(frase) * n + 1]; // Se suma 1 para el caracter final '\0'
      strcpy(fraseN, frase); // Copias el contenido de frase en fraseN eliminando la basura que pudiera tener
      for(int i = 1; i < n; ++i){ // Empiezas el contador en 1 en vez de en 0 para no concatenar el contenido una vez mas
        strcat(fraseN, frase); // Elimina el '\0', concatena la cadena e incluye otro '\0' al final
      }
      printf("%s\n", fraseN); // Resultado: HolaHolaHola
    }

  • En las líneas 72 y 73 no puedes usar strlen() porque esto te devuelve la longitud que tiene la cadena y no tienes ninguna cadena guardada. Lo que necesitas es que te devuelva la capacidad total del array y eso se consigue con sizeof().
  • En la línea 73 tienes que multiplicar por n2, no por n.
  • Las líneas 89-93 son innecesarias pues estás haciendo lo mismo que en las líneas 77-81.
#172
Programación C/C++ / Re: Algoritmo
4 Noviembre 2020, 16:02 PM
Si lo que quieres hacer es para cada dígito d, calcular: d * ((2^posicion) % 11); ya lo estás haciendo en la línea 64...
No sé dónde está el problema... :huh:

Lo que sí veo son varias cosas:
  • Utiliza constantes para guardar los números que aparecen sueltos. Así tu programa será más fácil de modificar y de entender.
  • Los bucles do-while() no los aprovechas. Si metes un exit(), el programa terminará y no te dejará elegir otro número hasta que introduzcas uno válido.

    const int MIN = 0; // lo que sea
    const int MAX = 1000; // lo que sea
    int main(){
      int valido = 1; // variable entera usada como bool (0/1)
      int numero;
      do {
        printf("Introduce un numero entre [%d, %d]: ", MIN, MAX);
        scanf("%d", &numero);
        valido = (numero >= MIN && numero <= MAX); // valdra 1 si es cierto y 0 en caso contrario
        if(!valido){
          printf("El numero no es valido\n");
        }
      } while(!valido);
      //...
    }


  • Las comparaciones se hacen con el operador de comparación ==, no con el operador de asignación =. En los últimos condicionales estás asignando los valores y como son distintos a 0, siempre te dará true esa condición.

    int numero = 10;
    if(numero == 10)  // Si el numero es igual a 10...
      printf("El numero es 10\n"); // ...muestras ese mensaje
    if(numero = 5) // Asignas el valor 5 a numero y como es != 0, es true...
      printf("El numero es 5\n"); // ...muestras ese mensaje tambien
    if(numero = 0) // Asignas el valor 0 a numero y como es == 0, es false...
      printf("El numero es 0\n"); // ... no se muestra este mensaje


    Al final numero valdrá 0 y la SALIDA será:

    El numero es 10
    El numero es 5
#173
Programación General / Re: script & codigo
4 Noviembre 2020, 04:57 AM
Normalmente cuando se habla de script se está haciendo referencia a un fichero que contiene instrucciones para ser interpretadas. En cambio, los "códigos" (o cualquier otro nombre que se utilice) suele hacer referencia a ficheros con instrucciones que van a ser compiladas.

Si estás empezando igual no conoces la diferencia entre los lenguajes compilados e interpretados.
Los lenguajes compilados usan un compilador para convertir el código fuente (código) en otro fichero con lenguaje máquina. Este lenguaje máquina es el que ejecuta el ordenador sin necesidad de tener el código fuente.
Por otro lado, los lenguajes interpretados usan un intérprete que se encarga de traducir a código máquina y ejecutar cada línea del código (script) una por una. Aquí es necesario tener siempre a mano el script pues en ningún momento se genera un fichero con el código máquina.

Algunos scripts bastante utilizados son los .sh (de Linux) o los .bat (de Windows) que suelen usarse para automatizar tareas agrupando varias instrucciones del sistema que quieres que se ejecuten juntas. También tienes lenguajes interpretados muy utilizados como Python cuyos ficheros se suelen denominar scripts.
#174
Programación C/C++ / Re: Cadenas
4 Noviembre 2020, 02:02 AM
A mí me funciona bien el código. Puede ser porque estés introduciendo cadenas demasiado largas o valores inválidos que hacen que queden restos en el buffer. De todas formas te comento algunas mejoras y seguro que si las implementas funciona correctamente:

  • Utiliza constantes para los tamaños.

    const int SIZE_CADENA = 500;
    const int SIZE_PALABRA = 50;

    int main(){
      char cadena[SIZE_CADENA];
      char palabra[SIZE_PALABRA];
      //...
    }


  • Utiliza nombres de variables más descriptivos.

    x -> longitudCadena
    w -> longitudPalabra
    z -> indiceBusqueda


  • La función gets() no debe usarse. Es más seguro utilizar fgets():

    printf("Introduce una cadena: ");
    fgets(cadena, SIZE_CADENA, stdin); // guarda como mucho SIZE_CADENA-1 caracteres porque reserva el ultimo para '\0'


  • La función fflush() está implementada para limpiar el buffer de salida (stdout), no el de entrada (stdin). Tampoco se recomienda usarlo. Además cuando se usa gets()/fgets(), también se guarda el Enter ('\n') al final de la cadena.
    Con el siguiente código puedes limpiar el buffer de entrada y al mismo tiempo eliminar el salto de línea al final de la cadena. Dos pájaros de un tiro (esto debe ir justo después del fgets() anterior):
    * Para usar strlen() hay que importar <string.h>. Esta función devuelve la longitud de la cadena sin contar el '\0' (strlen("hola\0") = 4)

    if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si el ultimo caracter es el Enter, lo eliminamos con '\0'
    else while(getchar() != '\n'); // sino, significa que la cadena no cabia entera y quedan restos en el buffer. Lo limpiamos.


    Después de usar scanf() también quedará un '\n' en el buffer. Lo puedes limpiar de nuevo con el while():

    scanf("%d", &repetir);
    while(getchar() != '\n'); // Limpia todo el buffer de entrada


    Si sigue sin funcionarte comenta qué pruebas estás haciendo o porque sabes que no te está leyendo la segunda cadena.
#175
Programación C/C++ / Re: Trabajo universidad
3 Noviembre 2020, 19:04 PM
Para preguntas que no estén relacionadas las unas con las otras es mejor que abras un nuevo tema y especifiques su contenido en el título para que sea descriptivo.


Todo depende de cómo tengas estructurado el código. Obviamente si utilizas la función exit() el programa finalizará. Puedes hacerlo con un bucle controlado por una condición de validez o si el código se encuentra en otra función, puedes volver a la función que la llamó mediante un return.

Si incluyes tu código aunque sea de forma simplificada (lo necesario para poder visualizar tu problema) será más fácil concretarte una forma de hacerlo.

PD: Para insertar código utiliza las etiquetas de Código GeSHi y selecciona el lenguaje de programación adecuado.
#176
Programación C/C++ / Re: Trabajo universidad
3 Noviembre 2020, 16:01 PM
Si lo que quieres es multiplicar por un conjunto finito de valores {1,2,3,4,5,6,7,8,9,0} y después volver a empezar por el 1 otra vez la mejor manera es utilizar el operador %.

La operación a%b devuelve el resto de dividir a/b y por las reglas de la división: el resto siempre será menor que el divisor. Si haces a%10=b, para cualquier a se cumplirá b < 10.


for(int i = 1; i <= 20; ++i){
  printf("%d ", i % 10);
}


Salida:
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
#177
Programación C/C++ / Re: Cadenas
3 Noviembre 2020, 15:56 PM
http://www.cplusplus.com/reference/cstring/strstr/

Y como te han dicho: si quieres ayuda más concreta coloca tu código entre etiquetas de Código GeSHi.
#178
Cita de: chonazar1 en  3 Noviembre 2020, 02:37 AM
Tengo una duda y es que tengo que hacer una matriz en forma de serpiente donde se lean las filas y columnas y que estos no sean mayores a 20

Recuerda comprobar también que los valores de n y m no sean mayores que 20 pues es un requisito del programa. Para esto tienes que usar un filtro con el bucle do-while():

const int MIN_FILAS = 1;
const int MIN_COLUMNAS = 1;
const int MAX_FILAS = 20;
const int MAX_COLUMNAS = 20;

int main(){
  int filas, columnas;
  do {
    scanf("%d %d", &filas, &columnas);
  } while(filas < MIN_FILAS || filas > MAX_FILAS || columnas < MIN_COLUMNAS || columnas > MAX_COLUMNAS);
  // ...
}
#179
Programación C/C++ / Re: Trabajo universidad
3 Noviembre 2020, 01:40 AM
Si sabes dividir el número en digitos, no tiene mayor complicación.

Supongo que usas un bucle para separar los dígitos. Entonces crea otra variable <suma = 0> fuera del bucle y en cada iteración acumula ahí el resultado del producto.

Te dejo a continuación un pseudocódigo para que te hagas una idea.
(No es código C, solo es un esquema conceptual de tu algoritmo)

PEDIR numero
suma := 0
PARA i := 1 HASTA longitud(numero) HACER
  digito := obtenerDigito(i, numero)
  suma := suma + digito * i
FIN PARA

Ahora solo tienes que implementar el código anterior en lenguaje C.

Si tienes alguna duda es mejor que incluyas tu código para poder ayudarte; además de porque no se hacen tareas, por lo que no vamos a darte el código completo si no aportas nada.
#180
Exactamente, como te dice @Eternal Idol, te falta el separador entre el directorio y el nombre del fichero.

Comprueba tu directorio C: porque si has ejecutado ese programa, habrás creado un directorio datos/ y al mismo nivel (es decir en C:) tendrás los ficheros datossillon(i).