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 - rir3760

#651
Cita de: zerocyberjuanjo en 12 Octubre 2013, 04:12 AMMi duda es si hay manera de regresar a la línea de arriba. Es obvio que podría quitar el "\n" y poner un "\r" para regresarme, pero este sólo fue un ejemplo, estoy programando otra cosa que necesita saltos, pero también regresar líneas antes.
Para colocar el cursor en una fila y columna determinada puedes utilizar una biblioteca de terceros (por ejemplo ncurses) o el API del SO (por ejemplo en MS Windows puedes utilizar SetConsoleCursorPosition).

Un saludo
#652
Cita de: vangodp en 15 Octubre 2013, 23:58 PM\n no es portable??
Es solo para win?
Si es portable o no depende en parte del modo del stream (texto o binario).

En modo texto no hay problema al utilizar '\n' y endl con la única diferencia que el segundo vacía el bufer correspondiente. En modo binario los caracteres se envían tal cual y ambas formas funcionaran correctamente solo si (en la implementación en cuestión) el carácter para indicar el avance de linea es '\n'.

Un saludo
#653
En C una función no puede retornar un array, en su lugar debes declarar la función con dos parámetros, el primero es el array de arrays donde se almacenan los valores a procesar y el segundo el array de tres elementos para la sumatoria de cada columna:

void ufdSumaColumna(int mat[][3], int suma[])
{
   int i;
   int j;

   for (j = 0; j < 3; j++){
      suma[j] = 0;
      for (i = 0; i < 3; i++)
         suma[j] += mat[i][j];
   }
}


Un saludo
#654
Programación C/C++ / Re: Ayuda C++
15 Octubre 2013, 02:37 AM
Cita de: Magorium en 15 Octubre 2013, 02:18 AMpor que nadie enseña c++ como se debe
Si quieres aprender C++ de la forma políticamente correcta no hay mas opción que un buen libro, el objetivo de los foros es otro: resolver dudas particulares.

Cita de: jonicio96 en 15 Octubre 2013, 00:13 AMNumero de ciudades
7
Toneladas de petroleo por ciudad
1
3
8
7
3
2
1

Me dan ese archivo de texto y yo quiero guardar el 7 en una variables y cada tonelada en un arreglo
Tienes que explicar de una forma clara que es lo que debes hacer: agregar esos valores a tu programa conforme lo desarrolles o bien una vez tu programa se ejecute abrir ese archivo y leer los números enteros mediante las funciones de la biblioteca estándar de C++.

Un saludo
#655
Cita de: ivancea96 en 13 Octubre 2013, 16:39 PMhice este código hace un tiempo
Cada una de las tres sentencias:
Código (cpp) [Seleccionar]
c = (i * 5!=165)? c:c+=1;
i = c<3? i:i+=1;
k = (bool)c?k=1:k;

Tiene dos problemas.

El mas importante es la posibilidad, dependiendo de la expresión que controla al operador "?:", de acceder y modificar una variable en dos ocasiones entre puntos de secuencia y eso no es valido (comportamiento no definido).

El otro es el uso forzado del operador "?:" ya que no tiene caso almacenar en una variable el valor de ... esa variable. Es mejor utilizar tres sentencias condicionales "if":
Código (cpp) [Seleccionar]
if (i == 33)
   c++;
if (c >= 3)
   i++;
if (c)
   k = 1;


Espero el comentario se tome como una critica constructiva.

Un saludo
#656
Programación C/C++ / Re: [Ayuda-C] Algo falla...
12 Octubre 2013, 17:13 PM
Lo primero a cambiar en esta declaración:
char lista_instrucciones[NUM_INSTR][10] = {
{"PRINT"},
{"SUM"},
{"EXIT"}
};

Es eliminar las llaves delimitando las cadenas literales ya que no son necesarias, debería ser:
char lista_instrucciones[NUM_INSTR][10] = {
"PRINT",
"SUM",
"EXIT"
};


Cita de: Miky Gonzalez en 12 Octubre 2013, 15:16 PMSe espera que al pasar las variables codigo y codigo2 a la función identificador_cadena, esta imprima en pantalla:

Encontrado PRINT en PRINT
Encontrado EXIT en EXIT
Eso sucede si se realizan dos llamadas a la función y antes de ello la variable "global" "pos" almacena el valor cero:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define saber_letra(ch)  isalpha(ch)
#define NUM_INSTR  3

char lista_instrucciones[NUM_INSTR][10] = {
   "PRINT",
   "SUM",
   "EXIT"
};

int pos;

void identificador_cadena (unsigned char *codigo);

int main (void)
{
   char *codigo = "PRINT BASURA!", *codigo2 = "EXIT TRASH";
   
   pos = 0;
   identificador_cadena (codigo);
   pos = 0;
   identificador_cadena (codigo2);
   
   return EXIT_SUCCESS;
}

void identificador_cadena (unsigned char *codigo)
{
   unsigned short int pos_buffer = 0;
   char *buffer = (char *) malloc (1 * sizeof (char) );
   
   while (saber_letra (codigo[pos]) ) {
      buffer[pos_buffer] = codigo[pos];
      pos++;
      pos_buffer++;
      buffer = (char *) realloc (buffer, (pos_buffer + 1) * sizeof (char) );
   }
   buffer[pos_buffer] = '\0';
   
   for (pos_buffer = 0; pos_buffer < NUM_INSTR; pos_buffer++)
      if (!strcmp (buffer, lista_instrucciones[pos_buffer]) )
         printf ("Encontrado %s en %s\n", lista_instrucciones[pos_buffer], buffer);
         
   free (buffer);
   return;
}


