elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: 1 ... 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 [158] 159 160
1571  Programación / Programación C/C++ / Re: Matriz en: 18 Julio 2011, 02:10 am
Lo primero que debes indicar es el lenguaje de programacion que estas utilizando, C o C++.

En el caso de C ...

Debes declarar dos arrays. El primero para almacenar los nombres y el segundo para las calificaciones. Ambos son "arrays de arrays" ya que cada uno de sus elementos es a su vez un array, eso porque en el primer caso se deben almacenar cada uno de los caracteres del nombre y el segundo para las seis calificaciones por alumno.

Un programa base seria asi:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NUM_ALUMNOS        4
  5. #define NUM_NOTAS          6
  6. #define LONG_MAX_NOMBRE  256
  7.  
  8. int main(void)
  9. {
  10.   char nombre[NUM_ALUMNOS][LONG_MAX_NOMBRE];
  11.   double calif[NUM_ALUMNOS][NUM_NOTAS];
  12.  
  13.   /* ... */
  14.  
  15.   return EXIT_SUCCESS;
  16. }

El resto, leer los nombres y calificaciones, te toca a ti (por favor lee las reglas de los foros).

Un saludo
1572  Programación / Programación C/C++ / Re: problema de lenguaje C en: 15 Julio 2011, 17:32 pm
ahora lo que estoy buscando es crear una variable que guarde las ventas para asi sacarle el promedio
Tres detalles a tener en consideración en tu programa:

1) Este solo funcionara en compiladores que soporten la nueva característica "arrays de longitud variable", esto es parte de C99 (el viejo estandar C90 no lo soporta).

2) En C los indices de los arrays inician en 0 y terminan en N-1 donde N es el numero de elementos en el array. Tu estas utilizando 1 a N y eso no es correcto (el elemento de indice N no existe).

3) Para obtener el promedio debes sumar cada uno de los valores en un acumulador y al final dividir entre el numero de elementos (filas por columnas).

El programa con esas y otras correcciones es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int filas;
  7.   int columnas;
  8.   int i;
  9.   int j;
  10.   int total;
  11.  
  12.   printf("Diga el numero de filas: ");
  13.   fflush(stdout);
  14.   scanf ("%d", &filas);
  15.  
  16.   printf("Diga el numero de columnas: ");
  17.   fflush(stdout);
  18.   scanf ("%d", &columnas);
  19.  
  20.   int mat[filas][columnas];
  21.  
  22.   total = 0;
  23.   for (i = 0; i < filas; i++)
  24.      for (j = 0; j < columnas; j++){
  25.         printf("Indica el valor de mat[%d][%d]: ", i, j);
  26.         fflush(stdout);
  27.         scanf("%d", &mat[i][j]);
  28.  
  29.         total += mat[i][j];
  30.      }
  31.  
  32.   printf("Promedio: %.2f\n", (double) total / (filas * columnas));
  33.  
  34.   return EXIT_SUCCESS;
  35. }

Un saludo
1573  Programación / Programación C/C++ / Re: martiz de char doble puntero en: 15 Julio 2011, 00:05 am
la matriz de char creada de la s dos formas, pero me dijeron que esta mal la forma dinamica no se hace asi como esta escrito. se hace con malloc pero no asi coom lo expuce.
Lo primero: en C puedes almacenar el valor de retorno de malloc y para el caso cualquier función que retorne un "void *" en cualquier variable de tipo "puntero a objeto".

Primero debes reservar memoria para el bloque principal que almacenara las direcciones de cada fila. A continuación debes reservar el bloque para cada una de las filas y cuyo tamaño es igual al numero de columnas por el tamaño del objeto almacenado.

