Dificultad con programacion informática PREGUNTA EN PAG.3

Buenas, a todos estoy en 1ª del ciclo de programación y la verdad que me gusta, alguna cosa se me hace coñazo pero me entretiene bastante casi todo.

El problema viene con la asignatura de programacion, me dijeron que cuando comienzas sino la pillas desde el primer dia se te va acumulando y luego cuesta de pillar, desde el principio cuando hacia el examen del tema 2 sabia solo el 1, y cuando haciamos el examen del tema 3 solo sabia el 1 y el 2 y asi...

Hace 2 semanas suspendí el examen del tema 5, solo aprobaron 3 o 4, era complicado, solo aprueban unos que ya han dado programacionen C anteriormente (vienen de uni u otro ciclo), los demas suspendidos.

Mañána tengo el examen del ultimo tema que la profesora ha explicado MAL no... LO SIGUIENTE y no he entendido ABSOLUTAMENTE NADA, en cambio el tema anterior ya casi lo entiendo a la perfección, alguna cosa no la tengo clara pero el 80-85% lo llevo bien, pero el tema del examen de mañana lo suspenderé, siempre voy un tema por detras y me cuesta seguir el ritmo, cuando entiendo un tema del que iba atrasado digo "Coño si no era tan dificil.." pero en el proceso me cuesta pillarlo, sera porque en clase explican muy mal sino vamos...

Ya que suspenderé mañana, tengo dos semanas de recus, la ordinaria y la extraordinaria (finales de MAyo y mediados de Junio) se todo lo que hemos dado del curso menos alguna cosa de funciones(tema 5) y el tema de archivos (el ultimo tema), alguien me ayudaria con estas cosas? Alguna pagina que lo explique bien, algun problema facilillo para practicar, video etc.... ya que yo no he encontrado nada en claro...

Gracias y saludos.
Como programas? Es decir, cual es tu "plan" por decirlo de alguna forma de encarar los programas y sacarlos adelante?
Pues nô tengo ningun plan, lo que hago es hacer sobre la marcha y voy ejecutando el programa y si hay algo mal peroy miro que esta mal y lo intentao corregir, el problema es que hay veces que nô se corregir un fqllo ô directamente nô se como se hace algo como el examen đe mañana đe archivos, mê jode mucho ir a un examen donde se que voy asuspender ...
YonkiKong escribió:Pues nô tengo ningun plan, lo que hago es hacer sobre la marcha y voy ejecutando el programa y si hay algo mal peroy miro que esta mal y lo intentao corregir, el problema es que hay veces que nô se corregir un fqllo ô directamente nô se como se hace algo como el examen đe mañana đe archivos, mê jode mucho ir a un examen donde se que voy asuspender ...

Y no crees que seria mejor primero pensar y repensar ese programa y luego plasmarlo en el codigo? Luego seria mucho mas rapido y fluido que acabase funcionando.

Por cierto, necesito una foto de tu teclado, por lo de la programacion.
Estoy desde el movil y se me cuelan cosas raras tranqui xD
para programar, siempre un papel y un lapiz al lado. antes de tocar codigo, hazte un pequeño pseudocodigo en papel para estructurar y aclarar lo que vas a hacer. eso de ponerte a teclear codigo sobre la marcha, solo vas a poder hacerlo cuando tengas experiencia y sean cosas que hayas hecho mil veces. mientras tanto, papel y lapiz. puedes pensar que en un examen no hay tiempo para eso, pero creeme que una vez tienes tu programa estructurado y tienes claro lo que hay que hacer, la parte de codificacion se hace mucho mas rapida.
No te puedo ayudar porque yo dejé el curso más o menos cuando dábamos eso y si mal no recuerdo lo tengo suspendido

Lo de las funciones es fácil, lo único así un poco complicado es recursividad, y si el examen es de ficheros no creo que salga nada.

Sobre el tema de ficheros, te recomiendo estos pdf que creo que lo explican todo bastante bien(eso sí en inglés) con ejemplos incluídos
http://www.tenouk.com/download/pdf/Module9.pdf
http://www.tenouk.com/clabworksheet/cfi ... orial2.pdf
http://www.tenouk.com/Module9a_1.html
http://www.tenouk.com/Module9b.html
http://www.tenouk.com/Module9b_1.html

Aunque en el título ponga C++ si te fijas bien es todo en C
Pues nosotros, durante el primer curso, no encendimos un ordenador en ninguna clase... todo era papel y lápiz. y a entender lo que se escribía...

lo cierto es que los exámenes los aprobaban 4 o 5 personas también, pero los que le ponían empeño aprobaban, los que no se acababan yendo para no volver...

En la vida real casi nunca escribes algo que funciona a la primera, pero no puedes dedicar el tiempo a achicar agua de tu propio código... lo ideal es que si hay un fallo sea porque se te ha resbalado el dedo en el teclado, no porque no tienes ni zorra de lo que estás haciendo...
Darxen escribió:para programar, siempre un papel y un lapiz al lado. antes de tocar codigo, hazte un pequeño pseudocodigo en papel para estructurar y aclarar lo que vas a hacer. eso de ponerte a teclear codigo sobre la marcha, solo vas a poder hacerlo cuando tengas experiencia y sean cosas que hayas hecho mil veces. mientras tanto, papel y lapiz. puedes pensar que en un examen no hay tiempo para eso, pero creeme que una vez tienes tu programa estructurado y tienes claro lo que hay que hacer, la parte de codificacion se hace mucho mas rapida.

