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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Teoría + Problema Propuesto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Teoría + Problema Propuesto  (Leído 4,126 veces)
julianbesso1

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Teoría + Problema Propuesto
« en: 17 Julio 2014, 00:34 am »

Buenas! Acabo de encontrar este foro y pienso que seguro podrán ayudarme con mi problema:

Tengo que resolver los sig ejercicios...

A) Realice un programa para leer un arreglo lineal de N elementos conteniendo palabras de hasta 12 caracteres. Luego el programa deberá informar separadamente: a) El primero de la lista de acuerdo a un orden alfabético. b) Los elementos del arreglo que ocupan las posiciones pares. c) Las palabras que comienzan con la sílaba ‘mar’ .

B) Ejercicio 6.5. Escriba un programa que permita ingresar una lista de apellidos y nombres
de N personas (apellido y nombre se asignan a una sola variable). El programa debe mostrar las direcciones de correo electrónicos (emails) de ellos. El dominio asignado para ellos para el email
es: gmail.com, y el nombre de usuario se forma con la inicial del nombre y el apellido. Ejemplo: Si el dato es Gomez Nicolas, debe obtenerse: ngomez@gmail.com

...pero no cuento con ningún tipo de teoría acerca de punteros y memoria dinámica. La verdad estoy algo perdido. Me gustaría que me recomienden material para aprender de cero estos conceptos.

Desde ya, muchas gracias. Saludos!



En línea

Flakito81


Desconectado Desconectado

Mensajes: 519



Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #1 en: 17 Julio 2014, 23:22 pm »

Hola,
No creo que nadie te vaya a hacer esos ejercicios. Si te han puesto esa tarea se entiende que te han explicado los conceptos basicos para hacerlos. Eres tu quien debe de ponerse a pensar durante horas como resolverlo, así es la programación y más en los inicios.

Aun asi creo que te puedo dar una serie de pasos orientativos.

A)
- Declaras un array bidimensional para hacerlo dinamicamente puedes mirar en internet pero el concepto básico es:
Código
  1. arreglo =(char **) malloc (numero_de_palabras*sizeof(char *));
  2. contador_palabras = 0;
  3. while (contador_palabra < numero_de_palabras){
  4.   arreglo[contador_palabras] = (char *) malloc (13 * sizeof(char));
  5. }
  6. /** NOTA: Si las palabras son de 12 caracteres hay que sumarle uno por el fin de cadena (\x0) **/
  7. /** NOTA 2: Como para leer el nombre tienes que declarar una variable, podrias calcular el tamaño dependiendo del largo de cada palabra. Es decir leer la palabra y en el malloc que esta dentro del bucle sustituyes el 13 por un strlen(variable) + 1
  8.  
- La insercion de las palabras la puedes hacer directamente al reservar la memoria y solo es usar la funcion strcpy
a) No entiendo bien lo que te piden con eso del primero de acuerdo a un orden alfabetico, pero en todo caso seria recorrer el vector e ir comparando y cuando lo encuentre lo muestras y fin. Te recomiendo que uses un bucle tipo while con alguna bandera para detectar si hay que continuar. El esquema es algo asi:
Código
  1. i = 0;
  2. encontrado = 0;
  3. while ( i < numero_de_palabras && !encontrado)
  4. {
  5.    if (/** comparacion que sea **/)
  6.    {
  7.         /** codigo que sea **/
  8.        encontrado = 1;
  9.    }
  10. }
  11.  

b) Un recorrido con saltos pares:
Código
  1. for (i = 0; i < numero_de_palabras; i+=2)
  2. {
  3.    /** mostrar el elemento i **/
  4. }
  5.  
c) Es una variente del caso a, piensa un poco. strncmp te ayudará


B) En este caso puedes optar por hacer un array de estructuras (me parece lo mas sencillo) o bien por un array bidimensional. Como supongo que es lo que te piden lo plantearé como un array bidimensional.
- La reserva de memoria es identido al caso A, la diferencia es que la variable con la que leias palabras tiene que ser más larga. (No te olvides del strlen)
- Lees nombre y apellido con la funcion gets o con scanf, tal que scanf("%[^\n]", variable); para que puedas leer los espacios en blanco
- una vez cargados los nombres y apellidos:
-- la posicion 0 es la primeria inicial del nombre
-- la siguiente posicion al espacio en blanco es la primera letra del apellido. Puedes calcular esa posicion recorriendo el vector y cuendo lo encuentres vas mostrando los caracteres encontrados (es una manera simple de hacerlo, aunque no la más alegante)
-- finalmente muestras @gmail.com

