Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bigfu en 20 Julio 2011, 13:04 pm



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
  1. typedef char Componentes[MAX]
  2. struct Vector{
  3.    Componentes datos;   //array de caracteres
  4.    unsigned tam             //numero de celdas ocupadas
  5. };
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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. char c;
  6. int comas, numChar;
  7.  
  8. numChar = 0;
  9. comas = 0;
  10.  
  11. cout << "Introduzca texto terminado en '.': ";
  12. do{
  13. cin.get(c);
  14. numChar++;
  15. if(c==','){
  16. comas++;
  17. }
  18. }while(c!='.');
  19.  
  20. cout << "Numero de comas: " << comas << endl;
  21. cout << "Numero de caracteres: " << numChar << endl;
  22. return 0;
  23. }

Ejercicio 2
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. bool enc = false;
  6. char c;
  7.  
  8. cout << "Introduzca una sucesion de caracteres terminada en '.': ";
  9. cin >> c;
  10. do{
  11. if(c=='a'){
  12. cin>>c;
  13. if(c=='b'){
  14. cin>>c;
  15. if(c=='c'){
  16. enc=true;
  17. cin>>c;
  18. }
  19. }
  20. }else{
  21. cin>>c;
  22. }
  23. }while(c!='.');
  24.  
  25. if(enc){
  26. cout << "La cadena 'abc' se encuentra en la sucesión de caracteres.";
  27. }else{
  28. cout << "La cadena 'abc' no se encuentra en la sucesión de caracteres.";
  29. }
  30. return 0;
  31. }

Ejercicio 3
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. unsigned n, fib, temp1, temp2;
  6.  
  7. fib = 0;
  8. temp1 = 0;
  9. temp2 = 1;
  10. cout << "Introduzca un numero: ";
  11. cin >> n;
  12. cout << fib << "," << temp2;
  13. for(unsigned i=2;i<n;i++){
  14. fib = temp1+temp2;
  15. temp1 = temp2;
  16. temp2 = fib;
  17. cout << "," << fib;
  18. }
  19. cout << "." << endl;
  20. return 0;
  21. }

Ejercicio 4
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. unsigned may,men,n,num;
  6. float media;
  7. cout << "Introduzca lista de numeros: ";
  8. cin >> n;
  9. may = n;
  10. men = n;
  11. media = n;
  12. for(unsigned i=1;i<n;i++){
  13. cin>>num;
  14. if(num>may){
  15. may=num;
  16. }else if(num<men){
  17. men=num;
  18. }
  19. media = media + num;
  20. }
  21. cout << "El mayor es: " << may << endl;
  22. cout << "El menor es: " << men << endl;
  23. cout << "La media aritmetica es: " << media/n << endl;
  24. return 0;
  25. }

Ejercicio 5
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. int num, prim, ult, pos;
  6.  
  7. pos = 1;
  8. prim = 0;
  9. ult = 0;
  10. cout << "Introduzca una lista de numeros terminada en 0: ";
  11. do{
  12. cin >> num;
  13. if((num==12)&&(prim==0)){
  14. prim = pos;
  15. ult = pos;
  16. }else if((num==12)&&(prim!=0)){
  17. ult = pos;
  18. }
  19. ++pos;
  20. }while(num!=0);
  21.  
  22. if((prim==0)&&(ult==0)){
  23. cout << "Posicion 0" << endl;
  24. }else{
  25. cout << "Primera posicion: " << prim << endl;
  26. cout << "Ultima posicion: " << ult << endl;
  27. }
  28. return 0;
  29. }

Ejercicio 6
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. int main() {
  6. int inf, sup, num;
  7. char c;
  8.  
  9. cout << "Introduzca rango inferior: ";
  10. cin >> inf;
  11. cout << "Introduzca rango superior: ";
  12. cin >> sup;
  13. cout << "Piense un numero en ese rango." << endl;
  14. do{
  15. do{
  16. num = rand() % (sup-inf+1)+inf;  //Rango del numero aleatorio entre inf y sup
  17. }while((num<inf)||(num>sup));
  18. cout << "Es " << num << " el numero pensado?";
  19. do{
  20. cin >> c;
  21. }while((c!='<')&&(c!='>')&&(c!='='));
  22. cout << endl;
  23. switch(c){
  24.   case '<': sup = num-1;
  25.     break;
  26.   case '>': inf = num+1;
  27.     break;
  28.   case '=': cout << "Lo encontre!!" << endl;
  29.     break;
  30. }
  31. }while(c!='=');
  32. return 0;
  33. }
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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. unsigned n, mod, resta;
  6. bool sacar = true;
  7.  
  8. do{
  9. cout << "Introduzca numero de objetos: ";
  10. cin >> n;
  11. }while(n<=0);
  12. if(n%4==1){
  13. sacar = false;
  14. }
  15. do{
  16. if(!sacar){
  17. cout << "Sacar 1, 2 o 3 objetos? ";
  18. do{
  19. cin >> resta;
  20. }while((resta<1)||(resta>3)||(resta>n));
  21. n-=resta;
  22. cout << "Quedan " << n << " objetos." << endl;
  23. sacar = true;
  24. }else{
  25. mod = n%4;
  26. switch(mod){
  27. case 0: cout << "La maquina resta 3. ";
  28. n-=3;
  29. cout << "Quedan " << n << " objetos" << endl;
  30. sacar = false;
  31. break;
  32. case 3: cout << "La maquina resta 2. " << endl;
  33. n-=2;
  34. cout << "Quedan " << n << " objetos" << endl;
  35. sacar = false;
  36. break;
  37. case 2: cout << "La maquina resta 1. " << endl;
  38. n-=1;
  39. cout << "Quedan " << n << " objetos" << endl;
  40. sacar = false;
  41. break;
  42. }
  43. }
  44. }while(n!=0);
  45. cout << "LO SIENTO, HAS PERDIDO. LA MAQUINA GANA!!" << endl;
  46.  
  47. return 0;
  48. }

Citar
Soluciones Tema 2
Ejercicio 1
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void introDatos(unsigned& num);
  5. void pintaTriangulo(unsigned num);
  6.  
  7. int main(){
  8. unsigned num;
  9.  
  10. introDatos(num);
  11. pintaTriangulo(num);
  12.  
  13. return 0;
  14. }
  15.  
  16. void introDatos(unsigned& num){
  17. cout << "Introduzca numero N: ";
  18. do{
  19. cin >> num;
  20. }while(num<=0);
  21. }
  22.  
  23. void pintaTriangulo(unsigned num){
  24. unsigned aux = (num-1);
  25.  
  26. for(unsigned i=0;i<num;i++){
  27. for(unsigned j=0;j<num*2-1;j++){
  28. if((i+j>=num-1)&&(i+j<=aux)){
  29. if(num%2!=0){
  30. if((j+i)%2==0){
  31. cout << '*';
  32. }else{
  33. cout << " ";
  34. }
  35. }else{
  36. if((j+i)%2!=0){
  37. cout << '*';
  38. }else{
  39. cout << " ";
  40. }
  41. }
  42. }else{
  43. cout << " ";
  44. }
  45. }
  46. aux+=2;
  47. cout << endl;
  48. }
  49. }

Ejercicio 2
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void introDatos(unsigned& n, unsigned& i);
  5. unsigned numDig(unsigned n);
  6. void imprimirDig(unsigned n, unsigned i);
  7.  
  8. int main() {
  9. unsigned n, i, num;
  10.  
  11. introDatos(n,i);
  12. num = numDig(n);
  13. if(num<i){
  14. cout << -1 << endl;
  15. }else{
  16. imprimirDig(n,i);
  17. }
  18. return 0;
  19. }
  20.  
  21. void introDatos(unsigned& n, unsigned& i){
  22. do{
  23. cout << "Introduzca numero N: ";
  24. cin >> n;
  25. }while(n<=0);
  26. do{
  27. cout << "Introduzca posicion: ";
  28. cin >> i;
  29. }while(i<=0);
  30. }
  31.  
  32. unsigned numDig(unsigned n){
  33. unsigned cont = 0;
  34. while(n!=0){
  35. n = n/10;
  36. cont++;
  37. }
  38. return cont;
  39. }
  40.  
  41. void imprimirDig(unsigned n, unsigned i){
  42. unsigned j=0, dig;
  43.  
  44. while(j<i){
  45. dig = n%10;
  46. j++;
  47. n = n/10;
  48. }
  49. cout << dig << endl;
  50. }

Ejercicio 3
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void introducirDatos(unsigned& n);
  5. unsigned longNum(unsigned n);
  6. void imprimirSuma(unsigned n, unsigned longitud);
  7. void Suma2a2(unsigned n, unsigned longitud);
  8. unsigned potencia(unsigned longitud);
  9.  
  10. int main() {
  11. unsigned n, longitud;
  12.  
  13. introducirDatos(n);
  14. longitud = longNum(n);
  15. imprimirSuma(n,longitud);
  16.  
  17. return 0;
  18. }
  19.  
  20. void introducirDatos(unsigned& n){
  21. cout << "Introducir numero N: ";
  22. do{
  23. cin >> n;
  24. }while(n<=0);
  25. }
  26.  
  27. unsigned longNum(unsigned n){
  28. unsigned cont = 0;
  29. while(n!=0){
  30. n = n/10;
  31. cont++;
  32. }
  33. return cont;
  34. }
  35.  
  36. void imprimirSuma(unsigned n, unsigned longitud){
  37. unsigned pot = potencia(longitud/2 + 1);
  38.  
  39. cout << "Para el numero: " << n << endl;
  40. if(longitud%2!=0){
  41. Suma2a2(n,longitud);
  42. n = n/pot;
  43. cout << ", " << n%10 << endl;
  44. }else{
  45. Suma2a2(n,longitud);
  46. }
  47. }
  48.  
  49. void Suma2a2(unsigned n, unsigned longitud){
  50. unsigned j=10, suma, i;
  51.  
  52. i = potencia(longitud);
  53. cout << "la salida es: ";
  54. while(i>=j){
  55. suma = 0;
  56. suma = ((n/i) + (n%j));
  57. cout << n/i << " + " << n%j << " = " << suma;
  58. n%=i;
  59. n/=10;
  60. i/=100;
  61. if(i>=j){
  62. cout << ", ";
  63. }
  64. }
  65. }
  66.  
  67. unsigned potencia(unsigned longitud){
  68. unsigned pot = 1;
  69. for(unsigned i=0;i<longitud;i++){
  70. pot*=10;
  71. }
  72. return pot/10;
  73. }

Ejercicio 4
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. unsigned subsucesiones();
  5.  
  6. int main() {
  7. unsigned mayor = subsucesiones();
  8.  
  9. cout << "La subsucesion mas larga es de tamaño " << mayor << endl;
  10. return 0;
  11. }
  12.  
  13. unsigned subsucesiones(){
  14. unsigned aux = 0, cont = 0, suma = 0, n;
  15.  
  16. do{
  17. do{
  18. cin >> n;
  19. if(n==2){
  20. break;
  21. }
  22. }while((n!=0)&&(n!=1));
  23. if(aux==n){
  24. cont++;
  25. if(cont>suma){
  26. suma = cont;
  27. }
  28. }else if((n>aux)&&(n!=2)){
  29. cont++;
  30. if(cont>suma){
  31. suma = cont;
  32. }
  33. aux = n;
  34. }else if(aux>n){
  35. cont = 1;
  36. aux = 0;
  37. }
  38. }while(n!=2);
  39. return suma;
  40. }

Ejercicio 5
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void paisaje(int num, int& ant, unsigned& a, unsigned&b, bool& subida, bool& p_bajo);
  5.  
  6. int main() {
  7. int num, ant=0;
  8. bool subida_m = false, p_bajo = false;
  9. unsigned m = 0, v = 0;
  10. unsigned a = 0, b = 0;
  11.  
  12. cout << "Introduzca secuencia de enteros: ";
  13. do{
  14. cin >> num;
  15. paisaje(num,ant,a,b,subida_m,p_bajo);
  16. if(a>m){
  17. m = a;
  18. }
  19. if(b>v){
  20. v = b;
  21. }
  22. }while(num!=0);
  23.  
  24. cout << "La montaña mas larga: " << m << endl;
  25. cout << "El valle mas largo: " << v << endl;
  26.  
  27. return 0;
  28. }
  29.  
  30. void paisaje(int num, int& ant, unsigned& a, unsigned& b, bool& subida, bool& p_bajo){
  31. if(ant==0){
  32. ant = num;
  33. a++;
  34. b++;
  35. }else if((num<ant)&&(num!=0)&&(!p_bajo)){
  36. ant = num;
  37. a++;
  38. b++;
  39. }else if((num<ant)&&(num!=0)&&(p_bajo)){
  40. p_bajo = false;
  41. b = 2;
  42. a++;
  43. ant = num;
  44. }else if((num>ant)&&(!subida)&&(num!=0)&&(!p_bajo)){
  45. a = 2;
  46. b++;
  47. ant = num;
  48. subida = true;
  49. p_bajo = true;
  50. }else if((num>ant)&&(subida)&&(num!=0)&&(p_bajo)){
  51. a++;
  52. b++;
  53. ant = num;
  54. }
  55. }

Ejercicio 6
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. unsigned mcd(unsigned P, unsigned Q);
  5.  
  6. int main() {
  7. unsigned p,q,resultado;
  8.  
  9. cout << "Introduzca P: ";
  10. cin >> p;
  11. cout << "Introduzca Q: ";
  12. cin >> q;
  13. resultado = mcd(p,q);
  14. cout << "El mcd de " << p << " y " << q << " es: " << resultado << endl;
  15.  
  16. return 0;
  17. }
  18.  
  19. unsigned mcd(unsigned P, unsigned Q){
  20. unsigned res=0;
  21.  
  22. if(P==Q){
  23. res = P;
  24. }else if(P>Q){
  25. res = mcd(P-Q,Q);
  26. }else if(P<Q){
  27. res = mcd(P,Q-P);
  28. }
  29.  
  30. return res;
  31. }

Ejercicio 7
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void inv_sec();
  5.  
  6. int main() {
  7. cout << "Introduzca caracteres terminados en punto: ";
  8. inv_sec();
  9. return 0;
  10. }
  11.  
  12. void inv_sec(){
  13. char c;
  14.  
  15. cin.get(c);
  16. if(c=='.'){
  17.  
  18. }else{
  19. inv_sec();
  20. cout << c;
  21. }
  22. }

Citar
Soluciones Tema 3
Ejercicio 1
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const unsigned MAX = 10;
  5.  
  6. typedef unsigned TArray[MAX];
  7.  
  8. void introDatos(TArray& a);
  9. void intercambiar(TArray& a);
  10. void pintaArray(const TArray& a);
  11.  
  12. int main() {
  13. TArray a;
  14.  
  15. introDatos(a);
  16. pintaArray(a);
  17. intercambiar(a);
  18. pintaArray(a);
  19.  
  20. return 0;
  21. }
  22.  
  23. void introDatos(TArray& a){
  24. cout << "Introduzca datos: ";
  25. for(unsigned i=0;i<MAX;i++){
  26. cin >> a[i];
  27. }
  28. }
  29.  
  30. void intercambiar(TArray& a){
  31. unsigned i=0;
  32. unsigned j=MAX-1;
  33. unsigned aux;
  34.  
  35.  
  36. while(i<=j){
  37. aux = a[i];
  38. a[i] = a[j];
  39. a[j] = aux;
  40. i++;
  41. j--;
  42. }
  43. }
  44.  
  45. void pintaArray(const TArray& a){
  46. for(unsigned i=0;i<MAX;i++){
  47. cout << a[i] << " ";
  48. }
  49. cout << endl;
  50. }

Ejercicio 2
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const unsigned MAX = 50;
  5. typedef unsigned TArray[MAX];
  6.  
  7. void conversion(TArray& a, unsigned num, unsigned base, unsigned& pos);
  8. void intercambiar(TArray& a, unsigned pos);
  9. void pintaMatriz(const TArray& a, unsigned pos);
  10.  
  11. int main() {
  12. TArray a = {0};
  13. unsigned num, base, pos;
  14.  
  15. cout << "Introduzca numero en base 10: ";
  16. cin >> num;
  17. cout << "Introduzca base para la conversion: ";
  18. do{
  19. cin >> base;
  20. }while((base<2)||(base>9));
  21. conversion(a,num,base,pos);
  22. intercambiar(a,pos);
  23. cout << "El numero " << num << " en base " << base << " es: ";
  24. pintaMatriz(a,pos);
  25.  
  26. return 0;
  27. }
  28.  
  29. void conversion(TArray& a, unsigned num, unsigned base, unsigned& pos){
  30. pos = 0;
  31.  
  32. do{
  33. a[pos] = num%base;
  34. num/=base;
  35. pos++;
  36. }while(num>0);
  37. }
  38.  
  39. void intercambiar(TArray& a, unsigned pos){
  40. unsigned i=0, j=pos-1;
  41. unsigned aux;
  42.  
  43. while(i<=j){
  44. aux = a[i];
  45. a[i] = a[j];
  46. a[j] = aux;
  47. i++;
  48. j--;
  49. }
  50. }
  51.  
  52. void pintaMatriz(const TArray& a, unsigned pos){
  53. for(unsigned i=0;i<pos;i++){
  54. cout << a[i];
  55. }
  56. }

Ejercicio 3
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. const unsigned MAX_ARRAY = 26;
  6. typedef unsigned TArray[MAX_ARRAY];
  7.  
  8. void leerTexto(string& s);
  9. void cuentaPalabras(const string& s, TArray& a);
  10. void pintaMatriz(const TArray& a);
  11.  
  12. int main() {
  13. TArray a = {0};
  14. string s;
  15.  
  16. leerTexto(s);
  17. cuentaPalabras(s,a);
  18. pintaMatriz(a);
  19.  
  20. return 0;
  21. }
  22.  
  23. void leerTexto(string& s){
  24. char c;
  25.  
  26. cout << "Introduzca texto acabado en '.': ";
  27. do{
  28. cin >> c;
  29. if(((c>='A')&&(c<='Z')||(c=='.'))){
  30. s+=c;
  31. }
  32. }while(c!='.');
  33. }
  34.  
  35. void cuentaPalabras(const string& s, TArray& a){
  36. for(unsigned i=0;i<s.size()-1;i++){
  37. a[int(s[i]-int('A'))]++;
  38. }
  39. }
  40.  
  41. void pintaMatriz(const TArray& a){
  42. char c;
  43. for(unsigned i=0;i<MAX_ARRAY;i++){
  44. c = char((i+int('A')));
  45. cout << c << ": " << a[i] << endl;
  46. }
  47. }

Ejercicio 4
Código
  1. typedef char Componentes[MAX]
  2. struct Vector{
  3.   Componentes datos;
  4.   unsigned tam;
  5. };
  6. const unsigned TAMANYO = 128;
  7. typedef unsigned TArray[TAMANYO];
a)
Código
  1. void moda(const Vector& v, bool& enc, char& c){
  2.   TArray a = {0};
  3.   for(unsigned i=0;i<v.tam;i++){
  4.      a[int(v.datos)]++;
  5.   }
  6.   unsigned cantidad = a[0];
  7.   enc = true;
  8.   c = char(0);
  9.   for(unsigned j=1;j<TAMANYO;j++){
  10.      if(a[j]>cantidad){
  11.         enc = true;
  12.         c = char(j);
  13.         cantidad = a[j];
  14.      }else if(a[j] = cantidad){
  15.         enc = false;
  16.      }
  17.   }
  18. }
b)
Código
  1. bool iguales(const Vector& a, const Vector& b){
  2.   int ind = indice(a,b);
  3.   unsigned i = 1, j = ind + 1;
  4.   bool igual = false;
  5.  
  6.   if(ind < 0){
  7.      return false;
  8.   }else{
  9.      while(i<a.tam){
  10.         if((a.datos[i] == b.datos[j]) && (j<b.tam)){
  11.            igual = true;
  12.            i++;
  13.            j++;
  14.         }else if(j>=b.tam){
  15.            j=0;
  16.         }else if(a.datos[i]!=b.datos[j]){
  17.            igual = false;
  18.            break;
  19.         }
  20.      }
  21.      return igual;
  22.   }
  23. }
  24.  
  25. int indice(const Vector& a, const Vector& b){
  26.   bool enc = false;
  27.   unsigned i=0;
  28.  
  29.   if(a.tam != b.tam){
  30.      return -1;
  31.   }else{
  32.      while((!enc) || (i<b.tam)){
  33.         if(a.datos[0] == b.datos[i]){
  34.            return i;
  35.            enc = true;
  36.         }else{
  37.            i++;
  38.         }
  39.      }
  40.      if(!enc){
  41.         return -1;
  42.      }
  43.   }
  44. }
c)
Código
  1. void ordena(const Vector& a, const Vector& b, Vector& c){
  2. /*Suponemos c inicializados correctamente*/
  3.   unsigned i=j=0, k=0;
  4.  
  5.   while((i<a.tam)&&(j<b.tam)){
  6.      if(a.datos[i]<b.datos[j]){
  7.         c[k] = a.datos[i];
  8.         k++;
  9.         i++;
  10.      }else if(a.datos[i] > b.datos[j]){
  11.         c[k] = b.datos[j];
  12.         k++;
  13.         j++;
  14.      }else if(a.datos[i] == b.datos[j]){
  15.         c[k] = a.datos[i];
  16.         k++;
  17.         i++;
  18.         c[k] = b.datos[j];
  19.         k++;
  20.         j++;
  21.      }
  22.   }
  23.   if(i==a.tam){
  24.      for(unsigned m=j;m<b.tam;m++){
  25.         c[k] = b.datos[m];
  26.         k++;
  27.   }else if(j == b.tam){
  28.      for(unsigned n=i;n<a.tam;n++){
  29.         c[k] = a.datos[n];
  30.         k++;
  31.      }
  32.   }
  33. }

Ejercicio 5
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const unsigned DIAS = 31;
  5. typedef bool TFechas[DIAS];
  6.  
  7. void inicializar(TFechas& f);
  8. void introFechas(TFechas& f);
  9. void comparar(TFechas& f, const TFechas& g);
  10. void pintaFechas(const TFechas& f);
  11.  
  12. int main() {
  13. unsigned i=1;
  14. TFechas a, fechas;
  15.  
  16. inicializar(fechas);
  17. introFechas(fechas);
  18. do{
  19. inicializar(a);
  20. introFechas(a);
  21. comparar(fechas,a);
  22. i++;
  23. }while(i<25);
  24.  
  25. cout << "Las días compatibles son: ";
  26. pintaFechas(fechas);
  27.  
  28. return 0;
  29. }
  30.  
  31. void inicializar(TFechas& f){
  32. for(unsigned i=0;i<DIAS;i++){
  33. f[i] = false;
  34. }
  35. }
  36.  
  37. void introFechas(TFechas& f){
  38. unsigned dias;
  39. cout << "Introduzca los dias que puede ir: ";
  40. do{
  41. cin >> dias;
  42. if((dias>=1)&&(dias<=31)){
  43. f[dias-1] = true;
  44. }
  45. }while(dias>0);
  46. }
  47.  
  48. void comparar(TFechas& f, const TFechas& g){
  49. for(unsigned i=0;i<DIAS;i++){
  50. if((f[i]==true)&&(g[i]==false)){
  51. f[i]=false;
  52. }
  53. }
  54. }
  55.  
  56. void pintaFechas(const TFechas& f){
  57. for(unsigned i=0;i<DIAS;i++){
  58. if(f[i]==true){
  59. cout << i+1 << " ";
  60. }
  61. }
  62. }

Ejercicio 6
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const unsigned MAX = 5;
  5. typedef int TArray[MAX];
  6.  
  7. void introDatos(TArray& a);
  8. int mayor(const TArray& a);
  9. int menor(const TArray& a);
  10. void introPos(const TArray& a, TArray& b, unsigned& i, int n, unsigned& j);
  11. int generarSigNum(const TArray& a, int sup, int inf);
  12. void pintaArray(const TArray& b);
  13.  
  14. int main() {
  15. TArray a,b;
  16. unsigned i = MAX-1,j=0;
  17. int sup, inf;
  18.  
  19. introDatos(a);
  20. sup = mayor(a);
  21. inf = menor(a);
  22. while(j<=MAX){
  23. introPos(a,b,i,sup,j);
  24. sup = generarSigNum(a,sup,inf);
  25. }
  26. pintaArray(b);
  27.  
  28. return 0;
  29. }
  30.  
  31. void introDatos(TArray& a){
  32. cout << "Introduzca numero naturales: ";
  33. for(unsigned i=0;i<MAX;i++){
  34. cin >> a[i];
  35. }
  36. }
  37.  
  38. int mayor(const TArray& a){
  39. int m = a[0];
  40.  
  41. for(unsigned i=1;i<MAX;i++){
  42. if(a[i]>m){
  43. m = a[i];
  44. }
  45. }
  46. return m;
  47. }
  48.  
  49. int menor(const TArray& a){
  50. int m = a[0];
  51.  
  52. for(unsigned i=0;i<MAX;i++){
  53. if(a[i]<m){
  54. m = a[i];
  55. }
  56. }
  57. return m;
  58. }
  59.  
  60. void introPos(const TArray& a, TArray& b, unsigned& i,int n, unsigned& j){
  61. for(unsigned k=0;k<MAX;k++){
  62. if(a[k]==n){
  63. b[i]=k;
  64. i--;
  65. j++;
  66. }
  67. }
  68. }
  69.  
  70. int generarSigNum(const TArray& a, int sup, int inf){
  71. for(unsigned i=0;i<MAX;i++){
  72. if((a[i]>=inf)&&(a[i]<sup)){
  73. inf = a[i];
  74. }
  75. }
  76. return inf;
  77. }
  78.  
  79. void pintaArray(const TArray& b){
  80. for(unsigned i=0;i<MAX;i++){
  81. cout << b[i] << " ";
  82. }
  83. }

Ejercicio 7
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. const unsigned MAX = 26;
  6. typedef unsigned TLetras[MAX];
  7. typedef bool TArray[MAX];
  8.  
  9. void introTexto(string& txt);
  10. void contarLetras(const string& txt, TLetras& l, TArray& a);
  11. void pintaLetras(const TLetras& l, const TArray& a);
  12.  
  13. int main() {
  14. TLetras l = {0};
  15. TArray a = {false};
  16. string t;
  17.  
  18. introTexto(t);
  19. contarLetras(t,l,a);
  20. pintaLetras(l,a);
  21.  
  22. return 0;
  23. }
  24.  
  25. void introTexto(string& txt){
  26. char c;
  27.  
  28. cout << "Introduzca texto terminado en '.': ";
  29. do{
  30. cin >> c;
  31. if((c>='A')&&(c<='Z')){
  32. txt+=c;
  33. }
  34. }while(c!='.');
  35. txt+='.';
  36. }
  37.  
  38. void contarLetras(const string& txt, TLetras& l, TArray& a){
  39. unsigned cont;
  40.  
  41. for(unsigned i=0;i<txt.size()-1;i++){
  42. cont = 0;
  43. for(unsigned j=i+1;j<txt.size()-1;j++){
  44. if(txt[i]==txt[j]){
  45. a[int(txt[i])-int('A')] = true;
  46. l[int(txt[i])-int('A')] = cont;
  47. break;
  48. }
  49. cont++;
  50. }
  51. }
  52. }
  53.  
  54. void pintaLetras(const TLetras& l, const TArray& a){
  55. for(unsigned i=0;i<MAX;i++){
  56. if(a[i]==true){
  57. cout <<"Distancia entre " << char(i+int('A')) << ": " << l[i] << endl;
  58. }
  59. }
  60. }

Ejercicio 8
Código
  1. int sumaDiagonal(const TMatriz& m){
  2.   unsigned i = j = 0, suma = 0;
  3.  
  4.   while((i<MAX)&&(j<MAX)){
  5.      suma+=m[i][j];
  6.      i++;
  7.      j++;
  8.   }
  9.   return suma;
  10. }

Ejercicio 9
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const unsigned M = 10;
  5. typedef int TDatos[M][M];
  6. struct TMatriz{
  7. TDatos matriz;
  8. unsigned f;
  9. unsigned c;
  10. };
  11.  
  12. void introDatos(TMatriz& m);
  13. void puntosSilla(const TMatriz& m, bool& notiene);
  14. int menorFila(const TMatriz& m, unsigned i);
  15. int mayorCol(const TMatriz& m, unsigned j);
  16.  
  17. int main() {
  18. TMatriz m;
  19. bool notiene = true;
  20.  
  21. introDatos(m);
  22. puntosSilla(m,notiene);
  23.  
  24. if(notiene){
  25. cout << "La matriz no tiene ningun punto silla." << endl;
  26. }
  27.  
  28. return 0;
  29. }
  30.  
  31. void introDatos(TMatriz& m){
  32. cout << "Introduzca numero de filas: ";
  33. do{
  34. cin >> m.f;
  35. }while((m.f<=0)||(m.f>10));
  36. cout << "Introduzca numero de columnas: ";
  37. do{
  38. cin >> m.c;
  39. }while((m.c<=0)||(m.c>10));
  40. cout << "Introduzca numeros en la matriz " << m.f << "x" << m.c << ": ";
  41. for(unsigned i=0;i<m.f;i++){
  42. for(unsigned j=0;j<m.c;j++){
  43. cout << "m(" << i+1 << "," << j+1 << "): ";
  44. cin >> m.matriz[i][j];
  45. }
  46. }
  47. }
  48.  
  49. void puntosSilla(const TMatriz& m, bool& notiene){
  50. int menor;
  51. unsigned i,j;
  52.  
  53. for(i=0;i<m.f;i++){
  54. menor = menorFila(m,i);
  55. for(j=0;j<m.c;j++){
  56. if((m.matriz[i][j]==menor)&&(menor==mayorCol(m,j))){
  57. cout << "Punto Silla: (" << i+1 << "," << j+1 << ")" << endl;
  58. notiene = false;
  59. }
  60. }
  61. }
  62. }
  63.  
  64. int menorFila(const TMatriz& m, unsigned i){
  65. int menor = m.matriz[i][0];
  66.  
  67. for(unsigned j=1;j<m.c;j++){
  68. if(m.matriz[i][j]<menor){
  69. menor = m.matriz[i][j];
  70. }
  71. }
  72. return menor;
  73. }
  74.  
  75. int mayorCol(const TMatriz& m, unsigned j){
  76. int mayor = m.matriz[0][j];
  77.  
  78. for(unsigned i=1;i<m.f;i++){
  79. if(m.matriz[i][j]>mayor){
  80. mayor = m.matriz[i][j];
  81. }
  82. }
  83. return mayor;
  84. }

Ejercicio 10
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. bool permitida(const string& s);
  6. bool tieneIniciales(const string& t, char c);
  7.  
  8. int main() {
  9. string s,t;
  10.  
  11. cout << "Introduzca texto: ";
  12. do{
  13. cin >> s;
  14. }while(!permitida(s));
  15. t = s;
  16. cout << "Las palabras que comienzan con alguna letra de " << t << " son: ";
  17. while(s!="FIN"){
  18. if((permitida(s))&&(tieneIniciales(t,s[0]))&&(s!=t)){
  19. cout << s << " ";
  20. }
  21. do{
  22. cin >> s;
  23. }while(!permitida(s));
  24. }
  25. return 0;
  26. }
  27.  
  28. bool permitida(const string& s){
  29. bool res = true;
  30.  
  31. for(unsigned i=0;i<s.size();i++){
  32. if((s[i]<'A')||(s[i]>'Z')){
  33. res = false;
  34. break;
  35. }
  36. }
  37. return res;
  38. }
  39.  
  40. bool tieneIniciales(const string& t, char c){
  41. bool res = false;
  42.  
  43. for(unsigned i=0;i<t.size();i++){
  44. if(t[i]==c){
  45. res = true;
  46. break;
  47. }
  48. }
  49. return res;
  50. }

Ejercicio 11
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. const unsigned MAX_PAL_DIST = 20;
  6. typedef string TArray[MAX_PAL_DIST];
  7. struct TDatos{
  8. TArray a;
  9. unsigned n;
  10. };
  11.  
  12. void contienePatron(const string& p, TDatos& datos);
  13. bool permitida(const string& s);
  14. bool contiene(const string& p, const string& s);
  15. bool repetida(const string& s, const TDatos& datos);
  16. void pintaPalabras(const TDatos& datos);
  17.  
  18. int main() {
  19. TDatos datos;
  20. string p;
  21.  
  22. do{
  23. cout << "Introduzca patron: ";
  24. cin >> p;
  25. }while(!permitida(p));
  26. datos.n = 0;
  27. contienePatron(p,datos);
  28. pintaPalabras(datos);
  29.  
  30. return 0;
  31. }
  32.  
  33. void contienePatron(const string& p, TDatos& datos){
  34. string s;
  35.  
  36. cout << "Introduzca texto terminado en 'FIN': ";
  37. while((s!="FIN")&&(datos.n<MAX_PAL_DIST)){
  38. do{
  39. cin >> s;
  40. }while(!permitida(s));
  41. if((contiene(p,s))&&(!repetida(s,datos))){
  42. datos.a[datos.n] = s;
  43. datos.n++;
  44. }
  45. }
  46. }
  47.  
  48. bool permitida(const string& s){
  49. bool res = true;
  50.  
  51. for(unsigned i=0;i<s.size();i++){
  52. if((s[i]<'A')||(s[i]>'Z')){
  53. res = false;
  54. break;
  55. }
  56. }
  57. return res;
  58. }
  59.  
  60. bool contiene(const string& p, const string& s){
  61. unsigned i = 0, cont = 0;
  62. bool res = false;
  63.  
  64. while((s[i]!=p[0])&&(i<s.size())){
  65. i++;
  66. }
  67. while((cont<p.size())&&(i<s.size())){
  68. if(s[i]==p[cont]){
  69. res = true;
  70. i++;
  71. cont++;
  72. }else{
  73. res = false;
  74. break;
  75. }
  76. }
  77. return res;
  78. }
  79.  
  80. bool repetida(const string& s, const TDatos& datos){
  81. bool res = false;
  82.  
  83. for(unsigned i=0;i<datos.n;i++){
  84. if(datos.a[i]==s){
  85. res = true;
  86. }
  87. }
  88. return res;
  89. }
  90.  
  91. void pintaPalabras(const TDatos& datos){
  92. for(unsigned i=0;i<datos.n;i++){
  93. cout << datos.a[i] << " ";
  94. }
  95. }

Ejercicio 12
Código
  1. #include <iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. const unsigned MAX = 50;
  6. struct TFecha{
  7.   unsigned dia,mes,anyo;
  8. };
  9. struct TProducto{
  10.   unsigned codigo;
  11.   string nombre;
  12.   float precio;
  13.   TFecha fecha_cad;
  14. };
  15. typedef TProducto TMedicamentos[MAX];
  16. struct TFarmacia{
  17.   TMedicamentos med;
  18.   unsigned num;
  19. };
  20.  
  21. void LeerProducto(TProducto& p){
  22.   cout << "Introduzca codigo: ";
  23.   cin >> p.codigo;
  24.   cout << "Introduzca nombre: ";
  25.   getline(cin,p.nombre);
  26.   cout << "Introduzca precio: ";
  27.   cin >> p.precio;
  28.   cout << "FECHA: " << endl;
  29.   cout << "Introduzca dia: ";
  30.   do{
  31.      cin >> p.fecha_cad.dia;
  32.   }while((p.fecha_cad.dia<1)||(p.fecha_cad.dia>31));
  33.   cout << "Introduzca mes: ";
  34.   do{
  35.      cin >> p.fecha_cad.mes;
  36.   }while((p.fecha_cad.mes<1)||(p.fecha_cad.mes>12));
  37.   cout << "Introduzca año: ";
  38.   cin >> anyo;
  39. }
  40.  
  41. void EscribirProducto(const TProducto& p){
  42.   cout << "Codigo: " << p.codigo << endl;
  43.   cout << "Nombre: " << p.nombre << endl;
  44.   cout << "Precios: " << p.precio << endl;
  45.   cout << "Fecha: " << p.fecha_cad.dia << "/" << p.fecha_cad.mes << "/" << p.fecha_cad.anyo << endl;
  46. }
  47.  
  48. void inicializarFarmacia(TFarmacia& f){
  49.   f.num = 0;
  50. }
  51.  
  52. void insertarProducto(TFarmacia& f, const TProducto& p){
  53.   f.med[f.num] = p;
  54.   f.num++;
  55. }
  56.  
  57. void BorrarProducto(TFarmacia& f, unsigned codigo){
  58.   bool esta = false;
  59.   unsigned i;
  60.   for(i=0;i<f.num;i++){
  61.      if(f.med[i].codigo == codigo){
  62.         esta = true;
  63.         break;
  64.      }
  65.   }
  66.   if(esta){
  67.      f.med[i] = f.med[f.num-1];
  68.      f.num--;
  69.   }else{
  70.      cout << "No esta" << endl;
  71.   }
  72. }
  73.  
  74. void BuscarProductoCodigo(const TFarmacia& f, unsigned codigo, bool& encontrado, TProducto& p){
  75.   encontrado = false;
  76.  
  77.   for(unsigned i=0;i<f.num;i++){
  78.      if(f.med[i].codigo == codigo){
  79.         p = f.med[i];
  80.         encontrado = true;
  81.         break;
  82.      }
  83.   }
  84. }
  85.  
  86. void BuscarProductoNombre(const TFarmacia& f, const string& nombre, bool& encontrado, TProducto& p){
  87.   encontrado = false;
  88.  
  89.   for(unsigned i=0;i<f.num;i++){
  90.      if(f.med[i].nombre == nombre){
  91.         p = f.med[i];
  92.         encontrado = true;
  93.         break;
  94.      }
  95.   }
  96. }
  97.  
  98. void ListarFarmacia(const TFarmacia& f){
  99.   for(unsigned i=0;i<f.num;i++){
  100.      EscribirProducto(f.med[i]);
  101.      cout << endl;
  102.   }
  103. }


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
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6.    int num,turno=1,resto,aux;
  7.    do
  8.    {
  9.        cout<<"Introduzca numero: ";
  10.        cin>>num;
  11.    }
  12.    while(num<=0);
  13.    if(num%4==1)
  14.        turno=0;
  15.    do
  16.    {
  17.        cout<<num<<" Objetos"<<endl;
  18.        switch(turno)
  19.        {
  20.            case 0: do
  21.                    {
  22.                        cout<<"Quitar [1] [2] [3] objetos: ";
  23.                        cin>>resto;
  24.                    }
  25.                    while(resto<1 || resto>3 || resto>num);
  26.                    turno=2;
  27.                    break;
  28.            case 2: resto=4-resto;
  29.                    cout<<"Computador quita "<<resto<<" objetos"<<endl;
  30.                    turno=0;
  31.                    break;
  32.            case 1: for(int j=num-1;j>=num-3;j--)
  33.                        if(j%4==1)
  34.                            aux=j;
  35.                    resto=num-aux;    
  36.                    cout<<"Computador quita "<<resto<<" objetos"<<endl;
  37.                    turno=0;
  38.                    break;
  39.        }
  40.        num-=resto;
  41.    }
  42.    while(num!=0);
  43.    cout<<"Computador Wins... user sucks!!!"<<endl;
  44. }
  45.  