Hazle caso.

No solo para aprobar, también para el futuro.
Picar sin más y en plan guarrete lleva a códigos que nadie entiende.

Yo solo programo así en algo que he hecho cientos de veces: acceso a bbdd y recorrer el resultado.
Gracias por las respuestas, el examen lo he dejado sin apenas nada hecho, al principio un ";" me daba error y no tenia ni zorra idea que pasaba y al final he perdido mucho tiempo y no he podido seguir, el examen era:

La primera funcion de pasar un array a una funcion, eso OK, y luego retornar la posicion de la primera celda libre sino retornar -1, eso no lo sabia hacer.

Luego otra funcion de pasar una struct y modificar unos datos y guardar la struct, no he llegado ahi , pero creo que tampoco sabria.

y la ultima funcon de pasar un array a una funcion y devuelve un booleano si se encuentran un par de cosas (por ejemplo si en una struct de coches, se encuentran el modelo del coche y el nuevo precio introducido).

Alguna cosa mas pero no me acuerdo exactamente, tenia que ver con archivos.

Intentaré practicar mas y tal, pero la profe ha dicho que los examenes los va a poner con fuciones parecidas a las de arriba, alguien me puede ayudar?? Gracias!!
YonkiKong escribió:Gracias por las respuestas, el examen lo he dejado sin apenas nada hecho, al principio un ";" me daba error y no tenia ni zorra idea que pasaba y al final he perdido mucho tiempo y no he podido seguir, el examen era:

La primera funcion de pasar un array a una funcion, eso OK, y luego retornar la posicion de la primera celda libre sino retornar -1, eso no lo sabia hacer.

Luego otra funcion de pasar una struct y modificar unos datos y guardar la struct, no he llegado ahi , pero creo que tampoco sabria.

y la ultima funcon de pasar un array a una funcion y devuelve un booleano si se encuentran un par de cosas (por ejemplo si en una struct de coches, se encuentran el modelo del coche y el nuevo precio introducido).

Alguna cosa mas pero no me acuerdo exactamente, tenia que ver con archivos.

Intentaré practicar mas y tal, pero la profe ha dicho que los examenes los va a poner con fuciones parecidas a las de arriba, alguien me puede ayudar?? Gracias!!


Si no sabes hacer lo que está en negrita, tienes un problema. Yo cuando acabé primero sabía hacer eso con la porra. No es más que recorrer una a una las celdas del array y en el momento en el que encuentres una que no tenga nada, devuelves el índice. Si llegas al final y todas están ocupadas, devuelves -1. Eso deberías saber hacerlo, es muy básico.
Céntrate en intentar entender lo que te piden, ya que es muy sencillo, e intenta abstraerte en un primer momento del código.
Diría que te estás liando por esa forma de trabajar: en tu cabeza acabas mezclando problema y código y te lías.

Concretamente:

YonkiKong escribió:La primera funcion de pasar un array a una funcion, eso OK, y luego retornar la posicion de la primera celda libre sino retornar -1, eso no lo sabia hacer.

Debes recorrer el array miembro por miembro, comprobando todas las celdas y viendo si hay alguna libre.
Si hay libre, te guardas la posición y acabas (no hace falta recorrer más).
Si no hay ninguna libre, devuelves -1.

¿Cómo hacerlo? Te hago un pseudocódigo guarro
----------------------------------------------------------------------------------------
posicion= -1

Para cada posicion del array, y mientras posicion sea -1
--- si posicion_actual es vacio -> posicion = posicion_actual
fin para

devuelvo posicion
----------------------------------------------------------------------------------------

Muy sencillo, ¿no?

- Inicializar una variable
- Un bucle con 2 condiciones
- Una comprobación y asignación en el bucle
- Retorno de variable


Es lo mismo que veo que te ha describo eruanion, pero ya te he facilitado la vida para programar las distintas condiciones del bucle sin guarradas tipo break, goto ni con 3-4 condiciones para algo que puedes resolver en 1.
Eruanion escribió:
YonkiKong escribió:Gracias por las respuestas, el examen lo he dejado sin apenas nada hecho, al principio un ";" me daba error y no tenia ni zorra idea que pasaba y al final he perdido mucho tiempo y no he podido seguir, el examen era:

La primera funcion de pasar un array a una funcion, eso OK, y luego retornar la posicion de la primera celda libre sino retornar -1, eso no lo sabia hacer.

Luego otra funcion de pasar una struct y modificar unos datos y guardar la struct, no he llegado ahi , pero creo que tampoco sabria.

y la ultima funcon de pasar un array a una funcion y devuelve un booleano si se encuentran un par de cosas (por ejemplo si en una struct de coches, se encuentran el modelo del coche y el nuevo precio introducido).

Alguna cosa mas pero no me acuerdo exactamente, tenia que ver con archivos.

Intentaré practicar mas y tal, pero la profe ha dicho que los examenes los va a poner con fuciones parecidas a las de arriba, alguien me puede ayudar?? Gracias!!


