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 - Principios en C

#1
Cita de: rir3760 en  7 Noviembre 2011, 02:21 AM
Te respondo al MP:

Los datos en el programa aparecen desordenados en el programa porque este ... no los ordena. Para ello necesitas de una función mas que ordene los nodos de la lista. En el caso de listas vinculadas lo usual es MergeSort pero si apenas empiezas es mejor la ordenación al insertar cada nodo.

En cuanto a la función que imprima el numero de caracteres antes de uno dado debes descomponer eso también en funciones: una que imprima el resultado y otra que calcule el numero de caracteres antes del buscado.

Y faltan los requisitos de la(s) funcion(es). Sin eso difícil dar una respuesta exacta.

No voy a hacerlo todo. En el caso del calculo de forma recursiva del numero de elementos antes de uno dado ello se puede realizar de esta forma:
struct nodo {
    char valor;
    struct nodo *sig;
};

/* ... */

struct nodo *nodos_antes(struct nodo *p, int *num, char ch);

/* ... */

void imprimir_na(struct nodo *p, char ch)
{
    int num = 0;
   
    if (nodos_antes(p, &num, ch) == NULL)
        puts("El caracter no es parte de la lista");
    else
        printf("Hay %d elementos antes del caracter %c\n", num, ch);
}

struct nodo *nodos_antes(struct nodo *p, int *num, char ch)
{
    if (p == NULL || p->valor == ch)
        return p;
    else {
        ++*num;
        return nodos_antes(p->sig, num, ch);
    }
}

Es una función de soporte "imprimir_na" que imprime el resultado de la otra función recursiva "nodos_antes".

Un saludo

Me pueden ayudar diciendome como mando llamar esta función en el programa...
Ya me he roto la cabeza y no puedo... :-(
#2
Hola...

Bueno después de un tiempo quedo hecho un registro de alumnos...

me faltaron unas cosillas pero lo compense con un histograma para contar el numero de alumnos...

ojala les sirva y supongo esta bien:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 5
#define A 7
#define M 20

void alumnos(char*[N][A]);
void histograma(char*[N][A]);
void clasificacion(char*[N][2]);

main()
{
        int j,i,suma=0;
        char *Todoptr[N][A],Dato1[N][M],Dato2[N][M],Dato3[N][M];
        char *ING[N][2],Dato4[N][M],Dato5[N][M],Dato6[N][M],Dato7[N][M],Dato8[N][M];

printf("Esta es una base de datos para estudiantes de la fac. de ciencias, por favor sigas las reglas\n\n");
       for(i=0;i<N;i++)
       {
              printf("\nDame el nombre del alumno %d\n",i+1);
              scanf("%s",Dato1[i]);
              printf("\nDame el apellido paterno del alumno %d\n",i+1);
              scanf("%s",Dato2[i]);
              printf("\nDame el apellido materno del alumno %d\n",i+1);
              scanf("%s",Dato3[i]);
              printf("\nAhora dame el sexo del alumno %d (solo pon Masculino o Femenino)\n",i+1);
              scanf("%s",Dato4[i]);
              printf("\nDame el numero de cuenta del alumno %d\n",i+1);
              scanf("%s",Dato5[i]);
              printf("\nDame la edad del alumno %d, recuerda que como son alumnos regulares", i+1);
              printf(" estan entre 18 y 22 años de edad (solo pon el numero)\n");
              scanf("%s",Dato6[i]);
              printf("\nDame la carrera del alumno %d (solo pon Actuaria, Matematicas, Fisica, Biologia, Tierra", i+1);
              printf(" o Computacion), segun sea el caso\n");
              scanf("%s",Dato7[i]);
              printf("\nAhora dame el año de ingreso del alumno %d (recuerda que solo te pudiste inscribir",i+1);
              printf(" durante los años 2007, 2008, 2009, 2010 o 2011\n");
              scanf("%s",Dato8[i]);
       }

       for(i=0;i<N;i++)
       {
              ING[i][0]=Dato1[i];
              ING[i][1]=Dato8[i];]*/
       }     
       for(i=0;i<N;i++)
       {
              Todoptr[i][0]=Dato1[i];
              Todoptr[i][1]=Dato2[i];
              Todoptr[i][2]=Dato3[i];
              Todoptr[i][3]=Dato4[i];
              Todoptr[i][4]=Dato5[i];
              Todoptr[i][5]=Dato6[i];
              Todoptr[i][6]=Dato7[i];
       }


       printf("\n\nLa informacion quedo de la sig. manera\n");
       for(i=0;i<N;i++)
       {
            printf("\n");
            for(j=0;j<A;j++)
                   printf("%11s",*(Todoptr[i]+j));
            }
       }