Siguiendo el ejemplo que publicas la versión correcta es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int **mat;
  7.   int filas = 5;
  8.   int columnas = 30;
  9.   int i;
  10.  
  11.   /* Reserva del bloque principal */
  12.   mat = malloc(filas * sizeof *mat);
  13.  
  14.   /* Reserva de la memoria para cada fila */
  15.   for (i = 0; i < filas; i++)
  16.      mat[i] = malloc(columnas * sizeof *mat[i]);
  17.  
  18.   /* ... Algun proceso ... */
  19.  
  20.   /* Liberamos la memoria de cada fila */
  21.   for (i = 0; i < filas; i++)
  22.      free(mat[i]);
  23.   /* Liberamos el bloque principal */
  24.   free(mat);
  25.  
  26.   return EXIT_SUCCESS;
  27. }

Un saludo
1574  Programación / Programación C/C++ / Re: ¿Manual para manejar procesos en C? en: 14 Julio 2011, 20:53 pm
En el caso de MS Windows lo primero que se debe revisar es MSDN, la pagina en cuestión es:

Processes and Threads

Un saludo
1575  Programación / Programación C/C++ / Re: Una pregunta de uniones en: 14 Julio 2011, 16:23 pm
la pregunta seria ¿como funciona esta agrupacion de bytes? ¿No debe tomar siempre el tamaño del mas grande?
No necesariamente.

En C y C++ los "agregados" (estructuras y uniones) permiten utilizar su dirección en memoria como la dirección en memoria de su primer campo (estructuras) o cualquiera de ellos (uniones).

Para ello se debe cumplir con los requisitos de alineación. El significado de esta es simple: se almacena el objeto en una dirección múltiplo de su tamaño.


Para explicarlo mejor los requisitos de alineación de tu unión "casa" deben coincidir con los de todos sus campos, estos son:

1) tipo int (campo "direccion").
2) tipo char[34] (campo "nombre", no hay problema con este).
2) tipo double (campo "pisos").


En tu caso la unión debe almacenarse en una dirección que sea múltiplo de 4 (int) y 8 (double), como puedes imaginarte eso condiciona su tamaño (40 es múltiplo de 4 y 8).

Por supuesto hay que recordar que el tamaño de cada uno de los tipos no esta garantizado (depende de la implementación).

Un saludo
1576  Programación / Programación C/C++ / Re: [Ayuda] Error con delete[]... algo extraño... en: 14 Julio 2011, 02:51 am
Comentarios subjetivos sobre la notación húngara se pueden encontrar muchos, por ejemplo en la pagina de Charles Petzold. No solo eso, en libros considerados "argumentos de autoridad" hay lineamientos que abren la puerta a todo tipo de discusiones.

Por ejemplo en la biblia de C++ (el libro "The C++ Programing Language") BS recomienda, entre otras cosas, el uso de fuentes proporcionales (y para alinear el texto eso implica el uso de tabuladores en lugar de espacios).

Sin tratar de echarle mas leña al fuego a la discusión en el sentido de "¿cual es mejor?" un documento interesante es:

Making Wrong Code Look Wrong by Joel Spolsky.

Hay que tomarlo de forma objetiva, mente abierta y cada quien sacara sus propias conclusiones.


----


Un cuestionamiento objetivo en contra del uso de nombres como "__pp_back" es el siguiente.

1) Al utilizar nombres de encabezados terminados con ".h" como "<stdio.h>" el nombre de espacios utilizado es el global.

2) En C (y eso incluye las facilidades de su biblioteca estándar) los nombres con un guion bajo inicial están reservados.

Si bien el riesgo de un conflicto de nombres es bajo seria mejor evitarlo ya sea utilizando los nombres "políticamente correctos" como "<cstdio>" o bien evitando los nombres en la forma ya mencionada.


----


En cuanto al programa de BlackZeroX este se puede mejorar, esto por varias razones. La primera es que la variable "__pp_back" solo se utiliza para almacenar el valor de "__pp_vector" sin que ninguna de ellas sea modificada, por ello esa variable se puede eliminar.

De forma similar a free se puede utilizar delete, no es necesario verificar si se pasa un puntero nulo ya que el comportamiento esta garantizado (no pasa nada). Eso nos lleva a eliminar la ultima sentencia condicional.