Estructura ""pseudocodigo"":
Código
  1. para todas las palabras hacer
  2.   mostrar arreglo[i][0];
  3.   j =  buscar_espacio_en_blanco(arreglo[i])
  4.   mientras no final de cadena
  5.      mostrar(arreglo[i][j+1])
  6.      incremeto j
  7.   fin_mientras
  8.   mostrar "@gmail.com"
  9.   mostrar_salto_de_linea
  10.  incremento i
  11. fin_para
  12.  

Los trozos de codigo estan pensados en C, si quieres hacerlo en C++ tienes que investigar el new, en vez del malloc, utilizar los metodos de la clase string en vez de los str[...], en fin ... solo es una orientacion, de ti depende hacerlo.

Suerte!


En línea

julianbesso1

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #2 en: 20 Julio 2014, 03:46 am »

Está bien. No era mi intención que me den la solución. La idea era empezar de cero a ver la teoría de esos contenidos. Esto es lo que tengo hasta ahora del primer ejercicio:

Código:
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[]) {

int c, palabras=0, ac=0;
char pal[13], menor[13]="zzzzz";
char *p;
cout<<"Cantidad de palabras a ingresar: ";
cin>>c;
cout<<"(Recuerde que solo pueden contener hasta 12 caracteres) "<<endl<<endl;
p=new char[c*13];

for(int i=0; i<c*13; i++){
p[i]=' ';
}

        while(palabras<c+1){
cin.getline(pal, 13);
strcpy(&p[ac], pal);
ac+=strlen(pal)+1;
palabras++;
if(strcmp(menor,pal)>0){
strcpy(menor,pal);
}
}

for(int i=0; i<c*13; i++){
cout<<p[i];
}

puts(menor);

return 0;
}

El problema es que puts no devuelve nada. No puedo deducir el motivo. Alguien?
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #3 en: 20 Julio 2014, 14:07 pm »

El problema es que puts no devuelve nada. No puedo deducir el motivo. Alguien?

"Creo" que es un problema de limpiar el buffer. Mira a ver así:

Código
  1.  while (cin.get() != '\n');
  2.  while(palabras<c){
  3.    cin.getline(pal, 13);
  4.    strcpy(&p[ac], pal);
  5. *************************  
  6.  cout<<endl<<menor<<endl;
  7. *************************

Citar
Cantidad de palabras a ingresar: 5
(Recuerde que solo pueden contener hasta 12 caracteres)

dsa
menor= dsa
sad
asd
menor= asd
adf
menor= adf
aas
menor= aas
dsa sad asd adf aas
aas


Y por cierto, ¿por qué usas puts con la consiguiente inclusión de la librería stdio en lugar del cout que previamente si has utilizado?.

¡¡¡¡ Saluditos! ..... !!!!


« Última modificación: 20 Julio 2014, 18:39 pm por leosansan » En línea

julianbesso1

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #4 en: 21 Julio 2014, 01:41 am »

Primero quiero agradecer la buena predisposición que tienen para ayudarme a terminar :)

Lamentablemente, me sigue devolviendo lo mismo. Parece ser que dentro del bulce while ocurre algo que luego no me deja imprimir la cadena menor

Código:
while(palabras<c+1){
cin.getline(pal, 13);
strcpy(&p[ac], pal);
ac+=strlen(pal)+1;
palabras++;
if(strcmp(menor,pal)>0){
strcpy(menor,pal);
}
}

Aclaro que puse palabras<c+1 porque solo poniendo <c me deja ingresar una palabra menos (creo que se debe a getline)
Quedo a la espera de alguna solución.
Gracias!!!
« Última modificación: 21 Julio 2014, 01:47 am por julianbesso1 » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Teoría + Problema Propuesto
« Respuesta #5 en: 21 Julio 2014, 02:40 am »

Sugiero que pongas las entradas y salidas que obtienes versus la que esperas. Decir que obtienes "lo mismo" no es clarificador, en mi opinion.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #6 en: 21 Julio 2014, 07:49 am »

