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

#21
Yo cuando estuve estudiando el lenguaje C, vi que se podía pasar parámetros a una función de diferentes formas, están por "valor" y por "referencia", a sí que quise repasar haciendo un pequeño programa que usa la clásica función swap que sirve para cambiar valores a 2 números, me complicó mas el de pasar por referencia, les dejo el código, la función swap1 y swap3 no tuve problemas, mi problema es el swap2, yo he visto que algunos pone el & en los parametros, a mi me acomodaba mas por punteros, pero igual quiero saber de la otra forma, también les dejo lo que me salió de error, uso Netbeans 7.3, compilador cygwin.

#include <stdio.h>

void swap1(int *x, int *y){
   
   int aux = *x;
   *x = *y;
   *y = aux;
   
}

void swap2(int &x, int &y){
   
   int aux = x;
   x = y;
   y = aux;

}

void swap3(int x, int y){
   
   int aux = x;
   x = y;
   y = aux;
   
}

int main(){
   
   int x = 2;
   int y = 3;
   
   printf("El valor de X e Y respectivamente en el main es %i y %i.\n\n",x,y);
   
   swap1(&x,&y);
   printf("El valor de X e Y despues de la funcion swap1 es %i y %i.\n\n",x,y);
   
   swap2(x,y);
   printf("El valor de X e Y despues de la funcion swap2 es %i y %i.\n\n",x,y);
   
   swap3(x,y);
   printf("El valor de X e Y despues de la funcion swap3 es %i y %i.\n\n",x,y);
     
   getchar();
   return 0;
   
}


"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin_4.x-Windows/ejemplo06.exe
make[2]: Entering directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
mkdir -p build/Debug/Cygwin_4.x-Windows
rm -f build/Debug/Cygwin_4.x-Windows/main.o.d
gcc    -c -g -MMD -MP -MF build/Debug/Cygwin_4.x-Windows/main.o.d -o build/Debug/Cygwin_4.x-Windows/main.o main.c
main.c:11:16: error: expected ';', ',' or ')' before '&' token
void swap2(int &x, int &y){
               ^
nbproject/Makefile-Debug.mk:66: recipe for target 'build/Debug/Cygwin_4.x-Windows/main.o' failed
make[2]: Leaving directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
nbproject/Makefile-Debug.mk:59: recipe for target '.build-conf' failed
make[1]: Leaving directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[2]: *** [build/Debug/Cygwin_4.x-Windows/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2, total time: 1s)


Saludos a todos
#22
Cita de: engelx en 21 Enero 2014, 13:13 PM
en pocas palabras quieres hacer el trabajo matemático de la parte de computación, sin hacer la matemática? XD

tu opcion puedes ser evaluar a pepa de ojo cual es su modo... pero tienes que estár MUY claro comos e comportan los Big O, y que significan log(n), 2^n, n.log(n) muy bien... si quieres evitar la matemática, te vas a tener que meter un puñal de comparación con algoritmos y poder decir "hay un doble for no interrumpido , es n2", o "hay un for, y un while interrumpido en caso de encontrar la raíz del sujeto, debe ser un n.log(n)"(este ultimo ejemplo no es para siempre cierto) y cosas de ese estilo...

la matemática es necesaria en este mundo... especialmente si quieres conseguir valores algebraicos...

Parece que no me expresé bien, a lo que quería llegar es que primero quiero empezar con lo más básico, de forma sencilla, obviamente se necesita matemática para esto, pero como dije, quiero empezar con lo más básico que es solo contando el número de instrucciones, pero tengo problemas cuando es con el log, por ahora ya se cuando es O(1), O(n), O(n^2), O(n^3), pero lo que más me complica es cuando tiene que ver con logaritmos y también de este estilo 2^n, no pienso ignorar o alejarme de la matemática, cuando tenga más experiencia me iré a lo difícil :D
#23
Llevo una buena cantidad de tiempo buscando información y ejemplos para lo que quiero investigar que es cálculo del tiempo de ejecución de un algoritmo, sobretodo, lo que más estoy buscando son ejercicios resueltos (escrito en pseudocódigo) ya que yo aprendo más por medio de ejemplos que de teoría y buscando por google encontré solamente muchos sitios donde se abusa de la teoría y casi nada de ejemplos, ando buscando en la notación "O", solamente busco aprender por medio del "conteo de número de instrucciones" y no usando fórmulas matemáticas monstruosas que aveces dan ganas de tirar la computadora por la ventana, eso quiero evitarlo por ahora. He buscado en muchas partes, incluso buscando en otro idioma como en Inglés, pero igual no puedo encontrar ejemplos. También puede ser mucho texto pero evitando complejas fórmulas matemáticas.

En resumen, me gustaría recibir ayudar de expertos y que me recomienden material para poder investigar sobre la complejidad temporal de un algoritmo, usando la notación "Big O", evaluando el peor y mejor caso y solamente consistiendo en contar el numero de instrucciones y evitar a toda costa fórmilas matemáticas monstrousas. Por ejemplo, quiero aprender a identificar cuando el algoritmo es tipo O(log n), O(2^n), O(nlogn), etc.

Les dejo un ejemplo de que tipo de material me estoy refiriendo y ando buscando (lo que he encontrado hasta ahora)

http://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/

http://discrete.gr/complexity/?es

http://latecladeescape.com/t/Qué+es+la+complejidad+de+un+algoritmo

Y lo que trato de evitar a toda costa es este tipo de material

http://www.lcc.uma.es/~av/Libro/CAP1.pdf

Si se fijan y si van al fondo del apunte, hay muchas fórmilas matemáticas, sumatorias, ecuaciones, límites, etc.

Estaría agradecido que me puedan ayudar a buscar material, ya que no encuentro material para dummies xD.

#24
Cita de: rir3760 en 17 Enero 2014, 02:01 AM
Lo primero que debes hacer es cambiar colocar la declaración de la estructura antes de la declaración del array:
struct persona{

   char nombre[30];
   char apellidoP[30];
   char apellidoM[30];
   char rut[20];
   int edad;   

};

struct persona personas[10];


El porque se "salta" la lectura del nombre se debe a que estas intercalando llamadas a gets (no deberías, en su lugar fgets) y scanf, el tema se ha tratado en los foros y solo es cuestión de utilizar el motor de búsqueda.

Para solucionarlo debes eliminar el resto de la linea después de cada llamada a scanf (y antes de una llamada a fgets), por ejemplo la función "menuPrincipal" se debe cambiar a:
void menuPrincipal(void)
{
   int opcion;
   int ch;
   
   puts("::::: MENU PRINCIPAL :::::");
   puts("1.- Ingresar nueva persona");
   puts("2.- Informacion de personas inscritas");
   puts("3.- Salir");
   puts("Digite su opcion: ");

   scanf("%i", &opcion);
   /* Descartamos el resto de la linea */
   while ((ch = getchar()) != EOF && ch != '\n')
      ;
   
   switch(opcion){
   case 1:
      ingresarPersona();
      break;
   case 2:
      desplegarDatos();
      break;
   case 3:
      flag = false;
      break;
   }   
}

El cambio en la función "ingresarPersona" es similar.

El porque no se imprimen los datos correctamente se debe al bucle de la función "desplegarDatos":
void desplegarDatos(void)
{
   int i;
   
   puts("Desplegando datos personales de los registrados:");
   for(i = 0; i < cant; i++){
      printf("\n\nNombre: %s",personas[cant].nombre);
      printf("\nApellido paterno: %s",personas[cant].apellidoP);
      printf("\nApellido materno: %s",personas[cant].apellidoM);
      printf("\nRut: %s",personas[cant].rut);
      printf("\nEdad: %i\n",personas[cant].edad);
   }
}

En el cuerpo de este utilizas "personas[ cant ]" cuando debería ser "personas[ i ]".

Un saludo

Ya me dí cuenta de mi error, y me equivoqué por una tontería T.T,  por esto "personas[cant]" en vez de "personas", es que andaba apurado y tenía que irme a otra parte :O, pero de todas maneras gracias por informarme.

Al final usé la siguiente instruccion "fflush(stdin)" para que no se saltara la lectura del nombre, ¿ que opinas ?
#25
Ahora tengo otra duda, error logico, el programa me compila pero no como lo esperaba.

Lo que hice fue ir mas allá de mi programa anterior, quise hacer un programa con menú incluido, se trata de una registradora de personas en un arreglo de structs, cada struct representa a una persona, pero cuando quiero desplegar por pantalla, sus datos aparecen como si no hubiera sido registrado, además otro error que tengo es que en una parte del programa cuando pregunta el nombre, se salta a la siguiente instrucción y no permite que se registre el nombre, en mi código lo verán, repetí 2 veces la línea de código problema. Otro problema menor es que no me funciona el comando "clrscr" para limpiar la pantalla,

Ahora, pondré mi código y al fondo del post coloqué un link para que puedan ver mi captura de lo que se ve en consola.

#include <stdio.h>
#include <stdbool.h>
#include <windows.h>

struct persona personas[10];
int cant = 0;
bool flag = true;

struct persona{

   char nombre[30];
   char apellidoP[30];
   char apellidoM[30];
   char rut[20];
   int edad;    
     
};

void ingresarPersona(){
   
   printf("\n\nIngrese el nombre de la persona: ");
   gets(personas[cant].nombre); //Aqui es el error.
   gets(personas[cant].nombre);
   
   printf("\nIngrese el apellido paterno: ");
   gets(personas[cant].apellidoP);
   
   printf("\nIngrese el apellido materno: ");
   gets(personas[cant].apellidoM);
   
   printf("\nIngrese el RUT: ");
   gets(personas[cant].rut);
   
   printf("\nIngrese la edad: ");
   scanf("%i",&personas[cant].edad);    
   
   cant++;
   printf("\n\nRegistro realizado exitosamente.\n");
   
}

void desplegarDatos(){
   
   printf("\n\nDesplegando datos personales de los registrados:\n");
   
   int i;
   
   for(i=0; i<cant; i++){
   
       printf("\n\nNombre: %s",personas[cant].nombre);
       printf("\nApellido paterno: %s",personas[cant].apellidoP);
       printf("\nApellido materno: %s",personas[cant].apellidoM);
       printf("\nRut: %s",personas[cant].rut);
       printf("\nEdad: %i\n",personas[cant].edad);      
           
   }
     
}

void menuPrincipal(){
   
   printf("\n::::: MENU PRINCIPAL :::::\n");
   printf("\n1.- Ingresar nueva persona");
   printf("\n2.- Informacion de personas inscritas");
   printf("\n3.- Salir");
   printf("\n\nDigite su opcion: ");
   
   int opcion;
   scanf("%i",&opcion);
   
   
   switch(opcion){
                 
       case 1:
           
            ingresarPersona();
           
            break;
           
       case 2:
           
            desplegarDatos();
           
            break;
           
       case 3:
           
            flag = false;
                 
            break;
           
   }    
   
}

int main(){
   
   while(flag){
               
       //clrscr();
       menuPrincipal();
                   
               
   }
   
   system("PAUSE");
   return 0;    
   
}


http://www.subirimagenes.com/imagen-errorc-8777151.html
#26
Gracias, me pudo funcionar :D
#27
Saludos comunidad, tengo un error muy gordo acerca de los structs en C, resulta que quiero crear personas usando structs en vez de crear una clase (paradojicamente, empecé al revés, es decir, de C++ a C)

La cosa es que cree una estructura que representa a una persona, tiene un nombre, apellido paterno, apellido materno, edad y rut (numero de identificación), la cosa es que en el main quiero crearlos y através de una función es la que imprime por pantalla los valores de cada persona para ahorrar lineas de código, pero no me funciona, me vi obligado a hacerlo en el main y también me sale error, les pongo mi código para que me puedan ayudar porfavor. Estoy usando DevC++. En el fondo del post se encuentra una captura del error.

#include <stdio.h>
#include <windows.h>

struct persona{

    char nombre[20];
    char apellidoP[20];
    char apellidoM[20];
    char rut[10];
    int edad;       
       
}

void desplegarValores(struct persona p){
     
    printf("Nombre: %s\n",p.nombre);
    printf("Apellido paterno: %s\n",p.apellidoP);
    printf("Apellido materno: %s\n",p.apellidoM);
    printf("Rut: %s\n",p.rut);
    printf("Edad: %i\n\n",p.edad);     
     
}

int main(){
   
    struct persona persona1;
    struct persona persona2;
    struct persona persona3;
   
    persona1.nombre = "Rodrigo";
    persona1.apellidoP = "Saavedra";
    persona1.apellidoM = "Pizarro";
    persona1.rut = "ASDF-1";
    persona1.edad = 23;
   
    persona2.nombre = "Jorge";
    persona2.apellidoP = "Muñoz";
    persona2.apellidoM = "Cardenas";
    persona2.rut = "QWERT-1";
    persona2.edad = 27;
   
    persona3.nombre = "Francisco";
    persona3.apellidoP = "Sanchez";
    persona3.apellidoM = "Villagra";
    persona3.rut = "ZXCV-3";
    persona3.edad = 56;
   
    desplegarValores(persona1);
    desplegarValores(persona2);
    desplegarValores(persona3);
   
    printf("Nombre: %s\n",persona1.nombre);
    printf("Apellido paterno: %s\n",persona1.apellidoP);
    printf("Apellido materno: %s\n",persona1.apellidoM);
    printf("Rut: %s\n",persona1.rut);
    printf("Edad: %i\n\n",persona1.edad);
   
    printf("Nombre: %s\n",persona2.nombre);
    printf("Apellido paterno: %s\n",persona2.apellidoP);
    printf("Apellido materno: %s\n",persona2.apellidoM);
    printf("Rut: %s\n",persona2.rut);
    printf("Edad: %i\n\n",persona2.edad);
   
    printf("Nombre: %s\n",persona3.nombre);
    printf("Apellido paterno: %s\n",persona3.apellidoP);
    printf("Apellido materno: %s\n",persona3.apellidoM);
    printf("Rut: %s\n",persona3.rut);
    printf("Edad: %i\n\n",persona3.edad);
   
    system("PAUSE");
    return 0;   
   
}


#28
Este es un problema que ocurre al ingresar por error un caracter no numerico.

Tengo un programa en que desde el main se despliega un menu (dentro de un ciclo infinito), para que el usuario pueda elegir la opcion que necesito, yo decidi usar un switch para ir a los submenus, la cosa es que el switch solo acepta numeros enteros, ademas, dentro del while hay un bloque try/catch, por que decidi implementar una forma de lanzar una excepcion cuando detecte el problema y para que el programa no se detenga. La excepcion se envia a una funcion "indentificarExcepcion", que no es nada mas que imprimir por pantalla el tipo de error , por ejemplo, cuando se ingrese mal en el menu, mandara un 1 y al procesar la excepcion, saldra por pantalla "Error: Ingrese caracteres no numericos".
El problema que mas me complica es que si ingreso una letra, pareciera ser que el ciclo while se vuelve loco e imprime el menu infinitas veces, por ahi lei que es necesario usar el clear para restablecer "cin" y tambien usar el flag cin.fail(), pero no tengo los resultados esperados. Les dejo mi codigo.


Código (cpp) [Seleccionar]


#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "Operaciones.h"

using namespace std;
using namespace operaciones;

void opcion1(){
   
    cout <<"\e[2J";
    cout <<"\n::::: MATRIZ TRASPUESTA :::::\n";   
    continuar();
   
}

void opcion2(){
   
    cout <<"\e[2J";
    cout <<"\n::::: ELIMINAR VALOR :::::\n";     
    continuar();
   
}

void opcion3(){
   
    cout <<"\e[2J";
    cout <<"\n::::: ELIMINAR COLUMNA :::::\n";
    continuar();
   
}

void opcion4(){
   
    cout <<"\e[2J";
    cout <<"\n::::: ELIMINAR MATRIZ :::::\n"; 
    continuar();
   
}

void opcion5(){
   
    cout <<"\e[2J";
    cout <<"\n::::: SUMA ESPECIAL DE UNA MATRIZ :::::\n";
    continuar();
   
}

void opcion6(){
   
    cout <<"\e[2J";
    cout <<"\n::::: AGREGAR VALOR :::::\n";   
    continuar();
   
}

void opcion7(){
   
    cout <<"\e[2J";
    cout <<"\n::::: INGRESAR NUEVA MATRIZ :::::\n";
    continuar();
   
}

void opcion8(){
   
    cout <<"\e[2J";
    cout <<"\n::::: TODAS LAS MATRICES DEL SISTEMA :::::\n";
    continuar();
   
}

int main(int argc, char** argv) {
   
    int opcion;
   
    while(true){
       
        desplegarMenu();
       
        try{
           
            cin >> opcion;
           
            if(cin.fail()){
               
                cin.clear();
                throw 1;
               
            }

            switch(opcion){
               
                case 1:
                   
                    opcion1();
                   
                    break;
                   
                case 2:
                   
                    opcion2();
                   
                    break;
                   
                case 3:
                   
                    opcion3();
                   
                    break;
                   
                case 4:
                   
                    opcion4();
                   
                    break;
                   
                case 5:
                   
                    opcion5();
                   
                    break;
                   
                case 6:
                   
                    opcion6();
                   
                    break;
                   
                case 7:
                   
                    opcion7();
                   
                    break;
                   
                case 8:
                   
                    opcion8();
                   
                    break;
                   
                case 9:
                   
                    salir();
                   
                    break;
            }
           
        }catch(int e){
           
            identificarExcepcion(e);
           
        }
       
       
    }

    return 0;
}

#29
Hola, muchas gracias por el aporte, ya tendré algo con que divertirme en estas vacaciones de verano que ya se acercan :D
#30
Gente, ya pude solucionar mi problema y pude lograr lo que esperaba.