Reto Universidad [C++].

Iniciado por bigfu, 20 Julio 2011, 13:04 PM

0 Miembros y 1 Visitante están viendo este tema.

bigfu

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.
A reader lives a thousand lives before he dies. The man who never reads lives only one

bigfu

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?
A reader lives a thousand lives before he dies. The man who never reads lives only one

PiroskY

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)

bigfu

#33
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;
}
A reader lives a thousand lives before he dies. The man who never reads lives only one

PiroskY

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

int main()
{
    int X,I;
    cout << "Ingrese la catidad de filas" << endl;
    cin >> X;
    cout << "Ingrese la catidad de columnas" << endl;
    cin >> I;
    int mat[X][I],i,x,max,min,col2,fila2,col1,fila1,ensilladura=0;
    for (x=0;x<X;x++)
    {
        cout << "Fila numero " << x+1 << endl;
        for (i=0;i<I;i++)
            cin >> mat[x][i];
    }
    for (x=0;x<X;x++)
    {
        for (i=0;i<I;i++)
        {
            if (i==0)
            {
                min = mat[x][i];
                fila1 = i;
                col1 = x;
            }
            else
                if (mat[x][i] < min)
                {
                    min = mat[x][i];
                    fila1 = i;
                    col1 = x;
                }
        }
        i = fila1;
        for (x=0;x<X;x++)
        {
            if (x==0)
            {
                max = mat[x][i];
                fila2 = i;
                col2 = x;
            }
            else
                if (mat[x][i] > max)
                {
                    max = mat[x][i];
                    fila2 = i;
                    col2 = x;
                }
        }
        if (fila1==fila2 && col1==col2)
        {
            ensilladura = 1;
        }
    }
    if (ensilladura == 1)
    {
        cout << "Hay punto de ensilladura";
    }
    else
    {
        cout << "No hay punto de ensilladura";
    }
return 0;
}

Kherom

#35
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.


bigfu

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.
A reader lives a thousand lives before he dies. The man who never reads lives only one

Kherom

Cita de: bigfu en 11 Agosto 2011, 14:21 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.

bigfu

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.
A reader lives a thousand lives before he dies. The man who never reads lives only one