Si no sabes hacer lo que está en negrita, tienes un problema. Yo cuando acabé primero sabía hacer eso con la porra. No es más que recorrer una a una las celdas del array y en el momento en el que encuentres una que no tenga nada, devuelves el índice. Si llegas al final y todas están ocupadas, devuelves -1. Eso deberías saber hacerlo, es muy básico.


La verdad es que eso lo hicimos una única vez en un ejercicio, pero como dije la profe desde que empezamos el ultimo tema parece que es otra, explica muy mal y no hay quien se entere.



jorcoval escribió:Céntrate en intentar entender lo que te piden, ya que es muy sencillo, e intenta abstraerte en un primer momento del código.
Diría que te estás liando por esa forma de trabajar: en tu cabeza acabas mezclando problema y código y te lías.

Concretamente:

YonkiKong escribió:La primera funcion de pasar un array a una funcion, eso OK, y luego retornar la posicion de la primera celda libre sino retornar -1, eso no lo sabia hacer.

Debes recorrer el array miembro por miembro, comprobando todas las celdas y viendo si hay alguna libre.
Si hay libre, te guardas la posición y acabas (no hace falta recorrer más).
Si no hay ninguna libre, devuelves -1.

¿Cómo hacerlo? Te hago un pseudocódigo guarro
----------------------------------------------------------------------------------------
posicion= -1

Para cada posicion del array, y mientras posicion sea -1
--- si posicion_actual es vacio -> posicion = posicion_actual
fin para

devuelvo posicion
----------------------------------------------------------------------------------------

Muy sencillo, ¿no?

- Inicializar una variable
- Un bucle con 2 condiciones
- Una comprobación y asignación en el bucle
- Retorno de variable


Es lo mismo que veo que te ha describo eruanion, pero ya te he facilitado la vida para programar las distintas condiciones del bucle sin guarradas tipo break, goto ni con 3-4 condiciones para algo que puedes resolver en 1.


Gracias por la respuesta.

Lo primero, cuando dices "recorrer el array miembro por miembro" te refieres a las diferentes variables de la struct?? Por ejemplo de coches pues marca,precio,motor,modelo etc...

Porque el examen se basaba en introducir informacion a las diferentes variables de uns struct, pero antes tenias que hacer esto de devolver -1.

Ponia, "Pasar un array, no una struct".
Tú has dicho que hay que recorrer un array, no un struct:
La primera funcion de pasar un array a una funcion, eso OK, y luego retornar la posicion de la primera celda libre sino retornar -1, eso no lo sabia hacer.


así que recorres un array. Sea de lo que sea. OJO: que un array puede ser de structs... que creo que es lo que te están pidiendo y es lo que te estás liando.

Vamos a diferenciar, de nuevo, a lo guarro:
- Un array es una estructura de memoria, donde las direcciones son CONSECUTIVAS y contienen TODAS el mismo TIPO DE DATOS.

-Un struct es una estructura de memoria donde las direcciones PUEDEN CONTENDER DISTINTOS tipos de DATOS


Por supuesto, un array puede contener structs (lo que normalmente se llama en C punteros a struct).
Que una celda esté vacía, significa que no contiene un struct, no que contenga un struct y debas comprobar sus distintos campos (matrícula, número de ruedas... ).
Estoy tratando de no meterme en particularidades del lenguaje (las celdas contienen null, etc) para tratar de que entiendas QUÉ hay que hacer.
Cuando esté claro, nos metemos en el CÓMO

(dibujarte las distintas estructuras de datos te ayudarán a entenderlas)

;-)
Yo programacion tampoco lo llevo demasiado bien pero ánimos, es practicar...
Por supuesto, un array puede contener structs, lo que normalmente se llama en C punteros a struct

No necesariamente los arrays de struct tienen que ser de punteros:
struct ejemplo
{};

//...

struct ejemplo array[100];
Ya he dicho que no me quiero meter en particularidades del lenguaje pero... un array en C no deja de ser un puntero, así que siguen siendo punteros a struct.
jorcoval escribió:Ya he dicho que no me quiero meter en particularidades del lenguaje pero... un array en C no deja de ser un puntero, así que siguen siendo punteros a struct.

No, es un puntero al primer elemento. No es un array de punteros a struct.

Aunque creo que ambos nos entendemos, solo te estoy hablando de notación. Para mi "punteros a struct" sería:
struct ejemplo
{};

//...

struct ejemplo* array[100];
jorcoval escribió:Tú has dicho que hay que recorrer un array, no un struct:
La primera funcion de pasar un array a una funcion, eso OK, y luego retornar la posicion de la primera celda libre sino retornar -1, eso no lo sabia hacer.


así que recorres un array. Sea de lo que sea. OJO: que un array puede ser de structs... que creo que es lo que te están pidiendo y es lo que te estás liando.

Vamos a diferenciar, de nuevo, a lo guarro:
- Un array es una estructura de memoria, donde las direcciones son CONSECUTIVAS y contienen TODAS el mismo TIPO DE DATOS.

-Un struct es una estructura de memoria donde las direcciones PUEDEN CONTENDER DISTINTOS tipos de DATOS