A la variable "__new_ptr" se le da un valor inicial de NULL, eso nos lleva a eliminar (por superflua) la rama (y asignación) en:
Código
  1. }else
  2.   __new_ptr = NULL;

Por ultimo un detalle que debo admitir si es subjetivo: al utilizar 0 en lugar de NULL evitamos incluir <cstdio>.

Con esos cambios (mas la nomenclatura al gusto) quedaría así:
Código
  1. #include <cstring>
  2. using std::memcpy;
  3.  
  4. #include <algorithm>
  5. using std::min;
  6.  
  7. void **RedimPreserve(void **buffer, size_t size, size_t new_size)
  8. {
  9.   if (size == new_size)
  10.      return buffer;
  11.  
  12.   void **new_buffer = 0;
  13.   if (new_size > 0) {
  14.      new_buffer = new void *[new_size];
  15.  
  16.      if (size > 0 && buffer != 0)
  17.         memcpy(new_buffer, buffer, min(size, new_size) * sizeof (void*));
  18.   }
  19.  
  20.   delete[] buffer;
  21.  
  22.   return new_buffer;
  23. }
  24.  
  25. int main()
  26. {
  27.   char **msg = NULL;
  28.  
  29.   msg = (char**) RedimPreserve((void**) msg , 00 , 10);
  30.   msg = (char**) RedimPreserve((void**) msg , 10 , 11);
  31.   msg = (char**) RedimPreserve((void**) msg , 11 , 10);
  32.   msg = (char**) RedimPreserve((void**) msg , 10 , 00);
  33.   msg = (char**) RedimPreserve((void**) msg , 00 , 13);
  34.   msg = (char**) RedimPreserve((void**) msg , 13 , 20);
  35.   delete[] msg;
  36.  
  37.   return 0;
  38. }

Un saludo
1577  Programación / Programación C/C++ / Re: Saltar de linea al leer de un fichero en: 13 Julio 2011, 19:46 pm
Para procesar y descartar manualmente el espacio blanco puedes utilizar el manipulador "noskipws", por ejemplo:
Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4. using std::noskipws;
  5.  
  6. #include <fstream>
  7. using std::ifstream;
  8.  
  9. #include <cctype>
  10. using std::isspace;
  11.  
  12. int main()
  13. {
  14.   ifstream entrada("Entrada.txt");
  15.   entrada >> std::noskipws;
  16.  
  17.   bool descartar = false;
  18.   char ch;
  19.   while (entrada >> ch) {
  20.      if (!descartar) {
  21.         if (!isspace(ch) )
  22.            cout << ch;
  23.         else {
  24.            cout << endl;
  25.            descartar = true;
  26.         }
  27.      }
  28.  
  29.      if (ch == '\n')
  30.         descartar = false;
  31.   }
  32.   entrada.close();
  33.  
  34.   return 0;
  35. }


Una mejor opcion como ya indico .:BlackCoder:. es utilizar la funcion miembro "ignore", por ejemplo:
Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <fstream>
  6. using std::ifstream;
  7.  
  8. #include <limits>
  9. using std::numeric_limits;
  10.  
  11. #include <string>
  12. using std::string;
  13.  
  14. int main()
  15. {
  16.   ifstream entrada("Entrada.txt");
  17.   string palabra;
  18.  
  19.   while (entrada >> palabra) {
  20.      cout << palabra << endl;
  21.      entrada.ignore(numeric_limits<int>::max(), '\n');
  22.   }
  23.   entrada.close();
  24.  
  25.   return 0;
  26. }

Un saludo
1578  Programación / Programación C/C++ / Re: HELP ME! en: 12 Julio 2011, 16:53 pm
El programa no va a ejecutarse correctamente debido a las dos variables para las listas de la función principal:
Código
  1. _lista *lista_A;
  2. _lista *lista_B;
No tienen un valor inicial, al no tenerlo inician con un valor no definido.

El error se genera con el primer uso de esas variables, al aplicar indireccion (acceder al objeto apuntado) en la función "iniciaLista"
Código
  1. LISTA->inicio = NULL;
  2. LISTA->fin = NULL;
  3. LISTA->tamano = 0;

