Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - bigfu

#21
Cita de: Kherom en 11 Agosto 2011, 16:02 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.
#22
Cita de: 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?

#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í:

#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.
#23
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 (cpp) [Seleccionar]
#include <iostream>
using namespace std;

const unsigned M = 10;
typedef int TDatos[M][M];
struct TMatriz{
TDatos matriz;
unsigned f;
unsigned c;
};

void introDatos(TMatriz& m);
void puntosSilla(const TMatriz& m, bool& notiene);
int menorFila(const TMatriz& m, unsigned i);
int mayorCol(const TMatriz& m, unsigned j);

int main() {
TMatriz m;
bool notiene = true;

introDatos(m);
puntosSilla(m,notiene);

if(notiene){
cout << "La matriz no tiene ningun punto silla." << endl;
}

return 0;
}

void introDatos(TMatriz& m){
cout << "Introduzca numero de filas: ";
do{
cin >> m.f;
}while((m.f<=0)||(m.f>10));
cout << "Introduzca numero de columnas: ";
do{
cin >> m.c;
}while((m.c<=0)||(m.c>10));
cout << "Introduzca numeros en la matriz " << m.f << "x" << m.c << ": ";
for(unsigned i=0;i<m.f;i++){
for(unsigned j=0;j<m.c;j++){
cout << "m(" << i+1 << "," << j+1 << "): ";
cin >> m.matriz[i][j];
}
}
}

void puntosSilla(const TMatriz& m, bool& notiene){
int menor;
unsigned i,j;

for(i=0;i<m.f;i++){
menor = menorFila(m,i);
for(j=0;j<m.c;j++){
if((m.matriz[i][j]==menor)&&(menor==mayorCol(m,j))){
cout << "Punto Silla: (" << i+1 << "," << j+1 << ")" << endl;
notiene = false;
}
}
}
}

int menorFila(const TMatriz& m, unsigned i){
int menor = m.matriz[i][0];

for(unsigned j=1;j<m.c;j++){
if(m.matriz[i][j]<menor){
menor = m.matriz[i][j];
}
}
return menor;
}

int mayorCol(const TMatriz& m, unsigned j){
int mayor = m.matriz[0][j];

for(unsigned i=1;i<m.f;i++){
if(m.matriz[i][j]>mayor){
mayor = m.matriz[i][j];
}
}
return mayor;
}
#24
Citar9.- 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?
#25
Cita de: 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.

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.
#26
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!
#27
Lo que hace el while es comprobar si el valor que tiene el array en la posición i es distinto de 10. Si es distinto de 10, entra en un bucle infinito (aumentando en 1 el valor de cont1 en cada iteración).
Si lo que quires es contar numeros positivos o negativos, tendrías que utilizar una estructura if-else, pero de todos modos no me queda claro el significado de los valores del array. ¿Cada número no negativo indica el kilómetro de la carretera? ¿Cada número indica un día?
#28
Y tanto que está en el while. Date cuenta que un while es un bucle y si quieres comprobar que un elemento del array es un determinado valor, una de dos: o no entras nunca en el bucle o entras y haces un bucle infinito.
Yo cambiaría el while por un "if" que compare si el contenido es igual a 10, si lo que quieres es contar el numero de veces que se repite el 10, por lo que veo en el cout de abajo (por cierto, en ese cout estas imprimiendo un doble espacio antes del resultado).
#29
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 (cpp) [Seleccionar]
#include <iostream>
using namespace std;

void paisaje(int num, int& ant, unsigned& a, unsigned&b, bool& subida, bool& p_bajo);

int main() {
int num, ant=0;
bool subida_m = false, p_bajo = false;
unsigned m = 0, v = 0;
unsigned a = 0, b = 0;

cout << "Introduzca secuencia de enteros: ";
do{
cin >> num;
paisaje(num,ant,a,b,subida_m,p_bajo);
if(a>m){
m = a;
}
if(b>v){
v = b;
}
}while(num!=0);

cout << "La montaña mas larga: " << m << endl;
cout << "El valle mas largo: " << v << endl;

return 0;
}

void paisaje(int num, int& ant, unsigned& a, unsigned& b, bool& subida, bool& p_bajo){
if(ant==0){
ant = num;
a++;
b++;
}else if((num<ant)&&(num!=0)&&(!p_bajo)){
ant = num;
a++;
b++;
}else if((num<ant)&&(num!=0)&&(p_bajo)){
p_bajo = false;
b = 2;
a++;
ant = num;
}else if((num>ant)&&(!subida)&&(num!=0)&&(!p_bajo)){
a = 2;
b++;
ant = num;
subida = true;
p_bajo = true;
}else if((num>ant)&&(subida)&&(num!=0)&&(p_bajo)){
a++;
b++;
ant = num;
}
}


Si pudiérais darme alguna pista o consejo para intentar simplificarlo un poco, os lo agradecería  :D
#30
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...

CitarEjercicio 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.