Por supuesto, un array puede contener structs (lo que normalmente se llama en C punteros a struct).
Que una celda esté vacía, significa que no contiene un struct, no que contenga un struct y debas comprobar sus distintos campos (matrícula, número de ruedas... ).
Estoy tratando de no meterme en particularidades del lenguaje (las celdas contienen null, etc) para tratar de que entiendas QUÉ hay que hacer.
Cuando esté claro, nos metemos en el CÓMO

(dibujarte las distintas estructuras de datos te ayudarán a entenderlas)

;-)



Ahá, supongo que tendré que pasar uno de estos arrays no? (Vamos a seguir con lo de coches)

coche1[i].marca;
coche1[i].precio;
coche1[i].modelo;


Vamos a ver si se hacer el codigo...






#define MAX 30 (para 30 coches)
struct coche{
char marca[20];
char modelo[20];
float precio;
};

void main(){
struct coche coche1[MAX];
int i;


libre(coche1.precio O precio??, MAX);
}


FUNCION:

libre(float *coche1.precio O *precio, int MAX){
int POS;


POS=-1;

for(POS=0;POS<MAX;POS++){

if(POS==NULL)

?¿

return ?¿;

}

else{

?¿

}



}



Bueno no he conseguido hacer todo pero algo es algo xD.
MMMM vamos a abstraernos a tope.


Imagina un parking compuesto por varias calles donde aparcar coches uno al lado del otro.

Tienes que aparcar un nuevo coche, y el jefe del parking te dice "toma, mírame en la calle 8 si hay algún hueco vacío y dime el número del hueco".

Te pones al inicio de la calle 8 y vas mirando, hueco por hueco, si hay algún coche.



Tú eres la función.
La calle es un array.
Cada uno de los coches es un struct.

En cada hueco, si ves que hay un coche ¿lo tomas por no vacío o te pones a mirar si el coche en cuestión tiene matrícula para considerar vacío el hueco?
A ver, divide y vencerás. Céntrate en la función a la que tienes que pasarle un array y olvídate de los coches. Haz una función dónde le pases un array. Recorre ese array y encuentra la primera celda libre. Empieza por ahí. Cuando tengas esa función clara sigues avanzando. Olvídate de struct, el ejercicio dice un array. Paso a paso.

Lo que dice jorcoval es muy bueno. Piensa eso.
jorcoval escribió:MMMM vamos a abstraernos a tope.


Imagina un parking compuesto por varias calles donde aparcar coches uno al lado del otro.

Tienes que aparcar un nuevo coche, y el jefe del parking te dice "toma, mírame en la calle 8 si hay algún hueco vacío y dime el número del hueco".

Te pones al inicio de la calle 8 y vas mirando, hueco por hueco, si hay algún coche.



Tú eres la función.
La calle es un array.
Cada uno de los coches es un struct.

En cada hueco, si ves que hay un coche ¿lo tomas por no vacío o te pones a mirar si el coche en cuestión tiene matrícula para considerar vacío el hueco?

Cuando me referia a que primero pensaras en el problema me referia a esto (el post este es un ejemplo), pasa del codigo olimpicamente al principio, tienes que saber las cosas basicas que te proporciona el lenguaje y a partir de ahi pensar en como estructurarlo, luego todo sale solo, y esa forma de pensar te servira para cualquier lenguaje de programacion, lo dificil de esto no es saberse todas las caracteristicas de un lenguaje, lo dificil es aprender a pensar el problema, idearlo, estructurarlo y solucionar posibles problemas, esto en papel, o si prefieres ser un pro comprate una pizarra de estas blancas para escribir con rotulador, pero esa deberia ser tu meta, luego el lenguaje es lo de menos, el lenguaje es practica y ademas ya tienes el manual para eso.
Si ya tiene el concepto claro, ponte a crearte el programa ya.

El 70% de la programación es práctica, de nada te sirve tener el concepto claro si luego no lo haces por ti mismo. De hecho, deberías repetirlo 10 días más tarde. Si consigues hacerlo perfecto, si se te ha olvidado, lo recordaras ^^
hola.
como dicen arriba; practica y practica. desde mi punto de vista, lo importante en la programacion
es pensar como un programador. me refiero a saber resolver y planificar los problemas para pod-
er resolverlos de la mejor forma posible. aprender un lenguaje solo implica que aprendas la sint-
axis y otras cosas mas...pero lo importante es lo primero.

un buen curso de matematicas podria ayudarte a crear esa mentalidad de programador. talves
puedas entrenar el emisferio lateral del cerebro...encargado de crear una mentalidad capas de
resolver los problemas.

aqui esta una pagina con muchos libros con Licencia libre(Creative Commons):
http://www.etnassoft.com/biblioteca/



saludos y suerte :)
Practica, y que te guste lo que haces, nada mas

Trabajo de programador, y jamas he estudiado en ninguna escuela, simplemente me gusta, y practico mucho, y leo documentos claro


Programar cosas aburridas que te puedan dar en la escuela, solo hace que termines odiando la programacion, programa algo que te guste, no se, un videojuego, una aplicacion, etc en tu tiempo libre, y usa los conocimientos que adquieras en eso de tu gusto, luego en lo "oficial"

Y si, planteate siempre lo que quieres hacer en papel, o en la cabeza si eres cerebrito, pero no delante del PC
Me creo totalmente cuando dices que tu profe no sabe explicar. A mi en la uni me pasaba lo mismo y mira que era cara la carrera.