Primero quiero agradecer la buena predisposición que tienen para ayudarme a terminar :)
Lamentablemente, me sigue devolviendo lo mismo. Parece ser que dentro del bulce while ocurre algo que luego no me deja imprimir la cadena menor
................................................
Aclaro que puse palabras<c+1 porque solo poniendo <c me deja ingresar una palabra menos (creo que se debe a getline)
Quedo a la espera de alguna solución.
...............................................

En realidad estas confirmando al poner c+1 que un cin se lleva por delante el '\n' del primer cin, lo que indica que hay que hacer limpieza del buffer, de ahí lo que te indiqué en el mensaje anterior.

A mí si me funciona como te indiqué, que te amplio para que lo veas mejor:

Código
  1. ******************
  2.  p=new char[c*13];
  3.  for(int i=0; i<c*13; i++){
  4.    p[i]=' ';
  5.  }
  6.  while (cin.get() != '\n');
  7.  while(palabras<c){
  8.    cin.getline(pal, 13);
  9.    strcpy(&p[ac], pal);
  10.    ac+=strlen(pal)+1;
  11.    palabras++;
  12.    if(strcmp(menor,pal)>0){
  13.      strcpy(menor,pal);
  14.      cout<<"menor parcial = "<< menor<<endl;
  15.    }
  16.  }
  17.  for(int i=0; i<c*13; i++){
  18.    cout<<p[i];
  19.  }
  20.  cout<<endl<<"menor final = "<<menor<<endl;
  21. ***********************

Lo único a tener en cuenta es que como haces distinción de mayúsculas y minúsculas da lugar a que, por ejemplo, "Canvas" sea menor que "anda", ya que que en código ASCII "C" es "menor" que "a".  ;)

No obstante suscribo las palabras de CalgaryCorpus:

Sugiero que pongas las entradas y salidas que obtienes versus la que esperas. Decir que obtienes "lo mismo" no es clarificador, en mi opinion.

Pon un ejemplo en que falle o no obtengas lo esperado indicando que esperabas.

¡¡¡¡ Saluditos! ..... !!!!


« Última modificación: 21 Julio 2014, 08:48 am por leosansan » En línea

julianbesso1

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #7 en: 22 Julio 2014, 04:18 am »

Lo conseguí. Me sugirieron agregar cin.ignore()

El código quedó así:

En este caso, almaceno las palabras en un único vector

Código:
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[]) {

int c, palabras=0, ac=0;
char pal[13], menor[13]="zzzzz";
char *p;
cout<<"Cantidad de palabras a ingresar: ";
cin>>c;
cout<<"(Recuerde que solo pueden contener hasta 12 caracteres) "<<endl<<endl;

p=new char[c*13];

for(int i=0; i<c*13; i++){
p[i]=' ';
}

cin.ignore();

while(palabras<c){
cin.getline(pal, 12);
strlwr(pal);  //  pasa pal a minusculas para luego comparar con 'mar'
strcpy(&p[ac], pal);
ac+=strlen(pal)+1;
palabras++;
if(strcmp(menor,pal)>0){
strcpy(menor,pal);
}
}
/* //comprobación del vector
for(int i=0; i<c*13; i++){
cout<<p[i];
}

cout<<endl;
*/
cout<<"\nLa palabra que aparece primero segun orden alfabetico es: ";
puts(menor);

cout<<endl<<endl;

cout<<"Los elementos de las posiciones pares son: "<<endl<<endl;

for(int j=2; j<c*13; j+=2){
puts(&p[j]);  //  si se utiliza 'cout' los resultados son distintos (debido a que las palabras se insertan en un único vector)
}

cout<<"Las palabras que contienen la cadena 'mar' son: "<<endl<<endl;

for(int k=0; k<c*13; k++){
if(strncmp(&p[k],"mar", 3)==0)
puts(&p[k]);  //  muestras todas las veces que aparece 'mar' (debido a que las palabras se insertan en un único vector)
}

delete p;

return 0;
}

Mi idea en este momento, es reescribirlo de tal manera que las palabras se almacenen en una matriz dinámica (1 palabra por fila).

Tengo esto:

