Título: Reto Universidad [C++]. Publicado por: bigfu en 20 Julio 2011, 13:04 pm Hola a todos, estoy estudiando este verano la asignatura de Fundamentos de la Programación para presentarme en septiembre, y se me ocurrió la idea de plantear aqui los ejercicios de cada tema (cada cierto tiempo) y asi poder comparar mis soluciones con las vuestras (no estoy pidiendo que me hagais los ejercicios), para ver si hubiese podido simplificar más el código y aprender un poco de vosotros; a la par de que al ser ejercicios de una asignatura de fundamentos, va a venir muy bien para todos aquellos que quieran aprender/estén aprendiendo C++.
La dificultad de los ejercicios se irá incrementando conforme vaya avanzando en los temas (espero que un tema cada dos días como mucho xD), y diré con cada ristra de ejercicios que está y que no está permitido utilizar, ya que puede ser anterior al tema donde se dan los vectores o recursividad, por poner un ejemplo. Si alguien está interesado, podría pasarle por privado los pdf's de cada tema o del tema en concreto. Citar Tema 1 En este tema se hace una introducción a C++, se ven los tipos de datos simples, las constantes, variables y asignaciones, la entrada y salida básicas, el flujo de control, las expresiones lógicas o booleanas y las estructuras de selección (if y switch) e iteración (while, do-while, for). También se hace mención al control de errores y excepciones, pero no pone mucho interés en ello, se puede obviar xD Ejercicios Tema 1 1.- Confecciona un bucle que lea de teclado un texto carácter a carácter hasta localizar un punto, y que al final dé como salida el número de comas encontradas, y el número de caracteres leídos. 2.- Diseña un algoritmo que determine si la cadena 'abc' aparece en una sucesión de caracteres cuyo final viene dado por un punto. 3.- Diseña un algoritmo que lea un número n por teclado y calcule el n-ésimo número de la serie de Fibonacci. Los dos primeros números de esta serie son el cero y el uno, y a partir de éstos cada número se calcula realizando la suma de los dos anteriores. 4.- Escribe un algoritmo que encuentre el mayor, el menor y la media aritmética de una colección de N números leídos por el teclado donde N es el primero de los números. 5.- Escribe un algoritmo que lea una lista de números enteros terminada en 0, y que encuentre y escriba en la pantalla la posición de la primera y de la última ocurrencia del número 12 dentro de la lista. Si el número 12 no está en la lista, el algoritmo debería escribir 0. Por ejemplo, si el octavo número de la lista es el único 12, entonces 8 sería la primera y la última posición de las ocurrencias de 12. 6.- Desarrolla un algoritmo para el siguiente juego: El usuario introduce un límite inferior, un límite superior y piensa un número en ese rango. El ordenador tiene que acertarlo. Para ello el ordenador propone un número y el usuario responde con >, < o = (correspondiente a acertado y el programa acaba). Si la respuesta es > o <, el ordenador propondrá otro número hasta que lo acierte. (Si mal no recuerdo, para este ejercicio, el profesor indicó que tanto el usuario como el ordenador, somos nosotros, sino sería más complicado hacerlo con lo visto hasta ahora XD) 7.- Desarrollar un algoritmo para el siguiente juego: El usuario introduce un número natural n que representa a n objetos. La máquina decide quien empieza y alternativamente, el usuario y la máquina retiran cada uno 1, 2 o 3 objetos (es decir, elige restar 1, 2 o 3 a n). El que retira el último objeto pierde. En las condiciones del problema, es posible desarrollar un algoritmo para que siempre gane la máquina. Construir tal algoritmo. Citar Tema 2 En este tema se ve el diseño descendente, procedimientos y funciones (definición y declaración, llamada, parámetros reales y formales, paso de parámetros por valor y por referencia, interfaz, criterios de modularización, variables locales y globales y precondiciones y postcondiciones) y recursividad. Lo mismo que en el tema anterior, si hay alguien interesado en el pdf, que lo pida y se lo paso. Ejercicios Tema 2 1.- Escribe un programa que lea un número natural N por teclado y dibuje un triángulo de asteriscos con base y altura N. Por ejemplo, si N=5 debería dibujar: * * * * * * * * * * * * * * * 2.- Escribe un programa que tome como entrada desde teclado dos números naturales (mayores que cero) "N" e "i", e imprima en pantalla el dígito que ocupa la posición i-ésima del número N. Si i es mayor que el número de dígitos de N, se escribirá en pantalla -1. Por ejemplo, para N=25064 e i=2, el resultado es el dígito 6, y para i=7, el resultado es -1. 3.- Escribe un programa que acepte como entrada desde teclado un número natural mayor que cero y dé como salida el resultado de sumar dos a dos los dígitos que aparecen en posiciones simétricas respecto al dígito central dentro del número dado como entrada. Por ejemplo: para el número: 2354869 la salida es: 2+9=11, 3+6=9, 5+8=13, 4 para el número: 6582 la salida es: 6+2=8, 8+5=13 4.- Dada una sucesión, de longitud indeterminada, de ceros y unos, construir un programa que permita calcular el tamaño de la mayor sucesión ordenada de menor a mayor. La sucesión se lee desde teclado, y el final viene dado por el número 2. 5.- Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que: 1 <= h <= n y además a1<...ah-1 < ah > ah+1 > ...an Por ejemplo 24, 13, 6, 15, 50 sería un valle. Dada una secuencia de enteros terminada en cero (0) que como mínimo contiene una montaña y un valle (suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles), diseña un programa que calcule la longitud de la montaña y el valle más largos. 6.- El máximo común divisor (mcd) de dos números naturales p y q es el mayor entero d que divide a ambos. Un algoritmo muy conocido para calcularlo es el de Euclides. Éste utiliza dos variables, que contienen inicialmente a cada uno de los números, y trata de hacer que su contenido sea el mismo. Para ello, irá restando la menor a la mayor hasta que ambas contengan el mismo valor. En dicho momento, el valor obtenido en cualquiera de ellas es el máximo común divisor de los dos números iniciales. Por ejemplo, si P=18 y Q=12, el algoritmo hará que P y Q vayan tomando los siguientes valores: Inicialmente P==18 y Q==12 (P>Q => P=P-Q) Después P==6 y Q==12 (Q>P => Q=Q-P) Después P==6 y Q==6 (P==Q => El mcd es 6) Diseña el algoritmo anterior siguiendo un enfoque recursivo: unsigned mcd(unsigned P, unsigned Q) 7.- Diseña un procedimiento recursivo que lea una secuencia de caracteres de longitud arbitraria terminada en un punto, y la imprima en orden inverso. El procedimiento no tiene parámetros. Citar Tema 3 En este tema se ven los tipos de datos estructurados: Registros, arrays y cadenas de caracteres (tipo string) y la resolución de problemas usando tipos estructurados. ESTE TEMA ES EL ÚLTIMO DE LA ASIGNATURA. Ejercicios Tema 3 1.- Diseña un algoritmo que permita invertir el contenido de un array. El algoritmo no podrá utilizar arrays auxiliares. Impleméntalo de forma iterativa y recursiva. Array Original: 24 12 45 90 7 9 15 Array Invertido: 15 9 7 90 45 12 24 2.- Escriba un programa que efectúe la conversión de un número natural en base 10 a otra determinada base, sabiendo que el resultado no sobrepasará los 50 dígitos. El usuario introducirá primero el número en base 10 y después la base a la que convertirlo (el programa debe asegurarse de que la base no sea ni menor de 2 ni mayor de 9) 3.- Diseña un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la frecuencia con la que aparece cada una de las letras del texto. 4.- Dados los siguientes tipos (para una constante MAX cualquiera): Código a) La moda de un array de caracteres es el carácter del array que se repite más frecuentemente. Si varios caracteres se repiten con la misma frecuencia máxima, entonces no hay moda. Escribe un procedimiento con tres parámetros. El primero es de entrada para recibir un registro de tipo Vector que contiene el array datos con tam caracteres. El segundo parámetro es de salida e indicará si se ha encontrado la moda en el array o no. El tercer parámetro es de salida y será el carácter que representa la moda (si es que existe). b) Diseña una función booleana que dados dos registros de tipo Vector como parámetros devuelva TRUE si son iguales y FALSE en otro caso. Dos vectores son iguales si contienen los mismos elementos y en el mismo orden relativo, suponiendo que el primer elemento sigue al último. Por ejemplo, si los arrays fueran: ['A', 'C', 'D', 'F', 'E'] ['D', F', 'E', 'A', 'C'] la función devolvería TRUE. Supón, además, que cada carácter aparece a lo sumo una vez. c) Diseña un procedimiento que tome como parámetros de entrada dos vectores con los arrays ordenados y devuelva (con un perámetro de salida) el vector resultado de realizar la mezcla ordenada de los dos arrays contenidos en los vectores de entrada. 5.- Los alumnos de informática desean celebrar una comida un día del presente mes en el que puedan acudir todos. Se pide realizar un algoritmo que recoja de cada alumno los días que le vendría bien ir a la comida, e imprima las fechas concordantes para todos los alumnos. Los datos se introducirán por teclado, y cada alumno escribirá una única línea con los números de los días libres separados por espacios. 6.- Se tiene un array de enteros. Obtén otro de forma que el contenido de cada elemento del nuevo array sea un índice que nos indique de menor a mayor los valores del array de enteros. El array original no se podrá modificar, ni se puede hacer copia del mismo. Por ejemplo: [10,5,-7,0,12] ---> [2,3,1,0,4] 7.- La distancia entre dos letras en un texto es el número de letras que aparecen en el texto entre las dos letras indicadas. Diseñe un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la máxima distancia entre cada par de letras repetidas. Aquellas letras que no se repitan no aparecerán en la salida. Por ejemplo: - Texto de entrada: ABEADDGLAKE. - Salida: · Distancia entre A: 4 · Distancia entre D: 0 · Distancia entre E: 7 8.- Diseña un algoritmo para calcular la suma de los elementos de la diagonal principal de una matriz cuadrada. 9.- Una matriz tiene un punto silla en una de sus componentes, si ese componente es el mayor valor de su columna y el menor de su fila. Diseña un algoritmo que recogiendo de teclado los componentes de una matriz cuadrada de enteros de hasta un máximo de 10x10, muestre en la pantalla las coordenadas de todos sus puntos silla. 10.- Diseñe un algoritmo que lea de teclado un texto y muestre un listado por pantalla de todas las palabras del texto que comiencen por ciertas iniciales. Dichas iniciales serán las letras que formen la primera palabra del texto. NOTAS: - El texto contiene un número indefinido de palabras. - El texto termina con la palabra FIN - Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas) - El carácter separador de palabras es el espacio en blanco. 11.- Diseñe un algoritmo que lea de teclado un patrón (una cadena de caracteres) y un texto, y dé como resultado las palabras del texto que contenga a dicho patrón. En la salida no habrá palabras repetidas. Ejemplo: ·Patrón: RE ·Texto: CREO QUE IREMOS A LA DIRECCION QUE NOS DIERON AUNQUE PIENSO QUE DICHA DIRECCION NO ES CORRECTA FIN ·Salida: CREO IREMOS DIRECCION CORRECTA NOTAS: - El texto contiene un número indefinido de palabras. - El texto termina con la palabra FIN. - Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas). - El caracter separador de palabras es el espacio en blanco. - En el texto aparecerán un número máximo MAX_PAL_DIST (una constante) de palabras distintas. 12.- Una farmacia desea almacenar sus productos (TProducto) en una estructura. De cada producto hay que almacenar la siguiente información: código (unsigned), nombre (string), precio (float), fecha de caducidad (definir un tipo registro para la fecha). Diseña la estructura de datos (TFarmacia) para almacenar un máximo de MAX (una constante) productos y realiza los siguientes subalgoritmos: - void LeerProducto(TProducto& p) - void EscribirProducto(const TProducto& p) - void InicializarFarmacia(TFarmacia& f) void InsertarProducto(TFarmacia& f, const TProducto& p) - void BorrarProducto(TFarmacia& f, unsigned codigo) - void BuscarProductoCodigo(const TFarmacia& f, unsigned codigo, bool& encontrado, TProducto& p) - void ListarFarmacia(const TFarmacia& f) Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 21 Julio 2011, 22:44 pm EDIT: Pongo aqui las soluciones y asi "despejo" un poco el primer post.
Citar Soluciones Tema 1 Ejercicio 1 Código
Ejercicio 2 Código
Ejercicio 3 Código
Ejercicio 4 Código
Ejercicio 5 Código
Ejercicio 6 Código NOTA: Me ha parecido más interesante utilizar la función rand() y hacerlo más acorde al enunciado del ejercicio. Se admiten sugerencias de mejora xD Ejercicio 7 Código
Citar Soluciones Tema 2 Ejercicio 1 Código
Ejercicio 2 Código
Ejercicio 3 Código
Ejercicio 4 Código
Ejercicio 5 Código
Ejercicio 6 Código
Ejercicio 7 Código
Citar Soluciones Tema 3 Ejercicio 1 Código
Ejercicio 2 Código
Ejercicio 3 Código
Ejercicio 4 Código a) Código b) Código c) Código
Ejercicio 5 Código
Ejercicio 6 Código
Ejercicio 7 Código
Ejercicio 8 Código
Ejercicio 9 Código
Ejercicio 10 Código
Ejercicio 11 Código
Ejercicio 12 Código
Título: Re: Reto Universidad [C++]. Publicado por: dakomt en 22 Julio 2011, 04:34 am N = 1 + 4K
N = 2 + 4K N = 3 + 4K N = 4 + 4K Te doy mejor esa pista... tu sabras que hacer con ella ;D Título: Re: Reto Universidad [C++]. Publicado por: KaL3o en 22 Julio 2011, 09:01 am bigfu te estas complicando con tantos case :p
Vi el enunciado y dije a probar parece complicado... de alli al papel antes que al codigo, y despues de hacer unos matachos (dibujos mal hechos) encontre la respuesta. La solución esta en que tu dominas quien empieza. Hay ciertos numeros donde el usuario debe empezar primero... ahh me aburri de tanto escribir y termine haciendo el codigo jajajaja Código
Salu2 ;) Título: Re: Reto Universidad [C++]. Publicado por: satu en 22 Julio 2011, 11:54 am Hola
Aquí lo tienes Código
Saludos Título: Re: Reto Universidad [C++]. Publicado por: KaL3o en 22 Julio 2011, 12:55 pm satu brother creo que no consideraste que la maquina siempre debe ganar
En las condiciones del problema, es posible desarrollar un algoritmo para que siempre gane la máquina. Construir tal algoritmo. Y tampoco pusiste restricción a que el usuario solo puede descontar de 1 a 3 objetosSalu2 ;) Título: Re: Reto Universidad [C++]. Publicado por: satu en 22 Julio 2011, 13:22 pm satu brother creo que no consideraste que la maquina siempre debe ganar Es cierto, no me fijé en eso Y tampoco pusiste restricción a que el usuario solo puede descontar de 1 a 3 objetos Esto ya está corregidoGracias por la corrección Saludos Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 22 Julio 2011, 13:34 pm Muchas gracias a los 3 por las respuestas, se agradece.
Sería ya mucho pedir que explicárais como lo habéis hecho?? :rolleyes: es que entiendo que es lo que hacen los programas, pero lo que no entiendo es el por qué. Llevo un rato dándole vueltas a las 2 soluciones y no consigo comprender algunas cosas. Muchas gracias, de verdad. EDIT: Vale, creo que el código de KaL3o lo medio entiendo ya. Según lo que he entendido, habría unos "casos base", que serían los siguientes: cuando el número de objetos sea 4, 3, 2 o 1. En el caso de que haya inicialmente un solo objeto, elegimos que empiece el usuario, caso en el que perdería. Por lo tanto, la computadora siempre debe restar de tal forma que deje un número de objetos cuyo resto sea 1 al dividir entre 4, de tal forma que al forzar ese resultado, el usuario llegue a ese único objeto final. El código de satu me cuesta entenderlo un poco más, me pierdo con el sran() que utiliza... Muchas gracias de nuevo. Título: Re: Reto Universidad [C++]. Publicado por: satu en 22 Julio 2011, 14:06 pm Hola
El srand se utiliza para la generación de números aleatorios, y después rand calcula el número aleatorio. Yo lo utilizo para que el turno al principio sea aleatorio y después lo utilizo para que la máquina reste los objetos aleatoriamente, claro que como dijo antes KaL3o no tiene en cuenta el número de objetos restantes para poder ganar. Saludos Título: Re: Reto Universidad [C++]. Publicado por: KaL3o en 22 Julio 2011, 14:06 pm Claro... mas importante aun que el codigo es la logica :)
Alli es cuando uno se acuerda de los profes cuando le decian a uno Antes de ponerse a hacer el codigo, dibujen, imaginen y entiendan la logica Bien como te decia para que la maquina siempre gane, se necesita tener en cuenta el turno del jugador. A lo que yo me puse a dibujar :p (subiria la imagen de mis matachos, pero el escaner esta ocupado) mmm... vaya es mas complicado explicarlo que dibujarlo jajajaja Necesitas qeu el usuario juegue en determinados numeros, como cuando solo hay un objeto. estos numeros son 1, 5, 9, 13... te das cuenta el incremento es de 4. Cuando tomas todos estos numeros y los divides entre 4 siempre te va a quedar de residuo 1 (tambien conocido como el modulo) Lo que tienes que hacer es que el usuario solo pueda jugar cuando esten esas cantidades de numeros. digamos que se elige el numero 12 para jugar, como el 12%4=0, entonces debo hacer que la maquina juegue primero y me convierta esos 12 objetos en 9 (puesto que 9%4=1, y el 9 es menor que 12) Ahora el jugador puede restar 1,2 o 3. Si el resta 1 quedara en 8, y a nosotros nos conviene que el siguiente numero sea 5, asi que el computaador restara 3. Si el user resta 2 nosotros restaremos 2 para que la cantidad de objetos sea 5, y si el user resta 3 la maquina debera restar 1 para que quede el numero que nos conviene, el 5. (cuando restamos estamos completando 4) Biena ahora en el 5 juega el usuario por lo que puede restar 1, 2 o 3, nostros (la maquina) debera completar la resta para restar 4, asi el usuario quedara con la ultima ficha. En si lo que hay es que forzar al usuario a jugar cuando la cantidad de objetos divida entre 4 tenga por residuo 1. Y despues de ello completar la resta de 4. Trate de explicar lo mejor que pude. Si luego me acuerdo subo mis matachos que son mas entendibles :p Salu2 ;) En el codigo de satu el srand() es para generar numeros aleatorios, ya la linea completa esta asignando a resta un numero entre 1 y 3 Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 22 Julio 2011, 14:19 pm Hola El srand se utiliza para la generación de números aleatorios, y después rand calcula el número aleatorio. Yo lo utilizo para que el turno al principio sea aleatorio y después lo utilizo para que la máquina reste los objetos aleatoriamente, claro que como dijo antes KaL3o no tiene en cuenta el número de objetos restantes para poder ganar. Saludos Ok, muchas gracias por la explicación. Una pregunta referente a esto, que diferencia hay entre usar el srand() y no usarlo?? Es que yo en el ejercicio 6 (en el primer post está el código) utilizo directamente el rand, sin el srand, y genera los números aleatorios... Claro... mas importante aun que el codigo es la logica :) Alli es cuando uno se acuerda de los profes cuando le decian a uno Antes de ponerse a hacer el codigo, dibujen, imaginen y entiendan la logica Bien como te decia para que la maquina siempre gane, se necesita tener en cuenta el turno del jugador. A lo que yo me puse a dibujar :p (subiria la imagen de mis matachos, pero el escaner esta ocupado) mmm... vaya es mas complicado explicarlo que dibujarlo jajajaja Necesitas qeu el usuario juegue en determinados numeros, como cuando solo hay un objeto. estos numeros son 1, 5, 9, 13... te das cuenta el incremento es de 4. Cuando tomas todos estos numeros y los divides entre 4 siempre te va a quedar de residuo 1 (tambien conocido como el modulo) Lo que tienes que hacer es que el usuario solo pueda jugar cuando esten esas cantidades de numeros. digamos que se elige el numero 12 para jugar, como el 12%4=0, entonces debo hacer que la maquina juegue primero y me convierta esos 12 objetos en 9 (puesto que 9%4=1, y el 9 es menor que 12) Ahora el jugador puede restar 1,2 o 3. Si el resta 1 quedara en 8, y a nosotros nos conviene que el siguiente numero sea 5, asi que el computaador restara 3. Si el user resta 2 nosotros restaremos 2 para que la cantidad de objetos sea 5, y si el user resta 3 la maquina debera restar 1 para que quede el numero que nos conviene, el 5. (cuando restamos estamos completando 4) Biena ahora en el 5 juega el usuario por lo que puede restar 1, 2 o 3, nostros (la maquina) debera completar la resta para restar 4, asi el usuario quedara con la ultima ficha. En si lo que hay es que forzar al usuario a jugar cuando la cantidad de objetos divida entre 4 tenga por residuo 1. Y despues de ello completar la resta de 4. Trate de explicar lo mejor que pude. Si luego me acuerdo subo mis matachos que son mas entendibles :p Salu2 ;) En el codigo de satu el srand() es para generar numeros aleatorios, ya la linea completa esta asignando a resta un numero entre 1 y 3 Muchas gracias por la explicación, es más o menos lo que había entendido. Ahora lo que me falta es que se me ocurra a mi ese tipo de soluciones xD Gracias a ambos por vuestra paciencia. Título: Re: Reto Universidad [C++]. Publicado por: KaL3o en 22 Julio 2011, 14:32 pm el srand es para inicializar la semilla randomica... palabras mas palabras menos es para que cuando utilices el rand repetidas ocasiones te arroje resultados diferentes.
En el caso de tu 6to ejercicio te funciona porque estas cambiando los limites, el superior y el inferior. Solo por esa razon te da resultados distintos. Pero si no cambiases los limites entonces el numero aleatorio seria siempre el mismo. Por eso la necesidad de inicializar la semilla randomica. Título: Re: Reto Universidad [C++]. Publicado por: ]_HQH_[ en 22 Julio 2011, 14:50 pm Una forma comun de inicializar la semilla es con el tiempo
Aqui tienes un ejemplo que sacaria numeros aleatorios entre 1 y 10 Código: #include<stdlib.h> Título: Re: Reto Universidad [C++]. Publicado por: satu en 22 Julio 2011, 14:55 pm num=1+rand()%(11-1); ==> num=1+rand()%10; :silbar: :silbar:
Título: Re: Reto Universidad [C++]. Publicado por: dakomt en 22 Julio 2011, 15:45 pm Desde luego............. para que poneis códigos? dejarle pensar...... asi no aprende uno
Título: Re: Reto Universidad [C++]. Publicado por: dakomt en 22 Julio 2011, 16:35 pm Pero bueno como el daño ya esta hecho.... aqui teneis otra version más eficiente xD
Código:
Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 22 Julio 2011, 19:19 pm Pero bueno como el daño ya esta hecho.... aqui teneis otra version más eficiente xD Código:
Muchas gracias por tu aporte. Parece que no, pero estoy aprendiendo muchas cosas que no sabía gracias a los códigos de los compañeros. Por cierto, podrías indicarme qué es lo que hace esta sentencia?? resto = modu==0? 3:modu%2 +1; Puede ser que sea una especie de if o alguna estructura de selección similar donde se evalúe el valor de la expresión lógica modu==0 y en caso de ser true le asigno 3 a resto y en caso contrario modu%2+1?? Gracias Voy a intentar hacer mi propio código del ejercicio, a ver si soy capaz de implementarlo con lo aprendido. Más tarde actualizaré el post con el contenido del tema 2, por si hay alguien que esté mirando los ejercicios... xD Muchas gracias a todos por la ayuda. Título: Re: Reto Universidad [C++]. Publicado por: dakomt en 22 Julio 2011, 19:28 pm Citar Muchas gracias por tu aporte De nada hombre. Citar Por cierto, podrías indicarme qué es lo que hace esta sentencia?? resto = modu==0? 3:modu%2 +1; Puede ser que sea una especie de if o alguna estructura de selección similar donde se evalúe el valor de la expresión lógica modu==0 y en caso de ser true le asigno 3 a resto y en caso contrario modu%2+1?? Gracias Correcto, es una forma abreviada del if. Tal vez haga el código más ilegible pero manías que tiene uno :-\ Ánimo y suerte con los demás ejercicios. Título: Re: Reto Universidad [C++]. Publicado por: ]_HQH_[ en 22 Julio 2011, 23:31 pm satu, en el ejemplo anterior el 11 -1 lo he puesto para que se entendiera de donde salia.
Por supuesto, el pre-procesador ese calculo lo optimiza :P Título: Re: Reto Universidad [C++]. Publicado por: Danyel_Casvill en 23 Julio 2011, 05:06 am Hola, emm, no entiendo muy bien, que debe hacer el programa 7?
Esto hice xD Código Bueno no se, ya se que no era lo que se necesitaba pero exactamente que debe hacer el programa? Gracias, saludos ^^ Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 23 Julio 2011, 13:51 pm El ejercicio 7 es un juego, en el que juegan el humano contra el ordenador. El ordenador decide quien empieza y tienen que ir restando 1, 2 o 3 en turnos alternos hasta que ya no haya más objetos que coger. El que coge el último objeto, pierde.
Pues bien, con esas condiciones, tienes que desarrollar un algoritmo en el que SIEMPRE gane la máquina. Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 24 Julio 2011, 16:46 pm Ya está añadido el contenido del tema 2 y los ejercicios correspondientes. Mirar primer post.
Título: Re: Reto Universidad [C++]. Publicado por: .mokk. en 28 Julio 2011, 00:54 am Código
El segundo no lo entiendo: Citar N=25064 e i=2, el resultado es el dígito 6, y para i=7, el resultado es -1. Porque el resultado seria 6 si "i" se encuentra en la posicion 0 ? o como?Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 28 Julio 2011, 21:13 pm El segundo no lo entiendo:Porque el resultado seria 6 si "i" se encuentra en la posicion 0 ? o como? El ejercicio pide que introduzcamos un numero (N) y una posición (i). Por tanto, fijándonos en el ejemplo, vemos que N=25064 e i=2, por lo que el resultado es 6. i es la posición en el número, empezando desde la derecha (i=1->resultado=4; i=3->resultado = 0). No sé si me he explicado bien... Por cierto, le acabo de echar un vistazo a tu código del triángulo. Aunque en el ejercicio ponga de ejemplo N=5, el código debe realizarse para cualquier número, par o impar. Es que he visto que solo lo construye para los número impares ;) Y otra cosa, la altura es igual a N. Según tu código, la altura es N/2. Gracias por intentarlo y postearlo, te animo a que le eches otro vistazo al código anterior y te animes con el ejercicio 2 :D Título: Re: Reto Universidad [C++]. Publicado por: ghastlyX en 28 Julio 2011, 22:38 pm Algunos de los ejercicios del tema 2 te han quedado muy largos y poco simples, suponiendo que sean correctos, puesto que no los he mirado todos. Te pongo soluciones alternativas más cortas y simples, por lo menos a mi parecer.
Código
Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 28 Julio 2011, 23:53 pm Algunos de los ejercicios del tema 2 te han quedado muy largos y poco simples, suponiendo que sean correctos, puesto que no los he mirado todos. Te pongo soluciones alternativas más cortas y simples, por lo menos a mi parecer. Código
Muchas gracias por las sugerencias, pero el problema es que estoy haciendo los ejercicios acorde a lo que llevo visto hasta ahora, por lo que, por ejemplo, aún no podría utilizar variables de tipo string. Pero me vienen muy bien tus soluciones para volver a comparar los ejercicios cuando haya dado todo el temario. Reconozco que mi principal fallo es no saber hacer los algoritmos más cortos y eficientes, pero estoy trabajando en ello (aunque de todas formas solo me piden que funcionen, pero me convendría aprender a simplificar). gracias! Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 29 Julio 2011, 18:57 pm Compis, me he atascado con el ejercicio que me falta, no consigo verlo sin utilizar arrays. Me dais una pista (no me pongáis el código, por favor) para ver si lo puedo sacar?? Lo único que se me ocurre es un código larguísimo y que no tengo claro que funcione bien y no sé muy bien por donde meterle mano...
Citar Ejercicio 5: Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que: 1 <= h <= n y además a1<...ah-1 < ah > ah+1 >...an. Definimos la longitud de una montaña como el número de enteros que la forman. Por ejemplo la sucesión -7,-1,6,21,15 es una montaña de longitud 5. Definimos un valle de la misma forma que una montaña pero cambiando el signo de las desigualdades de la definición anterior: a1>...ah-1 > ah < ah+1 <...an. Por ejemplo, 24, 13, 6, 15, 50 sería un valle. Dada una secuencia de enteros terminada en cero que como mínimo contiene una montaña y un valle (suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles), diseña un programa que calcule la longitud de la montaña y el valle más largos. Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 1 Agosto 2011, 16:18 pm Al final lo conseguí hacer, me ha costado un poco pero lo he conseguido. Ahora, no me gusta la forma en que lo he resuelto. Me ha salido un código bastante lioso, pero es que no me salía otra forma de hacerlo.
Código
Si pudiérais darme alguna pista o consejo para intentar simplificarlo un poco, os lo agradecería :D Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 5 Agosto 2011, 14:34 pm Primer post actualizado con los ejercicios del tema 3 (último tema de la asignatura). Estar tarde pondré las soluciones de los 4 o 5 primeros ejercicios, que ya los tengo.
Saludos! Título: Re: Reto Universidad [C++]. Publicado por: PiroskY en 5 Agosto 2011, 19:03 pm No podes usar memoria dinámica para ese ultimo?
Me parece que seria mucho mas fácil y limpio si podes buscar las cosas una vez que tenes todos los números. Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 5 Agosto 2011, 21:29 pm No podes usar memoria dinámica para ese ultimo? Me parece que seria mucho mas fácil y limpio si podes buscar las cosas una vez que tenes todos los números. No, ese ejercicio pertenece al tema 2 y solo se había visto tipos de datos simples, estructuras de selección, procedimientos y funciones y recursividad. Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 8 Agosto 2011, 13:58 pm Citar 9.- Una matriz tiene un punto silla en una de sus componentes, si ese componente es el mayor valor de su columna y el menor de su fila. Diseña un algoritmo que recogiendo de teclado los componentes de una matriz cuadrada de enteros de hasta un máximo de 10x10, muestre en la pantalla las coordenadas de todos sus puntos silla. Tengo una duda con este ejercicio, no especifica que pasa si el mayor de la columna y/o el menor de la fila están repetidos. ¿Debería considerarlos también como posibles puntos sillas o solo puede haber como máximo uno por fila/columna? Título: Re: Reto Universidad [C++]. Publicado por: PiroskY en 8 Agosto 2011, 18:44 pm Yo hice hace un tiempo algo similar, y lo que hice fue pensar que no había números repetidos.
Pero creo que tampoco hay que modificar muchas cosas si ya tenes el código hecho. Vos podes elegir: Que haya punto si solo hay un único máximo y mínimo. Que sean posibles puntos todos los max/min repetidos(si cumplen con la condición) Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 8 Agosto 2011, 22:51 pm Muchas gracias por la respuesta, creo que lo voy a hacer sin numeros repetidos, es decir, si el mayor o el menor esta repetido, no puede haber punto silla, me parece más lógico que lo otro :)
EDIT: Al final lo he resuelto para numeros repetidos. A la hora de hacerlo me ha parecido más logico el que pudiese tener varios puntos sillas en una misma fila que no escoger ninguno de los menores repetidos (y lo mismo para las columnas). Aqui dejo el codigo, escucho sugerencias para simplificarlo/hacerlo más eficiente xD Código
Título: Re: Reto Universidad [C++]. Publicado por: PiroskY en 9 Agosto 2011, 21:30 pm Acá te dejo el código que había hecho yo, debe estar bastante feo, lo hice hace bastante.
Cargar por teclado una matriz de números enteros (el rango lo debe determinar el usuario) e informar si posee o no punto de ensilladura. Código
Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 11 Agosto 2011, 13:40 pm Ya que estoy aprendiendo a programar me he puesto a hacerlos, pero tengo una pregunta, ¿Seguro que el código del primer ejercicio está bien?
Código: #include <iostream> Yo lo he hecho así: Código: #include <iostream> Y más o menos me funciona, excepto si meto acentos o textos muy largos o sin punto. Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 11 Agosto 2011, 14:00 pm Repe
Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 11 Agosto 2011, 14:21 pm Ya que estoy aprendiendo a programar me he puesto a hacerlos, pero tengo una pregunta, ¿Seguro que el código del primer ejercicio está bien? Código: #include <iostream> Yo lo he hecho así: Código: #include <iostream> Y más o menos me funciona, excepto si meto acentos o textos muy largos o sin punto. El código está bien, de esa forma puedes escribir todo lo que quieras sin el problema que te ocurre a ti de los textos muy largos (ya que tu tienes definida una cadena de caracteres de tamaño 200, si te pasas de los 200 te va a dar error). El tema de las tildes es debido a que C++ toma los caracteres de la tabla ASCII (o eso tengo entendido yo), al igual que con la 'ñ', que tampoco está en la tabla ASCII. Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 11 Agosto 2011, 16:02 pm El código está bien, de esa forma puedes escribir todo lo que quieras sin el problema que te ocurre a ti de los textos muy largos (ya que tu tienes definida una cadena de caracteres de tamaño 200, si te pasas de los 200 te va a dar error). El tema de las tildes es debido a que C++ toma los caracteres de la tabla ASCII (o eso tengo entendido yo), al igual que con la 'ñ', que tampoco está en la tabla ASCII. Eso es lo que me ha parecido al leer tu código, lo que pasa es que no conocía esa función, de todas formas he preguntado por que al compilar tu código y ejecutarlo meto texto y cuando pulso intro se cierra. Lo de las tildes creo que se puede arreglar convirtiendo las cadenas a unicode con una L o algo así pero no se como iba, lo vi en unos tutoriales de OpenGL. Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 11 Agosto 2011, 17:20 pm Eso es lo que me ha parecido al leer tu código, lo que pasa es que no conocía esa función, de todas formas he preguntado por que al compilar tu código y ejecutarlo meto texto y cuando pulso intro se cierra. Lo de las tildes creo que se puede arreglar convirtiendo las cadenas a unicode con una L o algo así pero no se como iba, lo vi en unos tutoriales de OpenGL. ¿qué IDE estás usando? Yo lo acabo de comprobar y va bien. Si al ejecutarlo te sale una ventana tipo MS-DOS, lo que seguramente pase es que se ejecute bien pero se cierra justo al terminar de hacerlo, sin dar tiempo a mostrar el resultado, de ahi que parezca que se cierra de forma inesperada. Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 11 Agosto 2011, 18:04 pm ¿qué IDE estás usando? Yo lo acabo de comprobar y va bien. Si al ejecutarlo te sale una ventana tipo MS-DOS, lo que seguramente pase es que se ejecute bien pero se cierra justo al terminar de hacerlo, sin dar tiempo a mostrar el resultado, de ahi que parezca que se cierra de forma inesperada. Probablemente sea eso, aunque de todas formas en el ejercicio decía de hacer un bucle, habría que añadir un while. Uso el Visual C++ 2010 Express. Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 11 Agosto 2011, 18:10 pm Probablemente sea eso, aunque de todas formas en el ejercicio decía de hacer un bucle, habría que añadir un while. Uso el Visual C++ 2010 Express. Tanto la estructura while como la do-while son iterativas (bucles), al igual que la estructura for. Asi que puedes hacerlas con la estructura que prefieras, aunque la estructura for se usa más en los casos en los que conoces el número de iteraciones, pero creo que la puedes "transformar" y usarlas como las otras dos. Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 12 Agosto 2011, 14:44 pm Tanto la estructura while como la do-while son iterativas (bucles), al igual que la estructura for. Asi que puedes hacerlas con la estructura que prefieras, aunque la estructura for se usa más en los casos en los que conoces el número de iteraciones, pero creo que la puedes "transformar" y usarlas como las otras dos. Había leído mal el enunciado xD, pensaba que el programa tenía que ejecutarse en bucle, no sólo tener un bucle que vaya leyendo caracteres. PD: He llegado hasta el ejercicio 6, creo que es un método más rápido y sencillo, a ver que os parece (el Sleep está sólo para que de tiempo a ver el resultado, no se si sería necesario pero creo que no entra en el tema del ejercicio): Citar // 6.- Desarrolla un algoritmo para el siguiente juego: // El usuario introduce un límite inferior, un límite superior y piensa un número en ese rango. // El ordenador tiene que acertarlo. Para ello el ordenador propone un número y el usuario responde // con >, < o = (correspondiente a acertado y el programa acaba). Si la respuesta es > o <, el ordenador // propondrá otro número hasta que lo acierte. // (Si mal no recuerdo, para este ejercicio, el profesor indicó que tanto el usuario como el ordenador, // somos nosotros, sino sería más complicado hacerlo con lo visto hasta ahora XD) #include <iostream> using namespace std; #include <Windows.h> int main() { int liminf=0, limsup=0, num=0, numsuger=0; bool final = false; char respuesta; cout << "Piense en un número entre un limite inferior y uno superior." << endl; cout << "Introduzca el limite inferior y pulse intro: "; cin >> liminf; cout << "Introduzca el limite superior y pulse intro: "; cin >> limsup; while (final == false) { numsuger= (limsup+liminf)/2; cout << "El numero es " << numsuger << "?" << endl; cout << "Contesta con '=', '<' si es menor o '>' si es mayor y pulsa intro: "; cin >> respuesta; if (respuesta == '<') limsup = numsuger; else if (respuesta == '>') liminf = numsuger; else if (respuesta == '=') { cout << "Numero adivinado!"; final = true; } } Sleep(15000); return 0; } Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 15 Agosto 2011, 12:02 pm Ya están colgadas todas las soluciones del tema 3.
Os querría pedir un favor, a ver si podéis echarle un vistazo a este código y decidme si está bien o mal o cómo podría hacerlo mejor. Es que este tipo de ejercicios (algo más complejo, claro está) es uno de los que suelen caer en el examen y siempre he tenido "problemas" con ellos. Para ver si más o menos le voy cogiendo el hilo... Citar Una farmacia desea almacenar sus productos (TProducto) en una estructura. De cada producto hay que almacenar la siguiente información: código (unsigned), nombre (string), precio (float), fecha de caducidad (definir un tipo de registro para la fecha). Diseña la estructura de datos (TFarmacia) para almacenar un máximo de MAX (una constante) productos y realiza los siguientes subalgoritmos: (son los subprogramas que he puesto más abajo). Código
Gracias!! Título: Re: Reto Universidad [C++]. Publicado por: PiroskY en 15 Agosto 2011, 16:21 pm No se puede usar archivos?
Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 15 Agosto 2011, 19:01 pm No se puede usar archivos? No, eso se da en otra asignatura. Título: Re: Reto Universidad [C++]. Publicado por: ANTRUCK en 15 Agosto 2011, 20:19 pm Imposible de ganarle a la PC :¬¬ no he podido ganar ni una sola vez :-( hahaha cuando trate de hacer fraude de algun modo poniendo 1,2 se puso loco el juego :xD
Código
Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 18 Agosto 2011, 13:23 pm Creo que tengo una solución más sencilla para el 4º ejercicio del tema 2, a ver que os parece:
Código: #include <iostream> Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 18 Agosto 2011, 23:42 pm Bigfu, tu solución al 5º ejercicio del segundo tema no funciona bien, considera una pendiente ascendente suelta como montaña o valle y las condiciones del problema no lo permiten. Por otro lado en caso de llanura debería ignorar todo el trozo ya que según las condiciones cada número tiene que ser superior o inferior al anterior hasta h y tu código simplemente ignora los repetidos.
Yo he hecho otro código que funciona bien con valles pero no se por qué en en caso de las montañas no suma la parte descendente o algo (la cosa es que siguiendo las instrucciones en un papel funciona... :S). El otro problema es que tampoco tiene en cuenta las llanuras, a ver si los soluciono. De momento lo dejo a ver si ve alguien el fallo: Código
La verdad, no se lo qué está mal ya que en teoría si no hay números iguales seguidos debería funcionar bien :S Título: Re: Reto Universidad [C++]. Publicado por: bigfu en 19 Agosto 2011, 01:00 am Yo lo probé y me funcionaba... al meterle los datos has tenido en cuenta que debe de haber al menos una montaña y un valle??
De todas formas, mañana volveré a echarle un vistazo. Título: Re: Reto Universidad [C++]. Publicado por: Kherom en 19 Agosto 2011, 12:23 pm Si le meto 1 2 1 2 0 dice que la montaña más larga mide 3, pero que el valle más largo mide 2. No he analizado el código ya que tengo bastante con el mío, que no se donde narices falla y al final será alguna tontería :P
El mío con esos valores da justo el resultado contrario :P Y creo que ninguno de los 2 tiene en cuenta que en 1 2 2 2 3 4 1 2 1 0 tanto la montaña como el valle valen 3 ya que la primera parte no se puede considerar una montaña al tener varios valores repetidos. Título: Re: Reto Universidad [C++]. Publicado por: juliana_b_g en 10 Octubre 2016, 17:58 pm 1. Elaborar un programa en C++ Calcular la sumatoria, la media aritmética, el mayor y el menor valor de un vector de 8 elementos cuyos datos se introducen por teclado.
AYUDA!!!!!!!!!!!! |