Viendo tu problema de la página como lo resuelves:

Una cosa es el for que lo que marca las iteraciones que vas haciendo y otra a partir de estas iteraciones como vas accediendo a los elementos del array o struct:

for(POS=0;POS<MAX;POS++){
if(coche1[POS]==NULL)
{
return POS
}
}
return -1

De esta forma vas accediendo a las 30 posiciones del array y si una de ellas es NULL devolverá la posición. Si llega a las 30 posiciones y no ha saltado, entonces devolverá el -1 que está puesto abajo. Ten en cuenta de que una vez que entra en el return se acaba la función.
Aprender a programar consiste en echar horas, horas y horas al código en casa. Al principio, que es donde estás tú, lo más normal es estar bastante atascado, sobre todo si la documentación que te dan no es la adecuada para un principiante, cosa que por experiencia suele ser así. Pero en cualquier caso, programar es una actividad bastante autodidacta.

Eso sí, un consejo te doy. Haz ejercicios. Si te quedas atascado en algo, por tonto que sea, y no logras salir del problema, PREGUNTA. Al profesor, a tus compañeros, o a google [+risas] pero no pierdas un tiempo desorbitado en ver por qué no compila una cosa si no tienes ni el más mínimo indicio de dónde puede estar el error.

Como decía mi profesor de IA, la tarea de programar es una de las más difíciles que hay, porque por muchas estimaciones de tiempo que te pongas para terminar una tarea, NUNCA se van a cumplir. Para agilizar el trabajo siempre tienes que focalizarte en resolver las incógnitas lo máximo posible, e ir disminuyendo la incertidumbre del "por qué no funciona". Te podría decir, como algunos han hecho, la solución a tu examen, y eso te vendrá genial para aprender. Pero a largo plazo, lo que necesitas es aprender a debuggear el código. Pon prints allá donde lo necesites, experimenta con trozos de código problemáticos, probando a cambiar valores, variables, estructuras de datos y modificando el algoritmo. Cuanto más te pelees con tu código, más vueltas le des y más maneras de solucionarlo intentes, más cerca estarás.

Ánimo con ello. Y te aseguro que a todos nos ha costado aprender a programar. Y de hecho es algo que siempre se está aprendiendo. Programar es fácil, cualquiera puede hacerlo, programar de manera correcta es muy difícil.
Aceskies escribió:Aprender a programar consiste en echar horas, horas y horas al código en casa. Al principio, que es donde estás tú, lo más normal es estar bastante atascado, sobre todo si la documentación que te dan no es la adecuada para un principiante, cosa que por experiencia suele ser así. Pero en cualquier caso, programar es una actividad bastante autodidacta.

Eso sí, un consejo te doy. Haz ejercicios. Si te quedas atascado en algo, por tonto que sea, y no logras salir del problema, PREGUNTA. Al profesor, a tus compañeros, o a google [+risas] pero no pierdas un tiempo desorbitado en ver por qué no compila una cosa si no tienes ni el más mínimo indicio de dónde puede estar el error.

Como decía mi profesor de IA, la tarea de programar es una de las más difíciles que hay, porque por muchas estimaciones de tiempo que te pongas para terminar una tarea, NUNCA se van a cumplir. Para agilizar el trabajo siempre tienes que focalizarte en resolver las incógnitas lo máximo posible, e ir disminuyendo la incertidumbre del "por qué no funciona". Te podría decir, como algunos han hecho, la solución a tu examen, y eso te vendrá genial para aprender. Pero a largo plazo, lo que necesitas es aprender a debuggear el código. Pon prints allá donde lo necesites, experimenta con trozos de código problemáticos, probando a cambiar valores, variables, estructuras de datos y modificando el algoritmo. Cuanto más te pelees con tu código, más vueltas le des y más maneras de solucionarlo intentes, más cerca estarás.

Ánimo con ello. Y te aseguro que a todos nos ha costado aprender a programar. Y de hecho es algo que siempre se está aprendiendo. Programar es fácil, cualquiera puede hacerlo, programar de manera correcta es muy difícil.


hola.
gracias por el consejo, tambien lo tomare en cuenta(tambien soy algo novato en la programacion).


saludos :)
Gracias por los consejos, he tenido otros examenes e por medio pero ahora solo me queda ir a tope con el de programación, volviendo al problema que os expuse, ya se hacer la funcion que os expuse y solo me falt una funcion que no entiendo muy bien como hacer.

Ahí va:
(Acordaos que habiamos hecho una struct con marca,modelo,cilindrada y precio)

Función que recibe un array de motos, marca, modelo y cilindrada y devuelve un booleano indicando si se encontró la moto y el nuevo precio de la moto (anteriormente se tenia que hacer una función donde rellenabamos la informacion de una moto)


Bien, como no se me ocurria como empezar finalmente tuve que irme a la solucion, y el código de la funcion es:

Fuera de la funcion, en el void main.
case 2:
printf("\nMODIFICAR DATOS");
printf("Marca de la moto: ");
gets(mar);
printf("Modelo: ");
gets(mod);
do{
printf("Cilindrada: ");
scanf("%d",&cilin);
if(cilin<50 || cilin>1200){
printf("\nError: la cilindrada debe estar entre 50 y 1200\n\n");
}
}while(cilin<50 || cilin>1200);
if(modificar(moto,mar,mod,cilin)==true){
printf("\nPrecio de la moto actualizado.\n");
printf("");
}else{
printf("\nMoto inexistente.\n");
}
break;