Salu2 ;)


Título: Re: Reto Universidad [C++].
Publicado por: satu en 22 Julio 2011, 11:54 am
Hola

Aquí lo tienes

Código
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    int turno, resta, num;
  9.  
  10.    srand(time(NULL));
  11.    turno = rand() % 2;
  12.  
  13.    do
  14.        {
  15.        cout << "Introduce el numero de objetos: ";
  16.        cin >> num;
  17.        }
  18.    while(num <= 0);
  19.  
  20.    while(num > 0)
  21.        {
  22.        cout << endl << "Quedan " << num << " objetos";
  23.  
  24.        if(turno)
  25.            {
  26.            do
  27.                {
  28.                cout << endl << endl << "Cuantos objetos quieres retirar? [1][2][3]: ";
  29.                cin >> resta;
  30.                }
  31.            while(resta < 1  || resta > 3);
  32.            num -= resta;
  33.            turno = 0;
  34.            }
  35.        else
  36.            {
  37.            resta = rand() % 3 + 1;
  38.            cout << endl << endl << "La maquina retira " << resta << " objetos" << endl;
  39.            num -= resta;
  40.            turno = 1;
  41.            }
  42.        }
  43.    if(turno)
  44.        cout << endl << endl << "ENHORABUENA. Has ganado :)" << endl << endl;
  45.    else
  46.        cout << endl << endl << "Has perdido :(" << endl << endl;
  47.  
  48.    cout << endl << "Pulse Enter para salir...";
  49.    while(cin.get() != '\n');
  50.    cin.get();
  51.    return 0;
  52. }
  53.  

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 objetos

Salu2 ;)


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á corregido

Gracias 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>
#include<iostream>
using namespace std;
 
int main()
{
    int num,c;
    srand(time(NULL));
    for(c=1;c<=10;c++)
    {
        num=1+rand()%(11-1);
        cout<<num<<" ";
    }
    cin.get();
}


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:

#include<iostream>
using namespace std;

int main()
{
int N,resto,modu;

    do
    {
        cout<<"Numero de objetos: ";
        cin>>N;
    }
    while(N<=0);
    
   modu = N%4;
   if(modu!=1){
        resto = modu==0? 3:modu%2 +1;
        cout<<"Hay "<<N<<" objetos Yo Quito "<<resto<<" objeto/s"<<endl;
N-=resto;

   }
  do{
       do
         {
           cout<<"Hay "<<N<<" objetos, Cuantos quitas? [1] [2] [3]: ";
           cin>>resto;
         }while(resto<1 || resto>3 || resto>N);
 
         N-=resto;
if(!N) break;
modu = N%4;
         resto = modu==0? 3:modu%2 +1;
         cout<<"Hay "<<N<<" objetos Yo Quito "<<resto<<" objeto/s"<<endl;
N-=resto;

    }while(1);
    cout<<"Has perdido... como siempre...."<<endl;
}






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:

