› Foros › Off-Topic › El rincón del eoliano
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 ...
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.
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!!
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.
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.
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.
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.
Por supuesto, un array puede contener structs, lo que normalmente se llama en C punteros a struct
struct ejemplo
{};
//...
struct ejemplo array[100];
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.
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)
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?
http://www.etnassoft.com/biblioteca/
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 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.
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;
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;
}
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
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 funcionbool 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????
Ahí va:
(Acordaos que habiamos hecho una struct con marca,modelo,cilindrada y precio)
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.
#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];
}
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
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);
}
printf ("\nIntroduce a partir de que posicion quieres que se copie la segunda frase: ");
scanf ("%d",&i);
return i;
i=n;
while (cad1[i]!='\0')
{
aux[j]=cad1[i];
i++;
j++;
}
Mistercho escribió:Lo primero que no entiendo es que hace esto en la funcion de contarprintf ("\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.
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.
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.
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.