En la funcion
bool modificar(struct motos *moto, char *mar, char *mod, int cilin, float *preu){
int i=0;
while((strcmp(moto->marca,mar)!=0 || strcmp(moto->modelo,mod)!=0 || moto->cilindrada!=cilin) && i<MAX){
i++;
moto++;
}
if(i<MAX){ //se ha salido del bucle porqué se ha encontrado la moto
do{
printf("\nIntroduce el nuevo precio: ");
scanf("%f",&moto->precio);
if(moto->precio<400 ||moto->precio>70000){
printf("\nError: el precio debe ser mayor de 400 €\n\n");
}
}while(moto->precio<400 || moto->precio>70000);
*preu=moto->precio;
return true;
}
else
return false;
}




Aqui vienen mis dudas, la primera es... si te piden que la funcion recibe un array de motos, marca, modelo y cilindrada, porque te preguntan por el precio???? ¬_¬


Luego, porque te piden un array de motos? Se supone que motos es la struct, no un dato que se pueda modificar.


Y tercera y última duda, no entiendo esta parte del código:

while((strcmp(moto->marca,mar)!=0 || strcmp(moto->modelo,mod)!=0 || moto->cilindrada!=cilin) && i<MAX){
i++;
moto++;
}





Para empezar aunque no se use "for" si pone "i++" y "moto++" funciona igual que un "for" no? , luego la forma de usar strcmp no la entiendo (se que es para comparar cadenas), se hace strcmp y entre parentesis pone la estructura señalando a marca (este lo habremos rellenado antes, por eso se llama el problema MODIFICAR) y luego mar por separado, diferente a 0, porque diferente a 0? Se supone que marca y mar tienen que coincidir para encontrar la moto.

El resto de comparaciones tampoco las entiendo, a ver si hay alguien que lo entienda.



Muchísimas gracias.
theelf escribió:Practica, y que te guste lo que haces, nada mas

Trabajo de programador, y jamas he estudiado en ninguna escuela, simplemente me gusta, y practico mucho, y leo documentos claro


Programar cosas aburridas que te puedan dar en la escuela, solo hace que termines odiando la programacion, programa algo que te guste, no se, un videojuego, una aplicacion, etc en tu tiempo libre, y usa los conocimientos que adquieras en eso de tu gusto, luego en lo "oficial"

Y si, planteate siempre lo que quieres hacer en papel, o en la cabeza si eres cerebrito, pero no delante del PC


No conocía esta página, tiene muy buena pinta.

Respecto a la programación, en el primer curso de programación de la carrera solo diseñábamos algoritmos en pseudocódigo para que pensáramos como solucionar el problema y no centrarnos en ningún lenguaje en concreto.

Cuando tienes hecho el algoritmo en pseudocódigo implementarlo en un lenguaje u otro es lo de menos. Si trabajas de desarrollador veras que hay tropecientos lenguajes de programación y que mas o menos todos hacen los mismo pero cada uno tiene sus particularidades.
YonkiKong escribió:Gracias por los consejos, he tenido otros examenes e por medio pero ahora solo me queda ir a tope con el de programación, volviendo al problema que os expuse, ya se hacer la funcion que os expuse y solo me falt una funcion que no entiendo muy bien como hacer.

Ahí va:
(Acordaos que habiamos hecho una struct con marca,modelo,cilindrada y precio)

Función que recibe un array de motos, marca, modelo y cilindrada y devuelve un booleano indicando si se encontró la moto y el nuevo precio de la moto (anteriormente se tenia que hacer una función donde rellenabamos la informacion de una moto)


Bien, como no se me ocurria como empezar finalmente tuve que irme a la solucion, y el código de la funcion es:

Fuera de la funcion, en el void main.
case 2:
printf("\nMODIFICAR DATOS");
printf("Marca de la moto: ");
gets(mar);
printf("Modelo: ");
gets(mod);
do{
printf("Cilindrada: ");
scanf("%d",&cilin);
if(cilin<50 || cilin>1200){
printf("\nError: la cilindrada debe estar entre 50 y 1200\n\n");
}
}while(cilin<50 || cilin>1200);
if(modificar(moto,mar,mod,cilin)==true){
printf("\nPrecio de la moto actualizado.\n");
printf("");
}else{
printf("\nMoto inexistente.\n");
}
break;





En la funcion
bool modificar(struct motos *moto, char *mar, char *mod, int cilin, float *preu){
int i=0;
while((strcmp(moto->marca,mar)!=0 || strcmp(moto->modelo,mod)!=0 || moto->cilindrada!=cilin) && i<MAX){
i++;
moto++;
}
if(i<MAX){ //se ha salido del bucle porqué se ha encontrado la moto
do{
printf("\nIntroduce el nuevo precio: ");
scanf("%f",&moto->precio);
if(moto->precio<400 ||moto->precio>70000){
printf("\nError: el precio debe ser mayor de 400 €\n\n");
}
}while(moto->precio<400 || moto->precio>70000);
*preu=moto->precio;
return true;
}
else
return false;
}




Aqui vienen mis dudas, la primera es... si te piden que la funcion recibe un array de motos, marca, modelo y cilindrada, porque te preguntan por el precio???? ¬_¬

Según tu
Ahí va:
(Acordaos que habiamos hecho una struct con marca,modelo,cilindrada y precio)

Te están dando marca, modelo y cilindrada de la moto a buscar. Devuelves el precio de dicha moto (struct)
Para empezar aunque no se use "for" si pone "i++" y "moto++" funciona igual que un "for" no? , luego la forma de usar strcmp no la entiendo (se que es para comparar cadenas), se hace strcmp y entre parentesis pone la estructura señalando a marca (este lo habremos rellenado antes, por eso se llama el problema MODIFICAR) y luego mar por separado, diferente a 0, porque diferente a 0? Se supone que marca y mar tienen que coincidir para encontrar la moto.

El resto de comparaciones tampoco las entiendo, a ver si hay alguien que lo entienda.



Muchísimas gracias.

El while es lo que itera. El moto++ es lo mismo que moto=moto+1

Y lo segundo tampoco. Miras e iteras mientras no llegues a la moto buscada.
Cuando la encuentras, sales del bucle.
Fíjate que las comparaciones están en OR.

Repito, deberías abstraerte del código para entender lo que te piden.
Hola.

Con permiso de YonkiKong y para no tener que abrir otro hilo, me gustaría poneros aquí unas dudillas que tengo. Bueno, más concretamente es un ejercicio que nos entró en un examen y ni yo ni mis compañeros hemos conseguido que nos funcione.

El ejercicio consiste en pedir al usuario que introduzca dos cadenas de caracteres y también introduzca la posición a partir de la cual quiere copiar la segunda cadena de caracteres en la primera. Es decir, por ejemplo:

- 1ª cadena de caracteres: Hola que tal

- 2ª cadena de caracteres: Hoy hace calor

- Posición a partir de la cual copiar la segunda en la primera: 3

Solución: HolHoy hace calora que tal

Para ello, se deben utilizar dos funciones: la primera para contar el numero de caracteres que tienen las cadenas y otra para pegar la segunda cadena en la primera a partir de la posición indicada. Los prototipos de las funciones son:

int CONTAR (char [], char [], int *longiA, int *longiB);
void CAMBIAR (char [], char [], int longiA, int longiB);


Pues bien, aunque a priori no me pareció que fuese un ejercicio muy complicado, resulta que no encuentro la forma de que me funcione correctamente, ya que siempre me aparece basura entremedias de las frases. Aquí os dejo el código:

#include <stdio.h>
#include <Windows.h>

int CONTAR (char [], char [], int *longiA, int *longiB);
void CAMBIAR (char [], char [], int longiA, int longiB);

int main()
{
int longiA,longiB;
int n;
char cad1[50];
char cad2[50];

printf ("Introduce la primera frase: ");
gets(cad1);
printf ("\nIntroduce la segunda frase: ");
gets(cad2);

n=CONTAR (cad1,cad2,&longiA,&longiB);
longiA=n;
CAMBIAR (cad1,cad2,longiA,longiB);

printf ("La frase quedaria asi: ");
puts(cad1);

system ("pause");
}

int CONTAR (char cad1[], char cad2[], int *longiA, int *longiB)
{
int i=0;

while (cad1[i]!='\0')
i++;
*longiA=i;
i=0;
while (cad2[i]!='\0')
i++;
*longiB=i;

printf ("\nIntroduce a partir de que posicion quieres que se copie la segunda frase: ");
scanf ("%d",&i);
return i;
}

void CAMBIAR (char cad1[], char cad2[], int n, int longiB)
{
int i,j=0,h;
char aux[30];
i=n;

while (cad1[i]!='\0')
{
aux[j]=cad1[i];
i++;
j++;
}

for (i=n,h=0;i<=longiB;i++,h++)
cad1[i]=cad2[h];

for (i=longiB+n,h=0;i<=(longiB+n+j);i++,h++)
cad1[i]=aux[h];
}



Si me pudieseis echar una mano os estaría muy agradecidos.

Un saludo.
Si te sale basura, es que probablemente tengas un desbordamiento de buffer.
Y veo que utilizas gets, que no controla el tamaño de los strings, así que es muy probable que te esté pasando.

1) No uses gets o controla muy muy bien el tamaño de las cadenas introducidas (vamos, que no uses gets)
2) Controla los tamaños de las cadenas que recorres (sobre todo si usas gets... no uses gets)
3) Controla los tamaños de las cadenas ANTES de unirlas

XD


Para que entiendas lo que te pasa:

void main(){
   char saludo[10];
   printf("introduce saludo\n");
   //el usuario introduce "hola que tal estas yo muy bien y tu"
   gets(saludo);
   printf(saludo);
}
jorcoval escribió:Si te sale basura, es que probablemente tengas un desbordamiento de buffer.
Y veo que utilizas gets, que no controla el tamaño de los strings, así que es muy probable que te esté pasando.

1) No uses gets o controla muy muy bien el tamaño de las cadenas introducidas (vamos, que no uses gets)
2) Controla los tamaños de las cadenas que recorres (sobre todo si usas gets... no uses gets)
3) Controla los tamaños de las cadenas ANTES de unirlas