#include<iostream>
using namespace std;

int main()
{
int N,resto,modu;

    do
    {
        cout<<"Numero de objetos: ";
        cin>>N;
    }
    while(N<=0);
    
   modu = N%4;
   if(modu!=1){
        resto = modu==0? 3:modu%2 +1;
        cout<<"Hay "<<N<<" objetos Yo Quito "<<resto<<" objeto/s"<<endl;
N-=resto;

   }
  do{
       do
         {
           cout<<"Hay "<<N<<" objetos, Cuantos quitas? [1] [2] [3]: ";
           cin>>resto;
         }while(resto<1 || resto>3 || resto>N);
 
         N-=resto;
if(!N) break;
modu = N%4;
         resto = modu==0? 3:modu%2 +1;
         cout<<"Hay "<<N<<" objetos Yo Quito "<<resto<<" objeto/s"<<endl;
N-=resto;

    }while(1);
    cout<<"Has perdido... como siempre...."<<endl;
}





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
  1. #include <stdlib.h>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6.  int obj=0,c,o,m=0,objm;
  7.  cout<<"Introduzca el numero de objetos:";cin>>obj;
  8.  c=1+rand()%(11-5);
  9.   if(c<=5)
  10.   {
  11.    objm=obj;
  12.    cout<<"Empieza el usuario."<<endl;
  13.    do
  14.    {
  15.     cout<<"Hay "<<obj<< " objetos."<<endl;
  16.     cin.get();
  17.     cout<<"Cuantos objetos desea retirar?:";cin>>o;
  18.     obj=obj-o;
  19.     m=o-1;
  20.     objm=objm-m;
  21.     cout<<endl<<"La maquina retira "<<m<<" objetos"<<endl;
  22.    }
  23.     while(obj>0);
  24.  
  25.    if(obj<=0)
  26.    {
  27.     cout<<"te Quedan "<<obj<<" objetos."<<endl;
  28.     cout<<"La maquina tiene "<<objm<<" objetos.";
  29.     cin.get();
  30.     cout<<endl<<"Has perdido";
  31.    }
  32.   }
  33.   else if(c>5)
  34.   {
  35.    objm=obj+1;
  36.    cout<<"Empieza la maquina."<<endl;
  37.    do
  38.    {
  39.     cout<<"La maquina resta 1 objeto"<<endl;
  40.     cout<<"Cuantos objetos restar?:";cin>>o;
  41.     objm=objm-1;
  42.     obj=obj-o;
  43.     cout<<"La maquina tiene "<<objm<<" Objetos."<<endl;
  44.     cout<<"Tu tienes "<<obj<<" Objetos."<<endl;
  45.    }
  46.    while(obj>0);
  47.  
  48.    if(obj<=0)
  49.    {
  50.     cout<<"te Quedan "<<obj<<" objetos."<<endl;
  51.     cout<<"La maquina tiene "<<objm<<" objetos.";
  52.     cin.get();
  53.     cout<<endl<<"Has perdido";
  54.    }
  55.   }
  56.  cin.get();cin.get();
  57.  return 0;
  58. }
  59.  
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
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. static bool EsPar(int n)
  6. {
  7.       return ((n % 2) == 0);
  8. }
  9.  
  10. int main (int argc, char *argv[])
  11. {
  12.    int tam;
  13.    do{
  14.        cout << "Ingrese el tama&#241;o del triangulo [IMPAR]" << endl;
  15.        cin >> tam;
  16.    }while(EsPar(tam) || tam < 2);
  17.    for(int i = 0; i <= tam/2; i++)
  18.    {
  19.            for (int j=1; j <= tam/2-i; j++)
  20.            {
  21.                cout<<" ";
  22.            }
  23.            for (int j=1; j <= i*2+1; j++)
  24.            {
  25.                cout<<"*";
  26.            }
  27.            for (int j=1; j <= tam/2-i; j++)
  28.            {
  29.                cout<<" ";
  30.            }
  31.            cout << endl;
  32.    }
  33.    cin.get();cin.get();
  34.    return 0;
  35. }
  36.  

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
  1. //Problema 1
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main() {
  6.    int n;
  7.    cin >> n;
  8.    for (int i = 1; i <= n; ++i) {
  9.        cout << string(n - i, ' ');
  10.        for (int j = 0; j + 1 < i; ++j) cout << "* ";
  11.        cout << "*" << endl;
  12.    }
  13. }
  14.  
  15. //Problema 2
  16. #include <iostream>
  17. using namespace std;
  18.  
  19. void imprime(int n, int i) {
  20.    if (i == 1) cout << n%10 << endl;
  21.    else if (n/10 == 0) cout << -1 << endl;
  22.    else imprime(n/10, i - 1);
  23. }
  24.  
  25. int main() {
  26.    int n, i;
  27.    cin >> n >> i;
  28.    imprime(n, i);
  29. }
  30.  
  31. //Problema 3
  32. #include <iostream>
  33. using namespace std;
  34.  
  35. int main() {
  36.    string s;
  37.    cin >> s;
  38.    for (int i = 0; i < s.size() >> 1; ++i) {
  39.        if (i > 0) cout << ", ";
  40.        cout << s[i] << " + " << s[s.size() - 1 - i] << " = " << s[i] - '0' + s[s.size() - 1 - i] - '0';
  41.    }
  42.    if (s.size()&1) cout << ((s.size() > 1)?", ":"") << s[s.size()>>1];
  43.    cout << endl;
  44. }
  45.  
  46.  
  47. //Problema 4
  48. #include <iostream>
  49. using namespace std;
  50.  
  51. int main() {
  52.    int maxim = 0, act = 0;
  53.    char c, ant = '0';
  54.    while (cin >> c) {
  55.        if (c >= ant) ++act;
  56.        else {
  57.            maxim = max(maxim, act);
  58.            act = 1;
  59.        }
  60.        ant = c;
  61.    }
  62.    maxim = max(maxim, act);
  63.    cout << maxim << endl;
  64. }
  65.  
  66.  
  67. //Problema 6
  68. #include <iostream>
  69. using namespace std;
  70.  
  71. int mcd(int a, int b) {
  72.    if (a == b) return a;
  73.    return (a > b) ? mcd(a - b, b) : mcd(b - a, a);
  74. }
  75.  
  76. int main() {
  77.    int a, b;
  78.    cin >> a >> b;
  79.    cout << mcd(a, b) << endl;
  80. }
  81.  


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
  1. //Problema 1
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main() {
  6.    int n;
  7.    cin >> n;
  8.    for (int i = 1; i <= n; ++i) {
  9.        cout << string(n - i, ' ');
  10.        for (int j = 0; j + 1 < i; ++j) cout << "* ";
  11.        cout << "*" << endl;
  12.    }
  13. }
  14.  
  15. //Problema 2
  16. #include <iostream>
  17. using namespace std;
  18.  
  19. void imprime(int n, int i) {
  20.    if (i == 1) cout << n%10 << endl;
  21.    else if (n/10 == 0) cout << -1 << endl;
  22.    else imprime(n/10, i - 1);
  23. }
  24.  
  25. int main() {
  26.    int n, i;
  27.    cin >> n >> i;
  28.    imprime(n, i);
  29. }
  30.  
  31. //Problema 3
  32. #include <iostream>
  33. using namespace std;
  34.  
  35. int main() {
  36.    string s;
  37.    cin >> s;
  38.    for (int i = 0; i < s.size() >> 1; ++i) {
  39.        if (i > 0) cout << ", ";
  40.        cout << s[i] << " + " << s[s.size() - 1 - i] << " = " << s[i] - '0' + s[s.size() - 1 - i] - '0';
  41.    }
  42.    if (s.size()&1) cout << ((s.size() > 1)?", ":"") << s[s.size()>>1];
  43.    cout << endl;
  44. }
  45.  
  46.  
  47. //Problema 4
  48. #include <iostream>
  49. using namespace std;
  50.  
  51. int main() {
  52.    int maxim = 0, act = 0;
  53.    char c, ant = '0';
  54.    while (cin >> c) {
  55.        if (c >= ant) ++act;
  56.        else {
  57.            maxim = max(maxim, act);
  58.            act = 1;
  59.        }
  60.        ant = c;
  61.    }
  62.    maxim = max(maxim, act);
  63.    cout << maxim << endl;
  64. }
  65.  
  66.  
  67. //Problema 6
  68. #include <iostream>
  69. using namespace std;
  70.  
  71. int mcd(int a, int b) {
  72.    if (a == b) return a;
  73.    return (a > b) ? mcd(a - b, b) : mcd(b - a, a);
  74. }
  75.  
  76. int main() {
  77.    int a, b;
  78.    cin >> a >> b;
  79.    cout << mcd(a, b) << endl;
  80. }
  81.  

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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void paisaje(int num, int& ant, unsigned& a, unsigned&b, bool& subida, bool& p_bajo);
  5.  
  6. int main() {
  7. int num, ant=0;
  8. bool subida_m = false, p_bajo = false;
  9. unsigned m = 0, v = 0;
  10. unsigned a = 0, b = 0;
  11.  
  12. cout << "Introduzca secuencia de enteros: ";
  13. do{
  14. cin >> num;
  15. paisaje(num,ant,a,b,subida_m,p_bajo);
  16. if(a>m){
  17. m = a;
  18. }
  19. if(b>v){
  20. v = b;
  21. }
  22. }while(num!=0);
  23.  
  24. cout << "La montaña mas larga: " << m << endl;
  25. cout << "El valle mas largo: " << v << endl;
  26.  
  27. return 0;
  28. }
  29.  
  30. void paisaje(int num, int& ant, unsigned& a, unsigned& b, bool& subida, bool& p_bajo){
  31. if(ant==0){
  32. ant = num;
  33. a++;
  34. b++;
  35. }else if((num<ant)&&(num!=0)&&(!p_bajo)){
  36. ant = num;
  37. a++;
  38. b++;
  39. }else if((num<ant)&&(num!=0)&&(p_bajo)){
  40. p_bajo = false;
  41. b = 2;
  42. a++;
  43. ant = num;
  44. }else if((num>ant)&&(!subida)&&(num!=0)&&(!p_bajo)){
  45. a = 2;
  46. b++;
  47. ant = num;
  48. subida = true;
  49. p_bajo = true;
  50. }else if((num>ant)&&(subida)&&(num!=0)&&(p_bajo)){
  51. a++;
  52. b++;
  53. ant = num;
  54. }
  55. }

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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const unsigned M = 10;
  5. typedef int TDatos[M][M];
  6. struct TMatriz{
  7. TDatos matriz;
  8. unsigned f;
  9. unsigned c;
  10. };
  11.  
  12. void introDatos(TMatriz& m);
  13. void puntosSilla(const TMatriz& m, bool& notiene);
  14. int menorFila(const TMatriz& m, unsigned i);
  15. int mayorCol(const TMatriz& m, unsigned j);
  16.  
  17. int main() {
  18. TMatriz m;
  19. bool notiene = true;
  20.  
  21. introDatos(m);
  22. puntosSilla(m,notiene);
  23.  
  24. if(notiene){
  25. cout << "La matriz no tiene ningun punto silla." << endl;
  26. }
  27.  
  28. return 0;
  29. }
  30.  
  31. void introDatos(TMatriz& m){
  32. cout << "Introduzca numero de filas: ";
  33. do{
  34. cin >> m.f;
  35. }while((m.f<=0)||(m.f>10));
  36. cout << "Introduzca numero de columnas: ";
  37. do{
  38. cin >> m.c;
  39. }while((m.c<=0)||(m.c>10));
  40. cout << "Introduzca numeros en la matriz " << m.f << "x" << m.c << ": ";
  41. for(unsigned i=0;i<m.f;i++){
  42. for(unsigned j=0;j<m.c;j++){
  43. cout << "m(" << i+1 << "," << j+1 << "): ";
  44. cin >> m.matriz[i][j];
  45. }
  46. }
  47. }
  48.  
  49. void puntosSilla(const TMatriz& m, bool& notiene){
  50. int menor;
  51. unsigned i,j;
  52.  
  53. for(i=0;i<m.f;i++){
  54. menor = menorFila(m,i);
  55. for(j=0;j<m.c;j++){
  56. if((m.matriz[i][j]==menor)&&(menor==mayorCol(m,j))){
  57. cout << "Punto Silla: (" << i+1 << "," << j+1 << ")" << endl;
  58. notiene = false;
  59. }
  60. }
  61. }
  62. }
  63.  
  64. int menorFila(const TMatriz& m, unsigned i){
  65. int menor = m.matriz[i][0];
  66.  
  67. for(unsigned j=1;j<m.c;j++){
  68. if(m.matriz[i][j]<menor){
  69. menor = m.matriz[i][j];
  70. }
  71. }
  72. return menor;
  73. }
  74.  
  75. int mayorCol(const TMatriz& m, unsigned j){
  76. int mayor = m.matriz[0][j];
  77.  
  78. for(unsigned i=1;i<m.f;i++){
  79. if(m.matriz[i][j]>mayor){
  80. mayor = m.matriz[i][j];
  81. }
  82. }
  83. return mayor;
  84. }


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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6.    int X,I;
  7.    cout << "Ingrese la catidad de filas" << endl;
  8.    cin >> X;
  9.    cout << "Ingrese la catidad de columnas" << endl;
  10.    cin >> I;
  11.    int mat[X][I],i,x,max,min,col2,fila2,col1,fila1,ensilladura=0;
  12.    for (x=0;x<X;x++)
  13.    {
  14.        cout << "Fila numero " << x+1 << endl;
  15.        for (i=0;i<I;i++)
  16.            cin >> mat[x][i];
  17.    }
  18.    for (x=0;x<X;x++)
  19.    {
  20.        for (i=0;i<I;i++)
  21.        {
  22.            if (i==0)
  23.            {
  24.                min = mat[x][i];
  25.                fila1 = i;
  26.                col1 = x;
  27.            }
  28.            else
  29.                if (mat[x][i] < min)
  30.                {
  31.                    min = mat[x][i];
  32.                    fila1 = i;
  33.                    col1 = x;
  34.                }
  35.        }
  36.        i = fila1;
  37.        for (x=0;x<X;x++)
  38.        {
  39.            if (x==0)
  40.            {
  41.                max = mat[x][i];
  42.                fila2 = i;
  43.                col2 = x;
  44.            }
  45.            else
  46.                if (mat[x][i] > max)
  47.                {
  48.                    max = mat[x][i];
  49.                    fila2 = i;
  50.                    col2 = x;
  51.                }
  52.        }
  53.        if (fila1==fila2 && col1==col2)
  54.        {
  55.            ensilladura = 1;
  56.        }
  57.    }
  58.    if (ensilladura == 1)
  59.    {
  60.        cout << "Hay punto de ensilladura";
  61.    }
  62.    else
  63.    {
  64.        cout << "No hay punto de ensilladura";
  65.    }
  66. return 0;
  67. }


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>
using namespace std;
 