Código:
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[]) {

int c, pal=0;
char menor[13]="zzzzz";
cout<<"Cantidad de palabras a ingresar: ";
cin>>c;
cout<<"(Recuerde que solo pueden contener hasta 12 caracteres) "<<endl<<endl;

char** p=new char*[c];

for(int h=0; h<c; h++){
p[h]=new char[13];
}
/*
for(int i=0; i<c; i++){
for(int j=0; j<13; j++){
p[i][j]=' ';
}
}
*/
cin.ignore();

while(pal<c){
cin.getline(p[pal], 12);
strlwr(p[pal]);  //  pasa pal a minusculas para luego comparar con 'mar'
pal++;
if(strcmp(menor,p[pal])>0){
strcpy(menor,p[pal]);
}
}
/* //comprobación del vector
for(int i=0; i<c*13; i++){
cout<<p[i];
}

cout<<endl;
*/
cout<<"\nLa palabra que aparece primero segun orden alfabetico es: ";
puts(menor);

cout<<endl<<endl;

cout<<"Los elementos de las posiciones pares son: "<<endl<<endl;

for(int j=0; j<c; j+=2){
puts(p[j]);  //  si se utiliza 'cout' los resultados son distintos (debido a que las palabras se insertan en un único vector)
}

cout<<"\nLas palabras que contienen la cadena 'mar' son: "<<endl<<endl;

for(int k=0; k<c; k++){
if(strncmp(p[k],"mar", 3)==0)
puts(p[k]);  //  muestras todas las veces que aparece 'mar' (debido a que las palabras se insertan en un único vector)
}

for(int l=0; l<c; l++){
delete[] p[l];
}

delete[] p;

return 0;
}

Compilé y resulto bien solo la primera vez. Cada vez que ingreso las palabras me aparece el mensaje: [nombre_del_archivo] dejó de funcionar. Por si es de utilidad, estoy trabajando con Windows 7 64b.

Me gustaría que se fijen bien el tema de asignación dinámica y doble punteros. Recién estoy aprendiendo, así que no estoy muy seguro del uso de new y delete.

Gracias de antemano!
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #8 en: 22 Julio 2014, 09:39 am »

Estás programando en C++... no uses includes de C (los que acaban en .h). La librería de C++ dispone de herramientas más que suficientes como para no tener que depender de la librería de C.

Por ejemplo, para manejar cadenas de caracteres en C++ lo suyo es usar la clase "string". Es mucho más segura y sencilla de manejar que los arreglos de C.

Otro ejemplo podría ser usar el contenedor "vector" en vez de memoria dinámica a pelo...

Además, tu código tiene algunos errores:

Código
  1. while(pal<c){
  2. cin.getline(p[pal], 12);
  3. strlwr(p[pal]);  //  pasa pal a minusculas para luego comparar con 'mar'
  4. pal++; // <<<<<<-------- AQUI!!!!!
  5. if(strcmp(menor,p[pal])>0){
  6. strcpy(menor,p[pal]);
  7. }
  8. }

Si incrementas "pal" antes de hacer la comparación... estás comparando menor con una cadena no definida!!!!

En línea

julianbesso1

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Teoría + Problema Propuesto
« Respuesta #9 en: 23 Julio 2014, 16:42 pm »

Si. Me dí cuenta tarde. Igual ya había logrado que funcione reemplazando el bucle while por un for. Muchas gracias por su ayuda
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
La Teoría de la Ruptura ... « 1 2 3 »
Foro Libre
Constance 26 9,539 Último mensaje 20 Octubre 2011, 21:00 pm
por Constance
C++ Problema propuesto usando estructuras repetitivas
Programación C/C++
Franz1628 3 3,150 Último mensaje 27 Enero 2012, 23:45 pm
por theluigy13etv
Teoria matematica
Foro Libre
barnix456 4 3,025 Último mensaje 3 Diciembre 2012, 18:52 pm
por barnix456
Teoria del color
Programación General
m@o_614 0 1,911 Último mensaje 26 Noviembre 2012, 23:56 pm
por m@o_614
¿Harto de lidiar con Power Point? Bunkr se ha propuesto jubilarlo
Noticias
wolfbcn 0 1,669 Último mensaje 27 Agosto 2013, 03:01 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines