2

Me salió un error que no entiendo:

[Error] expected constructor, destructor, or type conversion before '(' token".
[Error] conversión esperada de constructor, destructor o tipo antes del token '('.

Lo que quería hacer es un programa que te pida las filas y columnas de una matriz después que le de un valores random a la matriz después que muestre la matriz que encuentre el numero de mayor valor de la matriz y que al final muestre ese numero.

El código se los demuestro abajo.

  1. librerías, prototipos, declaración de enteros y matriz
#include<iostream>
#include<stdlib.h>
#include<time.h>

using namespace std;
srand(time(NULL));

void pedir();
void generar();
void imprimir();
int comprobar();

int matriz[100][100];
int filas, columnas;
  1. funcion int main()
int main(){
    
    pedir();
    generar();
    imprimir();
    cout<<"el mayor numero de la matriz es: "<<comprobar();
    cout<<endl;
    
    system("pause");
    return 0;
}

3)funciones

void pedir(){
    cout<<"introducir el numero de filas"<<endl;
    cin>>filas;
    cout<<"introducir el numero de columnas"<<endl;
    cin>>columnas;
}

void generar(){
    for(int f=0;f<filas;f++){
        for(int c=0;c<columnas;c++){
            matriz[f][c]=1+rand()%(101-1);
        }
    }
}

void imprimir(){
    cout<<endl;
    for(int f=0;f<filas;f++){
        for(int c=0;c<columnas;c++){
            cout<<" ["<<matriz[f][c]<<"] ";
        }
        cout<<endl;
    }
}

int comprobar(){
    int mayor=0;
    cout<<endl;
    
    for(int f=0;f<filas;f++){
        for(int c=0;c<columnas;c++){
            if(matriz[f][c]>mayor){
                mayor=matriz[f][c];
            }
        }
    }
    
    return mayor;
}

El programa no se puede abrir se los mando completo para que me ayuden con los errores y para leer sus sugerencias para mejorar el código. gracias.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
edwin
  • 43
  • 5
  • Para la siguiente, por favor, **remarca de alguna forma la línea que te provoca el error**. – Trauma Jul 29 '20 at 05:50

2 Answers2

4
srand(time(NULL));

Eso es una llamada a una función.

Sin embargo, las llamadas a funciones no se pueden colocar en cualquier sitio: solo se pueden hacer desde el cuerpo de una función o desde sentencias de asignación (X = srand( time( NULL ) );)

Si te preguntas porqué si se pueden hacer desde la lista de argumentos, es porque esto es equivalente a una asignación. Puedes verlo como:

auto tmp = time( NULL );
X = srand( tmp );

Así pues, simplemente, mueve esa llamada algún sitio en el que sea legal; por ejemplo, al cuerpo de tu función main( ).

  int main( ) {
    srand( time( NULL ) ); // <-- AQUÍ
    pedir( );
    generar( );
  ...
Trauma
  • 25,297
  • 4
  • 37
  • 60
4

Tu código, a parte del error mencionado por Trauma, tiene errores de algoritmo y hace uso de malas prácticas.

  1. Estás programando en pero haces uso de cabeceras de .

    Las cabeceras <stdlib.h> y <time.h> no deben ser usadas en programas de C++, si realmente necesitas algo de ellas (que no es el caso) deberías usar las versiones adaptadas a C++ que son <cstdlib> y <ctime>. Lee este hilo para saber más del tema.

  2. Evita usar variables globales.

    Las variables globales son muy problemáticas y propensas a errores, evita usarlas. Lee este hilo para saber más del tema.

  3. La función rand pertenece a las rutinas de C.

    Se considera una función lenta, ineficiente e insegura, tanto es así que se valora deprecar su uso en C++, no la uses. Lee este hilo para saber más del tema.


Mi propuesta es que uses el motor de números pseudo-aleatorios de C++ y que por supuesto, sigas las recomendaciones anteriores, si lo haces tu código podría parecerse a:

#include <iostream>
#include <random>
#include <vector>
#include <utility>
#include <algorithm>
#include <limits>

using Doblete = std::pair<int, int>;
using Fila = std::vector<int>;
using Matriz = std::vector<Fila>;

Usaremos <vector> para crear la matriz dinámicamente, haciendo que el tamaño sea verdaderamente arbitrario en lugar de limitarlo a un máximo de cien. La cabecera <utility> nos da acceso al tipo std::pair, la <algorithm> a las funciones std::max y std::max_element y <limits> a la plantilla std::numeric_limits. Los alias Doblete, Fila y Matriz hacen que el código sea más fácil de comprender.

Doblete pedir()
{
    Doblete resultado;

    std::cout << "introducir el numero de filas\n";
    std::cin >> resultado.first;

    std::cout << "introducir el numero de columnas\n";
    std::cin >> resultado.second;

    return resultado;
}

Pedimos los datos dentro de la función pedir y los devolvemos como Doblete, nos ahorramos así una variable global.

Matriz generar(const Doblete &tamanyo)
{
    Matriz resultado(tamanyo.first, Fila(tamanyo.second, 0));

    std::random_device dispositivo;
    std::mt19937 generador(dispositivo());
    std::uniform_int_distribution<> distribucion(1, 100);

    for (auto &fila : resultado)
    {
        for (auto &valor : fila)
        {
            valor = distribucion(generador);
        }
    }

    return resultado;
}

Generamos la matriz dentro de la función generar; no nos debe preocupar la copia del resultado desde dentro de la función a fuera de la función pues el estándar de C++ garantiza que ese copia será obviada (copy elysion optimization). Se usa el motor de números pseudo-aleatorios de C++.

El resto del código quedaría así:

void imprimir(const Matriz &matriz)
{
    for (const auto &fila : matriz)
    {
        for (const auto &valor : fila)
        {
            std::cout << " [" << valor << "] ";
        }
        std::cout << '\n';
    }
}

int comprobar(const Matriz &matriz)
{
    int resultado = std::numeric_limits<int>::min();

    for (const auto &fila : matriz)
    {
        resultado = std::max(resultado, *std::max_element(fila.begin(), fila.end()));
    }

    return resultado;
}

int main()
{
    const auto &matriz = generar(pedir());
    imprimir(matriz);

    std::cout << "El mayor numero de la matriz es: " << comprobar(matriz) << '\n';

    return 0;
}

Puedes verlo funcionando en Try it online!.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82