int main() {
char c;
int comas, numChar;
 
numChar = 0;
comas = 0;
 
cout << "Introduzca texto terminado en '.': ";
do{
cin.get(c);
numChar++;
if(c==','){
comas++;
}
}while(c!='.');
 
cout << "Numero de comas: " << comas << endl;
cout << "Numero de caracteres: " << numChar << endl;
return 0;
}

Yo lo he hecho así:

Código:
#include <iostream>
using namespace std;

int main ()
{
char texto[200];
bool salir = 0;
bool punto = 0;
int coma = 0;
int n = 0;
char temp = 'n';
while (salir == 0)
{
cout << "Comience a intoducir el texto: ";
cin >> texto;
for ( n = 0 , punto = 0 , coma = 0 ; punto == 0 ; n++ )
{
if (texto[n] == ',' )
coma++;
else if (texto[n] == '.' )
punto =1;
}
cout << "El numero de comas es: " << coma << endl;
cout << "El numero de caracteres leidos es: " << n << endl;
cout << "Introduzca 'S' para salir, cualquier otro caracter para continuar:" << endl;
cin >> temp;
if (temp == 'S' )
salir = 1;
}
return 0;
}

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>
using namespace std;
 
int main() {
char c;
int comas, numChar;
 
numChar = 0;
comas = 0;
 
cout << "Introduzca texto terminado en '.': ";
do{
cin.get(c);
numChar++;
if(c==','){
comas++;
}
}while(c!='.');
 
cout << "Numero de comas: " << comas << endl;
cout << "Numero de caracteres: " << numChar << endl;
return 0;
}

Yo lo he hecho así:

Código:
#include <iostream>
using namespace std;

int main ()
{
char texto[200];
bool salir = 0;
bool punto = 0;
int coma = 0;
int n = 0;
char temp = 'n';
while (salir == 0)
{
cout << "Comience a intoducir el texto: ";
cin >> texto;
for ( n = 0 , punto = 0 , coma = 0 ; punto == 0 ; n++ )
{
if (texto[n] == ',' )
coma++;
else if (texto[n] == '.' )
punto =1;
}
cout << "El numero de comas es: " << coma << endl;
cout << "El numero de caracteres leidos es: " << n << endl;
cout << "Introduzca 'S' para salir, cualquier otro caracter para continuar:" << endl;
cin >> temp;
if (temp == 'S' )
salir = 1;
}
return 0;
}

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
  1. #include <iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. const unsigned MAX = 50;
  6. struct TFecha{
  7.   unsigned dia,mes,anyo;
  8. };
  9. struct TProducto{
  10.   unsigned codigo;
  11.   string nombre;
  12.   float precio;
  13.   TFecha fecha_cad;
  14. };
  15. typedef TProducto TMedicamentos[MAX];
  16. struct TFarmacia{
  17.   TMedicamentos med;
  18.   unsigned num;
  19. };
  20.  
  21. void LeerProducto(TProducto& p){
  22.   cout << "Introduzca codigo: ";
  23.   cin >> p.codigo;
  24.   cout << "Introduzca nombre: ";
  25.   getline(cin,p.nombre);
  26.   cout << "Introduzca precio: ";
  27.   cin >> p.precio;
  28.   cout << "FECHA: " << endl;
  29.   cout << "Introduzca dia: ";
  30.   do{
  31.      cin >> p.fecha_cad.dia;
  32.   }while((p.fecha_cad.dia<1)||(p.fecha_cad.dia>31));
  33.   cout << "Introduzca mes: ";
  34.   do{
  35.      cin >> p.fecha_cad.mes;
  36.   }while((p.fecha_cad.mes<1)||(p.fecha_cad.mes>12));
  37.   cout << "Introduzca año: ";
  38.   cin >> anyo;
  39. }
  40.  
  41. void EscribirProducto(const TProducto& p){
  42.   cout << "Codigo: " << p.codigo << endl;
  43.   cout << "Nombre: " << p.nombre << endl;
  44.   cout << "Precios: " << p.precio << endl;
  45.   cout << "Fecha: " << p.fecha_cad.dia << "/" << p.fecha_cad.mes << "/" << p.fecha_cad.anyo << endl;
  46. }
  47.  
  48. void inicializarFarmacia(TFarmacia& f){
  49.   f.num = 0;
  50. }
  51.  
  52. void insertarProducto(TFarmacia& f, const TProducto& p){
  53.   f.med[f.num] = p;
  54.   f.num++;
  55. }
  56.  
  57. void BorrarProducto(TFarmacia& f, unsigned codigo){
  58.   bool esta = false;
  59.   unsigned i;
  60.   for(i=0;i<f.num;i++){
  61.      if(f.med[i].codigo == codigo){
  62.         esta = true;
  63.         break;
  64.      }
  65.   }
  66.   if(esta){
  67.      f.med[i] = f.med[f.num-1];
  68.      f.num--;
  69.   }else{
  70.      cout << "No esta" << endl;
  71.   }
  72. }
  73.  
  74. void BuscarProductoCodigo(const TFarmacia& f, unsigned codigo, bool& encontrado, TProducto& p){
  75.   encontrado = false;
  76.  
  77.   for(unsigned i=0;i<f.num;i++){
  78.      if(f.med[i].codigo == codigo){
  79.         p = f.med[i];
  80.         encontrado = true;
  81.         break;
  82.      }
  83.   }
  84. }
  85.  
  86. void BuscarProductoNombre(const TFarmacia& f, const string& nombre, bool& encontrado, TProducto& p){
  87.   encontrado = false;
  88.  
  89.   for(unsigned i=0;i<f.num;i++){
  90.      if(f.med[i].nombre == nombre){
  91.         p = f.med[i];
  92.         encontrado = true;
  93.         break;
  94.      }
  95.   }
  96. }
  97.  
  98. void ListarFarmacia(const TFarmacia& f){
  99.   for(unsigned i=0;i<f.num;i++){
  100.      EscribirProducto(f.med[i]);
  101.      cout << endl;
  102.   }
  103. }

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
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6.    int num,turno=1,resto,aux;
  7.    do
  8.    {
  9.        cout<<"Introduzca numero: ";
  10.        cin>>num;
  11.    }
  12.    while(num<=0);
  13.    if(num%4==1)
  14.        turno=0;
  15.    do
  16.    {
  17.        cout<<num<<" Objetos"<<endl;
  18.        switch(turno)
  19.        {
  20.            case 0: do
  21.                    {
  22.                        cout<<"Quitar [1] [2] [3] objetos: ";
  23.                        cin>>resto;
  24.                    }
  25.                    while(resto<1 || resto>3 || resto>num);
  26.                    turno=2;
  27.                    break;
  28.            case 2: resto=4-resto;
  29.                    cout<<"Computador quita "<<resto<<" objetos"<<endl;
  30.                    turno=0;
  31.                    break;
  32.            case 1: for(int j=num-1;j>=num-3;j--)
  33.                        if(j%4==1)
  34.                            aux=j;
  35.                    resto=num-aux;
  36.                    cout<<"Computador quita "<<resto<<" objetos"<<endl;
  37.                    turno=0;
  38.                    break;
  39.        }
  40.        num-=resto;
  41.    }
  42.    while(num!=0);
  43.    cout<<"Computador Wins... user sucks!!!"<<endl;
  44. }
  45.  


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>
#include <Windows.h>
using namespace std;

void cuenta (int& num, int& cont)
{
int contaux=0;
int numant=0;
while (numant<=num&&num<2)
{
contaux++;
numant=num;
cin >> num;
}

if (contaux>cont)
cont=contaux;
}


void main ()
{
int num;
int cont=0;
cout << "Escribe ceros y unos separados por espacios y con un 2 al final: " << endl;
cin >> num;
while(num<2)
cuenta(num, cont);
cout << "La mayor sucesion ordenada es de: " << cont << endl;
Sleep(50000);
}


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
  1. /*5.- Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que:
  2. 1 <= h <= n y además a1<...ah-1 < ah > ah+1 > ...an
  3. Por ejemplo 24, 13, 6, 15, 50 sería un valle.
  4. Dada una secuencia de enteros terminada en cero (0) que como mínimo contiene una montaña y un valle
  5. (suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles),
  6. diseña un programa que calcule la longitud de la montaña y el valle más largos.
  7. */
  8.  
  9. #include <iostream>
  10. #include <Windows.h>
  11. using namespace std;
  12.  
  13. void cuentasubida(int& num, int& prevNum, int& subida)
  14. {
  15. subida++;
  16. while (prevNum<num && num!=0)
  17. {
  18. subida++;
  19. prevNum=num;
  20. cin >> num;
  21. }
  22. }
  23.  
  24. void cuentabajada(int& num, int& prevNum, int& bajada)
  25. {
  26. bajada++;
  27. while (prevNum>num && num!=0)
  28. {
  29. bajada++;
  30. prevNum=num;
  31. cin >> num;
  32. }
  33. }
  34.  
  35. void main ()
  36. {
  37. int num, prevNum, montaña=0, valle=0, subida=0, bajada=0, aux=0;
  38. cout << "Introduce una sucesion de numeros que incluya al menos una montaña y un valle: " << endl;
  39. cin >> num;
  40. while (num != 0)
  41. {
  42. prevNum=num;
  43. cin >> num;
  44. while (num != 0)
  45. {
  46. if (prevNum<num)
  47. {
  48. cuentasubida(num, prevNum, subida);
  49. if(bajada!=0) //Si antes había una bajada tendrá el valor de la parte descendente, en otro caso es el comienzo de un valle incompleto por lo que se salta esta parte
  50. {
  51. aux=(bajada+subida)-1;
  52. bajada=0; //Como el valle está completo borra la parte de la bajada quedando sólo el valor de la última parte ascendente
  53. if(aux>valle)
  54. valle=aux;
  55. }
  56. }
  57. if (num!=0 && prevNum>num)
  58. {
  59. cuentabajada(num, prevNum, bajada);
  60. if(subida=!0) // Igual que antes, si había un valor de subida es que la montaña estaba empezada
  61. {
  62. aux=(subida+bajada)-1;
  63. subida=0; // Dado que la montaña está completa borra la parte ascendente dejando el final descendente
  64. if (aux>montaña)
  65. montaña=aux;
  66. }
  67. }
  68. }
  69. }
  70. cout << "La montaña mas larga es de " << montaña << endl;
  71. cout << "El valle mas largo es de " << valle << endl;
  72. Sleep(5000000); // para el programa para analizar los resultados
  73. }
  74.  

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!!!!!!!!!!!!