printf("\nClasificación de alumnos por carrera/sexo\n");
alumnos(Todoptr);

printf("\n\nHistograma por edades\n\n");
histograma(Todoptr);

printf("\n\nAhora vamos a ver la siguiente clasificacion ");
clasificacion(ING);

printf("\n");

getch();
}


void alumnos(char *Todoptr[N][A])
{
       char *mascuPtr="Masculino", *femePtr="Femenino", *ActuariaPtr="Actuaria";     
       char *FisicaPtr="Fisica",*MatePtr="Matematicas",*BioPtr="Biologia";
       char *CompuPtr="Computacion",*TierraPtr="Tierra";
       int sumaA=0,actuarios=0,actuarias=0,sumaF=0,fisicos=0,fisicas=0,sumaM=0;
       int matematicos=0,matematicas=0,sumaB=0,biologos=0,biologas=0,sumaC=0;
       int computologos=0,computologas=0,sumaT=0,tierros=0,tierras=0,i;
       
                       
for(i=0;i<N;i++)
{
       if(*ActuariaPtr==*Todoptr[i][6])
       {
              sumaA=sumaA+1;
              if(*femePtr==*Todoptr[i][3])
              actuarias=actuarias+1;
              if(*mascuPtr==*Todoptr[i][3])
              actuarios=actuarios+1;
       }
       
       if(*FisicaPtr==*Todoptr[i][6])
       {
              sumaF=sumaF+1;
              if(*femePtr==*Todoptr[i][3])
              fisicas=fisicas+1;
              if(*mascuPtr==*Todoptr[i][3])
              fisicos=fisicos+1;
       }

       if(*MatePtr==*Todoptr[i][6])
       {
             sumaM=sumaM+1;
             if(*femePtr==*Todoptr[i][3])
             matematicas=matematicas+1;
             if(*mascuPtr==*Todoptr[i][3])
             matematicos=matematicos+1;
       }

       if(*BioPtr==*Todoptr[i][6])
       {
              sumaB=sumaB+1;
              if(*femePtr==*Todoptr[i][3])
              biologas=biologas+1;
              if(*mascuPtr==*Todoptr[i][3])
              biologos=biologos+1;

       if(*CompuPtr==*Todoptr[i][6])
       {
              sumaC=sumaC;
              if(*femePtr==*Todoptr[i][3])
              computologas=computologas+1;
              if(*mascuPtr==*Todoptr[i][3])
              computologos=computologos+1;
       }

       if(*TierraPtr==*Todoptr[i][6])
       {
              sumaT=sumaT;
              if(*femePtr==*Todoptr[i][3])
              tierras=tierras+1;
              if(*mascuPtr==*Todoptr[i][3])
              tierros=tierros+1;
       }
}
                 
printf("\nNumero de personas inscritos en Actuaria: %d\n",sumaA);
       if(actuarias==1)
       {
              printf("Hay solo una actuaria\n\n");
       }
       if(actuarios==1)
       {
              printf("Hay solo un actuario\n\n");
       }
       else
       {
              printf("%d son actuarias y %d son actuarios\n\n",actuarias,actuarios);
       }

printf("\nNumero de personas inscritos en Fisica: %d\n",sumaF);
       if(fisicas==1)
       {
              printf("Hay solo una fisica\n\n");
       if(fisicos==1)
       {
              printf("Hay solo un fisico\n\n");
       }
       else
       {
              printf("%d son fisicas y %d son fisicos\n\n",fisicas,fisicos);
       }

printf("\nNumero de personas inscritos en Matematicas: %d\n",sumaM);
       if(matematicas==1)
       {
              printf("Hay solo una matematica\n\n");
       }
       if(matematicos==1)
       {
              printf("Hay solo un matematico\n\n");
       }
       else
       {
              printf("%d son matematicas y %d son matematicos\n\n",matematicas,matematicos);
       }

printf("\nNumero de personas inscritos en Biologia: %d\n",sumaB);
       if(biologas==1)
       {
              printf("Hay solo una biologa\n\n");
       }
       if(biologos==1)
       {
              printf("Hay solo un biologo\n\n");
       }
       else
       {
              printf("%d son biologas y %d son biologos\n\n",biologas,biologos);
       }

printf("\nNumero de personas inscritos en Ciencias de la Computacion: %d\n",sumaC);
       if(matematicas==1)
       {
              printf("Hay solo una computologa\n\n");
       }
       if(matematicos==1)
       {
              printf("Hay solo un computologo\n\n");
       }
       else
       {
              printf("%d son computologas y %d son computologos\n\n",computologas,computologos);
       }
       
printf("\nNumero de personas inscritos en Ciencias de la Tierra: %d\n",sumaT);
       if(matematicas==1)
       {
              printf("Hay solo una tierra\n\n");
       }
       if(matematicos==1)
       {
              printf("Hay solo un tierro\n\n");
       }
       else
       {
              printf("%d son tierras y %d son tierros\n\n",tierras,tierros);
       }

}


void histograma(char *Todoptr[N][A])
{
       int diocho=0,dinueve=0,veinte=0,veintiuno=0,veintidos=0,i;
       int edades[N];
       
       for(i=0;i<N;i++)
       {
              edades[i]=atoi(Todoptr[i][5]);
              if(edades[i]==18)
              {diocho=diocho+1;}
              if(edades[i]==19)
              {dinueve=dinueve+1;}
              if(edades[i]==20)
              {veinte=veinte+1;}
              if(edades[i]==21)
              {veintiuno=veintiuno+1;}
              if(edades[i]==22)
              {veintidos=veintidos+1;}
       }

printf("\n\n");
printf("e\n");
printf("d   18| ");
for(i=1;i<=diocho;i++)
{printf("*");}
printf("\n");
printf("a   19| ");
for(i=1;i<=dinueve;i++)
{printf("*");}
printf("\n");
printf("d   20| ");
for(i=1;i<=veinte;i++)
{printf("*");}
printf("\n");
printf("e   21| ");
for(i=1;i<=veintiuno;i++)
{printf("*");}
printf("\n");
printf("s   22| ");
for(i=1;i<=veintidos;i++)
{printf("*");}
printf("\n       --------------------------------------");
printf("\n              cantidad de alumnos(*)       ");
}

void clasificacion(char *ING[N][2])
{ int ingreso[N],i;
  char *unoptr[N],*dosptr[N],*tresptr[N],*cuatroptr[N],*cincoptr[N];
  int a=0,b=0,c=0,d=0,e=0;
 
for(i=0;i<N;i++)
{
       ingreso[i]=atoi(ING[i][1]);
       if(ingreso[i]==2007)
       { unoptr[i]=ING[i][0];
       a=a+1;}
       if(ingreso[i]==2008)
       { dosptr[i]=ING[i][0];
       b=b+1;}
       if(ingreso[i]==2009)
       { tresptr[i]=ING[i][0];
       c=c+1;}
       if(ingreso[i]==2010)
       { cuatroptr[i]=ING[i][0];
       d=d+1;}
       if(ingreso[i]==2011)
       { cincoptr[i]=ING[i][0];
       e=e+1;}
}   
   
if(a>0)
{
       printf("\nEstos son los alumnos que ingresaron en el 2007\n");
       for(i=0;i<N;i++)
       {
            printf("%s",unoptr[i]);
            printf("\n");
       }


else
printf("\nNo hay alumnos ingresados en el 2007\n");
printf("\n\n");

if(b>0)
{
       printf("Estos son los alumnos que ingresaron en el 2008\n");
       for(i=0;i<N;i++)
       {
              printf("%s",dosptr[i]);
              printf("\n");
       }
}

else
printf("No hay alumnos ingresados en el 2008");
printf("\n\n");

if(c>0)
{
       printf("Estos son los alumnos que ingresaron en el 2009\n");
       for(i=0;i<N;i++)
       {
              printf("%s",tresptr[i]);
              printf("\n");}
}

else
printf("No hay alumnos ingresados en el 2009");
printf("\n\n");         

if(d>0)
{
       printf("Estos son los alumnos que ingresaron en el 2010\n");
       for(i=0;i<N;i++)
       {
              printf("%s",cuatroptr[i]);
              printf("\n");}
}

else
printf("No hay alumnos ingresados en el 2010");
printf("\n\n");

if(e>0)
{
       printf("Estos son los alumnos que ingresaron en el 2011\n");
       for(i=0;i<N;i++)
       {
              printf("%s",cincoptr[i]);
              printf("\n");}
}

else
printf("No hay alumnos ingresados en el 2011");
}                     
                             
         
   












#3
Lo sé, es que me cuestan mucho trabajo los punteros... y talvez me complique demasiado la vida pero ya no tengo mucho tiempo para simplificarla y la verdad ya me hice bolas...  

disculpa mi insistencia pero me podrias decir donde mado llamar a la función para contar los nodos?? y sabras como puedo hacer esto con cadenas???

Porfa!!!!!!!!!!!
#4
Gracias!!! Pero si los ordena de la a la z... ya lo ejecute varias veces.

Lo que no ordena es la función imprimir_inv que me hiciste favor de proporcionar..
y que la verdad aunque me ayudaste con esa para darme la idea trate de convertila a funcion recursiva y no me salio tampoco

La funcion imprimir_na es independiente de la que ya tengo que es imprime??

Yo sé que es abusar de tu ayuda pero.. es que tengo un buen de tarea y me falta saber como hacer el programa que publique con cadenas??

En el codigo que pusiste arribo ya vez que hay partes en las que hace falta algo y las pones como /*... */, que deberia anexar ahi???
Y en que momento mando llamar a la función???

Perdon, es que estoy super perdido con esto...  :(

#5
Programación C/C++ / Re: Ayuda con recursion...
6 Noviembre 2011, 03:23 AM
Me surge una duda mas, como le haria para que en lugar de ingresar caracteres pueda ingresar cadenas y en la opcion de eliminar me elimine palabra por palabra y aparte me las ordene alfabeticamente???

Es que esto lo quise hacer modificando algunas cosas pero sigue sin aceptarme cadenas nada mas me lee el primer caracter de la cadena que ingreso.
#6
Programación C/C++ / Re: Ayuda con recursion...
6 Noviembre 2011, 02:02 AM
Cita de: rir3760 en  6 Noviembre 2011, 01:44 AM
Para la segunda función debes indicar los requisitos de esta con relación al numero de nodos antes y después del nodo a buscar.

Hola, gracias por responder y ayudarme ... mi duda con lo que estas diciendo y que ya tenia por eso no he podido terminar mi programa es como con una función RECURSIVA (al igual que me piden en el primer punto) hacer que me de el numero de caracteres antes y depués del que pida el usuario.

Por ejemplo si el usuario ingreso las letras: h,o,a,c,l t, p, f, k. Entonces la lista apareceria asi:

a--c--f--h--k--l--o--p--t

y si el usuario quiera saber cuantas lestras hay antes y despues de la "k", aqui seria facil porque es numerable pero en caso de que se ingresen mucho más? sé que ese es el chiste de la recursión, pero no entiendo como hacerlo?
#7
Hola..

Tengo un codigo que hice el cual crea y ordena en forma alfabeticamente creciente un lista de caracteres, se pueden insertar elementos a la lista y eliminarlos.

Pero me falta dos puntos para terminar mi programa:

1° tengo que imprimir con una función recursiva la lista ordenada alfabeticamente decreciente, es decir de z-a,.

2° Y hacer una funcion recursiva que al momento que yo ingrese un elemeto que quiero que se busque en la lista me diga cuantos caracteres hay antes y cuantes después del caracter que yo indique.

Aqui esta mi codigo, pero quisiera ver si me ayudan y me pueden decir como hacer estas dos funciones recursivas que me faltan, por favor:


#include <stdio.h>
#include <stdlib.h>

struct lista_nodos {
     
      /*Se declara una estructura*/
     
      char valor;
      struct lista_nodos *sigPtr; };
     
      typedef struct lista_nodos LISTA;
      typedef struct lista_nodos *LISTPREVPTR;
      /*Se usa un alias para la estructura lista_nodos*/
     
      void inserta(LISTPREVPTR*, char);
      /*Se declara la función inserta*/
      char elimina (LISTPREVPTR*, char);
      /*Se declara la función elimina*/
      int estavacia (LISTPREVPTR);
      /*Se declara la función estavacia*/
      void imprime (LISTPREVPTR);
      /*Se declara la función imprime*/
      void menu (void);
      /*Se declara la funcion menu*/
     
      main(){
             
      LISTPREVPTR inicioPtr = NULL;
      int avanza, selec;
      char dato;
      printf("\n\n%s\n\n","<Un programa que construye listas dinamicas>");
      menu();
      /*Se manda llamar a la función menu*/
      printf("\n%s","\n\nLa opción seleccionada es: ");
      scanf("%d",&selec);
      /*Se lee la función que elige el usuario*/
     
      while(selec != 3){
      /*Cuando la opción elegida por el usuario sea distinta de 1, 2 o 3
      se despliega nuevamente el menu*/
                 
      switch(selec){
      /*Se definen las acciones a realizar conforme a la opción que elija
      el usuario*/
                   
      case 1:
     
      printf("\n%s","Deme un caracter: ");
      scanf("\n%c", &dato);
      inserta(&inicioPtr, dato);
      /*Se manda llamar a la funcón inserta*/
      imprime(inicioPtr);
      /*Se manda llamar a la función inicio*/
      break;
     
      case 2:
           
      if(!estavacia(inicioPtr)){
                             
      printf("\n%s","El caracter a eliminar es: ");
      scanf("\n%c",&dato);
     
      if(elimina(&inicioPtr, dato)){
      /*Se manda llamar a la función elimina*/
     
      printf("\n%s%c%s\n\a\a","El caracter: ",dato,"fue eliminado de la lista");
      imprime(inicioPtr);
      /*Se manda llamar a la función imprime*/
      }
      else
      /*En caso de no encontrarse el caracter se entra al else*/
     
   printf("\n%s%c%s\n\a","El caracter: ",dato,"no fue encontrado en la lista");
   }
   
      else
      /*La ultima opcion que puede ocurrir al momento de eliminar un carcter
      se presenta en este else*/
      printf("\a\n\t%s\n\a","La lista esta vacia");
      break;
     
      default:
      /*En caso de no ocurrir nada de lo anterior se lanzara en pantalla
      lo siguiente*/
     
      printf("\n%s\n","La selección es incorrecta");
      menu();
      /*Se despliega el menu*/
      break;
      }
     
      menu();
      printf("\n%s","La opcion seleccionada es: ");
      scanf("%d", &selec);
      };
     
      printf("\n\n%s","Hasta pronto");
      scanf("%d",&avanza);
      return 0;
      }
     
      void menu(void){
      /*Se define la función menu*/
           
      printf("\n\nSeleccione una opcion: ");
      printf("\n\n1.-Insertar un elemento en la lista");
      printf("\n\n2.-Eliminar un elemento en la lista");
      printf("\n\n3.-Salir del programa");
      }
     
      void inserta(LISTPREVPTR*aPtr, char datoin){
      /*Se define la función inserta*/
      LISTPREVPTR datnvoPtr, datprevPtr, datactPtr, lista_nodos;
      /*Se declaran apuntadores que sean del tipo LISTPREVPTR*/
      datnvoPtr=(LISTPREVPTR)malloc(sizeof(lista_nodos));
      /*evalúa a sizeof (lista_nodos) para determinar el tamaño de una
      estructura del tipo lista_nodos, para asignar una nueva área en
      memoria, y para almacenar un apuntador a la memoria asignada a la
       variable datnvoPtr */
     
      if(datnvoPtr != NULL){
      /*En caso de que datnvoPtr sea distinto de NULL, se realizara lo
      siguiente*/
                   
      datnvoPtr->valor=datoin;
      datnvoPtr->sigPtr=NULL;
      datprevPtr=NULL;
      datactPtr=*aPtr;
     
      while(datactPtr != NULL&&datoin>datactPtr->valor){
     
      datprevPtr=datactPtr;
      datactPtr=datactPtr->sigPtr;
      };
     
      if(datprevPtr==NULL){
      /*Se compara datprevPtr con NULL y se continuara si son iguales*/
      datnvoPtr->sigPtr=*aPtr;
      *aPtr=datnvoPtr;
      }
     
      else{
      /*Si datprevPtr es distinto de NULL se entrara al else*/
      datprevPtr->sigPtr=datnvoPtr;
      datprevPtr->sigPtr=datactPtr;
      }
      }
     
      else
      /*En caso de no haber ocurrido ninguna de las anteriores se entrara
      a este else*/
      printf("\n%s%c%s\n%s\a\a\a\a","El caracter: ",datoin,"no fue insertado",
      "memoria insuficiente\n\n");
      }
     
      char elimina(LISTPREVPTR*bPtr, char datoele){
      /*Se define la función elimina*/
           
      LISTPREVPTR datempPtr, datprevPtr, datactPtr;
      /*Se declaran apuntadores que sean dell tipo LISTPREVPTR*/
     
      if(datoele==(*bPtr)->valor){
      datempPtr=*bPtr;
      *bPtr=(*bPtr)->sigPtr;
      free(datempPtr);
      /*Se liberara memoria de datempPtr*/
      return datoele;
      }
     
      else{
      datprevPtr=*bPtr;
      datactPtr=(*bPtr)->sigPtr;
     
      while(datactPtr!=NULL&&datactPtr->valor!=datoele){
      datprevPtr=datactPtr;
      datactPtr=datactPtr->sigPtr;
      };
     
      if(datactPtr!=NULL){
      datempPtr=datactPtr;
      datprevPtr->sigPtr=datactPtr->sigPtr;
      free(datempPtr);
      /*Se liberara memoria de datempPtr*/
      return datoele;
      }
      }
      return '\0';
      }
     
      int estavacia(LISTPREVPTR cPtr){
      /*Se define la función estavacia*/
         
      return(cPtr==NULL);
      }
     
      void imprime(LISTPREVPTR dPtr){
      /*Se define la función imprime*/
           
      if(dPtr==NULL){
      /*En casao de que dPtr no este inicializado se imprimira lo de abajo*/
                     
      printf("\a\n\t%s","La lista esta vacia\n\n");
      printf("NULL \n\n");
      }
     
      else{
      /*Cuando dPtr tenga valor se mostrara la lista*/
      printf("\n\t%s","La lista es: ");
      while(dPtr!=NULL){
      /*Solo cuando dPtr sea distitno de NULL se hara la impresión que aparece
      abajo*/
      printf("%c--->",dPtr->valor);
      dPtr=dPtr->sigPtr;
      }
      printf("\n");
      }
      }
#8
Mas o menos entendí, no les voy a mentir sigo medio perdido con esto.... Otra duda que me surgió es como hacer la funcion que me calcule el promedio por materia no por alumno....
No tendrán un ejemplo en el cual me pueda guiar porque ya me desespere... Y ya intente mucho pero no puedo.
#9
Cita de: naderST en 23 Octubre 2011, 23:49 PM
Puedes tener apuntadores a estructuras no veo el problema...

Eso imagine pero no puedo avanzar ya que no se manejar los apuntadores, se me hacen muy laboriosos..

Me podran ayudar con el esqueleto del programa y ya asi darme una idea?? por fa, es que en serio que no se manejar apuntadores... lo que regularmente hago es subir lo que llevo trabajado del codigo y aqui me hacen el favor de decirme mis errores y ayudarme pero esta vez no tengo naditititita... :(
#10
Eso pensaba o, porque a las estructuras si les entiendoo, Pero no me dejan usarlas!! todo debe ser con apuntadores... por ello pido que echen una mano, porfis!!!!