XD


Para que entiendas lo que te pasa:

void main(){
   char saludo[10];
   printf("introduce saludo\n");
   //el usuario introduce "hola que tal estas yo muy bien y tu"
   gets(saludo);
   printf(saludo);
}


Gracias por tu respuesta jorcoval. El problema es que la única forma que nos han enseñado para coger frases es con gets. Al principio nos dijeron con scanf("%s",cadena), pero eso sólo funcionaba con una palabra, en cuanto había espacios sólo cogía la primera palabra, así que empezamos a usar gets. ¿Qué otra forma podía utilizar para coger cadenas de caracteres y poder controlarlas mejor? Teniendo en cuenta que tampoco nos dejan usar librerías más allá de stdio.h y Windows.h...

Un saludo y gracias de nuevo.
Lo primero que no entiendo es que hace esto en la funcion de contar

printf ("\nIntroduce a partir de que posicion quieres que se copie la segunda frase: ");
scanf ("%d",&i);
return i;


A mi entender forma parte de los valores a introducir por el usuario por lo que iria en el main.

Otra cosa que veo es que si no piden la version mas optimizada, usa mas variables y no reutilices el integer i, no tiene porque ser un problema, pero si tienes libertad, para que complicarse.

Por ultimo, sobre tu forma de cambiar las cadenas, yo lo haria asi, en la cadena aux, que a ser posible la defino del mismo tamaño que las cadenas 1 y 2, pongo un contador y copio los primeros n caracteres, segun haya indicado el usuario en el numero, de la cadena 1, despues copio la cadena 2 entera hasta \0 y por ultimo vuelvo a copiar hasta \0 de la cadena 1, con 2 whiles anidados y varios contadores lo haces facil de una pasada.

Ademas, revisando un poco:

i=n;

while (cad1[i]!='\0')
{
aux[j]=cad1[i];
i++;
j++;
}


Estas copiando caracteres desde la posicion n en aux, es decir, basura post \0, cuando deberias empezar desde la posicion 0 hasta n.

En fin, yo que no me dedico a esto sino a administracion te comento lo que veo ;) . Y un consejo para hacer debug de todo esto, empieza a poner printf en ciertos puntos y realmente iras viendo que vas leyendo, copiando, etc... con programas asi es bastante simple hacer debugging.

Un saludo.
Mistercho escribió:Lo primero que no entiendo es que hace esto en la funcion de contar

printf ("\nIntroduce a partir de que posicion quieres que se copie la segunda frase: ");
scanf ("%d",&i);
return i;


A mi entender forma parte de los valores a introducir por el usuario por lo que iria en el main.


Eso lo puse en la función de contar porque al tener que retornar un valor de tipo int, pues ya aprovechaba y lo metía en la función para no tener que retornar un valor que no me sirviese para nada. Además, me suena que en el main no nos dejaban ponerlo, pero tampoco estoy muy seguro. Aún así, voy a probar poniéndolo en el main como tú dices, a ver si eso por razones que desconozco está dando fallo.

Mistercho escribió:Otra cosa que veo es que si no piden la version mas optimizada, usa mas variables y no reutilices el integer i, no tiene porque ser un problema, pero si tienes libertad, para que complicarse.


Sí, en efecto no nos piden optimizar el código, por lo que en principio podemos declarar las variables que queramos. El problema es que recuerdo que en el examen declaré un montón de variables por si acaso, pero tampoco me funcionó, así que imaginé que eso no influía (realmente no debería influir).

Mistercho escribió:Por ultimo, sobre tu forma de cambiar las cadenas, yo lo haria asi, en la cadena aux, que a ser posible la defino del mismo tamaño que las cadenas 1 y 2, pongo un contador y copio los primeros n caracteres, segun haya indicado el usuario en el numero, de la cadena 1, despues copio la cadena 2 entera hasta \0 y por ultimo vuelvo a copiar hasta \0 de la cadena 1, con 2 whiles anidados y varios contadores lo haces facil de una pasada.


Voy a probar ahora de la forma que dices, a ver si así me va.

Mistercho escribió:Ademas, revisando un poco:

i=n;

while (cad1[i]!='\0')
{
aux[j]=cad1[i];
i++;
j++;
}


Estas copiando caracteres desde la posicion n en aux, es decir, basura post \0, cuando deberias empezar desde la posicion 0 hasta n.

En fin, yo que no me dedico a esto sino a administracion te comento lo que veo ;) . Y un consejo para hacer debug de todo esto, empieza a poner printf en ciertos puntos y realmente iras viendo que vas leyendo, copiando, etc... con programas asi es bastante simple hacer debugging.

Un saludo.


Esta última parte no la he entendido. Mi intención con eso es copiar en la cadena aux todos los elementos de la cadena 1 a partir del n introducido por el usuario. Para luego después copiar la cadena 2 a partir de n en la cadena 1, y luego a partir de ahí pegar la auxiliar en la cadena 1. Aún así, creo que me he liado demasiado y debería haberlo hecho como tu dices, utilizando la auxiliar para resolverlo y ya luego copiar la auxiliar entera en la cadena 1.

Muchas gracias por tus consejos. Voy a probar ahora con lo que me has dicho y te comento.

Un saludo.
35 respuestas