En tu programa no necesitas que esas dos variables sean punteros, solo debes declararlas de tipo "struct ListaIdentificar" y pasar su dirección a las funciones que lo requieran mediante el operador "dirección de" (el '&').

Aparte de eso el programa tiene algunas deficiencias como nombres de variables iniciando con el carácter '_' (eso esta reservado), definición de la funcion "main" (deberia ser "int main(void) ..." o bien "int main() ..."), uso de conio (no es necesario), etc.

Por ultimo la función "pertenencia" esta mal implementada, revisa con cuidado que pasa si el valor buscado existe y se encuentra en el ultimo nodo.

El programa con esas y otras correcciones es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct nodo {
  6.   int valor;
  7.   struct nodo *sig;
  8. };
  9.  
  10. struct lista {
  11.   struct nodo *inicio;
  12.   struct nodo *fin;
  13.   int num_elem;
  14. };
  15.  
  16. void inicializar(struct lista *lista);
  17. void insertar(struct lista *lista, int valor);
  18. void imprimir(struct lista lista);
  19. int buscar(struct nodo *p, int valor);
  20.  
  21. int main(void)
  22. {
  23.   struct lista lista;
  24.   int opc;
  25.   int valor;
  26.  
  27.   inicializar(&lista);
  28.  
  29.   do {
  30.      printf("Ingresa valor a insertar en la lista: ");
  31.      fflush (stdout);
  32.      if (scanf("%d", &valor) != 1)
  33.         return EXIT_FAILURE;
  34.  
  35.      if (!buscar(lista.inicio, valor))
  36.         insertar(&lista, valor);
  37.  
  38.      puts("Ingresar otro valor? (1 ==> si)");
  39.      if (scanf("%d", &opc) != 1)
  40.         return EXIT_FAILURE;
  41.   }while (opc == 1);
  42.  
  43.   imprimir(lista);
  44.   /* Falta liberar la memoria utilizada */
  45.  
  46.   return EXIT_SUCCESS;
  47. }
  48.  
  49. void inicializar(struct lista *lista)
  50. {
  51.   lista->inicio = NULL;
  52.   lista->fin = NULL;
  53.   lista->num_elem = 0;
  54. }
  55.  
  56. void insertar(struct lista *lista, int valor)
  57. {
  58.   struct nodo *nuevo;
  59.   struct nodo *p;
  60.  
  61.   nuevo = malloc(sizeof *nuevo);
  62.   nuevo->valor = valor;
  63.   nuevo->sig = NULL;
  64.  
  65.   if (nuevo != NULL){
  66.      if (lista->inicio == NULL){
  67.         lista->inicio = nuevo;
  68.         lista->fin = nuevo;
  69.         lista->num_elem = 1;
  70.      }else {
  71.         for (p = lista->inicio; p->sig != NULL; p = p->sig)
  72.            ;
  73.  
  74.         p->sig = nuevo;
  75.         lista->fin = nuevo;
  76.         lista->num_elem++;
  77.      }
  78.   }else
  79.      exit(EXIT_FAILURE);
  80. }
  81.  
  82. void imprimir(struct lista lista)
  83. {
  84.   struct nodo *p;
  85.  
  86.   printf("Inicio-> ");
  87.   for (p = lista.inicio; p != NULL; p = p->sig)
  88.      printf("%d -> ", p->valor);
  89.   puts("NULL");
  90.  
  91.   printf("Cardinalidad: %d\n", lista.num_elem);
  92. }
  93.  
  94. int buscar(struct nodo *p, int valor)
  95. {
  96.   while (p != NULL && p->valor != valor)
  97.      p = p->sig;
  98.  
  99.   return p != NULL; /* 1 == existe, 0 == no se encuentra */
  100. }

Falta liberar la memoria utilizada por la lista y agregar la segunda, eso te toca a ti.