Cita de: Miky Gonzalez en 12 Octubre 2013, 15:16 PM¿Alguien podría determinar el error?, no entiendo porque esto sucede
El problema es que solo publicas un fragmento del programa y con eso no es posible determinar la causa del error. De nuevo verifica el numero de llamadas y el valor de la variable "pos" antes de ellas.

Un saludo
#657
Cita de: niñoAtómico en 12 Octubre 2013, 04:17 AMpero creo que cuando uno abre el IDE pone que va a hacer un programa para MS-DOS, poner un getc() para hacer una pausa me parece medio pelo
Siendo estrictos ningún programa debería terminar con una "pausa" sea cual sea la forma en que esta se realice porque no es parte del programa, peor todavía, casi todos los IDEs (Lcc-win32, Pelles C, Visual C++, Code::Blocks, la nueva versión de Dev-C++, etc.) generan una pausa de forma automática cuando se ejecuta desde ellos una aplicación de consola.

La pregunta "Mi aplicación aparece y desaparece en un instante ..." se origino cuando hace muchos años una cantidad significativa de principiantes en C y C++ utilizaron Dev-C++ y este no genera la [CENSORED] pausa. En lugar de ejecutar el programa como dios manda desde el interprete de comandos se busco la "solución" mas cómoda.

Cita de: niñoAtómico en 12 Octubre 2013, 04:17 AMDepende de lo que uno quiera hacer sirve o no el gets(); hay que saber manejarse con todas las funciones
El problema con gets y scanf("%s" ...) es que son las únicas funciones donde no se puede garantizar su funcionamiento: si la linea en el caso de la primera o la palabra en el caso de la segunda contienen mas caracteres de los que se pueden almacenar en el array el programa revienta. Con otras funciones como fgets o scanf("%Ns" ...) no tenemos de que preocuparnos.

Un saludo
#658
El uso de gets y fflush(stdin) no se recomienda, si apenas estas empezando por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#659
El error principal ya lo indico 0xDani:
Cita de: 0xDani en 10 Octubre 2013, 21:32 PM
Quizá sea porque siguiente_lexema() llama a buscar_caracter(), que a su vez llama a siguiente_lexema()...
Y como en ningún momento se modifica el valor de la variable "global" "pos" ello resulta en una recursion infinita.

----

Aparte de eso se puede mejorar el programa:

* Falta consistencia, por ejemplo la función "buscar_caracter" accede directamente a la variable "global" "codigo" mientras que la función "siguiente_lexema" accede a la misma variable en base a su único parámetro.

* Deberías sustituir tus funciones "saber_letra" y "saber_numero" por "isalpha" e "isdigit" (prototipos en <ctype.h>). Si por alguna razón debes utilizar funciones propias puedes eliminar todos los paréntesis en ellas ya que no son necesarios.

* No generes tus propios mensajes de error si una función de entrada/salida falla, en su lugar relega ese trabajo a la función perror.

* Si abres un archivo en modo texto calcular su numero de caracteres en base a fseek+ftell es problemático en el mejor de los casos ya que al hacerlo obtienes la posición en bytes y esto puede funcionar o no.

Un ejemplo, si tenemos en MS Windows el archivo de texto:
1234
ABCD

Su contenido son dos lineas de texto, los diez caracteres requieren doce bytes (aquí el avance de linea se representa por la secuencia '\r' + '\n').

Si en ese SO ejecutamos el programa:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ENTRADA  "Entrada.txt"

int main(void)
{
   FILE *entrada;
   long num_bytes;
   int num_chars;
   
   if ((entrada = fopen(NOM_ENTRADA, "rt")) == NULL){
      perror(NOM_ENTRADA);
      return EXIT_FAILURE;
   }
   
   fseek(entrada, 0, SEEK_END);
   num_bytes = ftell(entrada);
   
   rewind(entrada);
   for (num_chars = 0; fgetc(entrada) != EOF; num_chars++)
      ;
   fclose(entrada);
   
   printf("numero de caracteres: %d\n", num_chars);
   printf("numero de bytes: %ld\n", num_bytes);
   
   return EXIT_SUCCESS;
}


Su salida es:
numero de caracteres: 10
numero de bytes: 12


En Linux no hay problema.

Un saludo
#660
Debes reservar un bloque de memoria del tamaño adecuado mediante la función malloc, calloc o realloc, leer y almacenar ahí el nombre y finalmente retornar la dirección en memoria de dicho bloque.

Por ejemplo:
#include <stdio.h>
#include <stdlib.h>

char *input_nombre(size_t long_max);

int main(void)
{
   char *nombre;
   
   if ((nombre = input_nombre(256)) != NULL){
      printf("Hola %s\n", nombre);
      free(nombre);
   }
   
   return EXIT_SUCCESS;
}

char *input_nombre(size_t long_max)
{
   char *nombre;
   
   if ((nombre = malloc(long_max + 1)) != NULL){
      printf("Indica el nombre: ");
      fflush(stdout);
      if (fgets(nombre, long_max, stdin) == NULL){
         free(nombre);
         nombre = NULL;
      }else {
         size_t i;
         
         for (i = 0; nombre[i] != '\0' && nombre[i] != '\n'; i++)
            ;
         if (nombre[i] == '\n')
            nombre[i] = '\0';
         else {
            int ch;
           
            while ((ch = getchar()) != EOF && ch != '\n')
               ;
         }
      }
   }

   return nombre;
}


Un saludo