Un saludo
1579  Programación / Programación C/C++ / Re: Problema Bucle C en: 12 Julio 2011, 02:33 am
Si vas a desarrollar un programa en C debes ajustarte a las facilidades que provee ese lenguaje olvidándote por el momento de las características de ADA y centrándote en el algoritmo, en tu caso este es:
mientras se pueda leer una linea de texto
   procesarla


Eso en C lo puedes implementar utilizando las funciones fopen/fclose para abrir/cerrar el archivo y fgets para leer la linea de texto. Un programa de ejemplo donde el proceso de la linea es simplemente imprimirla en la salida estándar es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define LONG_MAX_LINEA  256
  5. #define NOM_ARCHIVO  "Entrada.txt"
  6.  
  7. int main(void)
  8. {
  9.   FILE *entrada;
  10.   char linea[LONG_MAX_LINEA];
  11.  
  12.   if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL){
  13.      perror(NOM_ARCHIVO);
  14.      return EXIT_FAILURE;
  15.   }
  16.  
  17.   while (fgets(linea, LONG_MAX_LINEA, entrada) != NULL)
  18.      fputs(linea, stdout);
  19.  
  20.   fclose(entrada);
  21.  
  22.   return EXIT_SUCCESS;
  23. }

En tu caso este es mas complicado, hay que conocer si el nombre de cada equipo es una sola palabra (por ejemplo "Barcelona") o bien pueden existir nombres con mas de una palabra (por ejemplo "La Coruña").

Formas de separar la linea hay muchas ya que puede basarse en diferentes funciones como strchr, strpbrk, strtok, etc.

Si la estructura del archivo de datos esta garantizada una forma separando las partes en base a una funcion propia es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LONG_MAX_LINEA  256
  6. #define NOM_ARCHIVO  "Entrada.txt"
  7.  
  8. struct partido {
  9.   char local[LONG_MAX_LINEA];
  10.   char visitante[LONG_MAX_LINEA];
  11.   int goles_loc;
  12.   int goles_vis;
  13. };
  14.  
  15. struct partido extraer(char const linea[]);
  16.  
  17. int main(void)
  18. {
  19.   FILE *entrada;
  20.   char linea[LONG_MAX_LINEA];
  21.   struct partido p;
  22.  
  23.   if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL){
  24.      perror(NOM_ARCHIVO);
  25.      return EXIT_FAILURE;
  26.   }
  27.  
  28.   while (fgets(linea, LONG_MAX_LINEA, entrada) != NULL){
  29.      p = extraer(linea);
  30.  
  31.      printf("Local: %s\n", p.local);
  32.      printf("Visitante: %s\n", p.visitante);
  33.      printf("Resultado: %d - %d\n", p.goles_loc, p.goles_vis);
  34.   }
  35.  
  36.   fclose(entrada);
  37.  
  38.   return EXIT_SUCCESS;
  39. }
  40.  
  41. struct partido extraer(char const linea[])
  42. {
  43.   struct partido p;
  44.   char *a;
  45.   char *b;
  46.  
  47.   /* Obtenemos la posicion de " - " */
  48.   a = strstr(linea, " - ");
  49.   sprintf(p.local, "%.*s", a - linea, linea);
  50.  
  51.   /* Obtenemos la posicion de " : " */
  52.   a += 3;
  53.   b = strstr(a, " : ");
  54.   sprintf(p.visitante, "%.*s", b - a,  a);
  55.  
  56.   /* Los goles los extraemos con sscanf */
  57.   sscanf(b + 3, "%d %d", &p.goles_loc, &p.goles_vis);
  58.  
  59.   return p;
  60. }

Pero si hay mas espacio blanco en las lineas se debe modificar la aproximacion para buscar solo los caracteres separadores ('-' y ':' en tu caso).

Un saludo
1580  Programación / Programación C/C++ / Re: problemas al compilar programa con multiple archivos en: 11 Julio 2011, 00:14 am
En el archivo "misfunciones.h" te falta el punto y coma al final de la declaracion de la funcion "suma":
Código
  1. int suma(int a, int b)

Un saludo
Páginas: 1 ... 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 [158] 159 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines