Problemas con arrays C++

Iniciado por #Aitor, 26 Marzo 2014, 03:46 AM

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

#Aitor

Hola buenas.

Ando probando los arrays en C++, y vengo muy acostumbrado de PHP. Tengo el siguiente problema, según C++ para hacer arrays se utiliza la siguiente sintaxis.



Código (C++) [Seleccionar]
Type name[long] = {... , ... , ...};

En el caso del ejemplo de la tabla anterior.
Código (c++) [Seleccionar]
String foo[4]{ "Aitor", "Lluvia", "Luna", "Azul" };

A dónde quiero llegar es si lo siguiente retornaría falso.

Código (c++) [Seleccionar]
if ( foo[5] == false){ cout << "Retorna false"; }

Pero da errores de compilación. Suponiendo que no retornase un valor False... ¿Cómo cerrarías el siguiente bucle?

Código (c++) [Seleccionar]
int main()
{
    string foo[4] = {"Aitor", "Lluvia", "Luna", "Azul"};
    int x = 0;

        while(...){
        cout  << foo[x] << endl;
        x++;

    }
}


Podría usarse

Código (c++) [Seleccionar]
while(x < 4){

Pero es muy forzado y no es "automatizado" dado que doy por hecho que sé cuanto es la longitud del array.

Un saludo y gracias.
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

rir3760

Para calcular el numero de elementos de un array puedes utilizar, siguiendo tu ejemplo:
Código (cpp) [Seleccionar]

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;

int main()
{
   string foo[4] = {
      "Aitor",
      "Lluvia",
      "Luna",
      "Azul"
   };
   size_t num_elem = sizeof foo / sizeof foo[0];
   
   for (size_t i = 0; i < num_elem; i++)
      cout  << foo[i] << endl;
   
   return 0;
}

Sin embargo es un idioma de C, si estas aprendiendo C++ mejor utiliza la clase vector.

Bajo el nuevo estándar C++11 la declaración de un vector es similar a la de un array y al utilizar "auto" nos olvidamos de indicar el tipo de la variable en el único bucle del programa:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <vector>
using std::vector;

int main()
{
   vector<string> foo = {
      "Aitor",
      "Lluvia",
      "Luna",
      "Azul"
   };
   
   for (auto i = 0; i != foo.size(); ++i)
      cout  << foo[i] << endl;
   
   return 0;
}


Si el programa se compila bajo el estándar anterior C++98 los elementos del array se deben agregar manualmente y se debe indicar el tipo de la variable (este es vector<string>::size_type).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

eferion

Cita de: rir3760 en 26 Marzo 2014, 04:23 AM
Bajo el nuevo estándar C++11 la declaración de un vector es similar a la de un array y al utilizar "auto" nos olvidamos de indicar el tipo de la variable en el único bucle del programa.

En C++11 también se puede simplificar el bucle:

Código (cpp) [Seleccionar]

#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <vector>
using std::vector;

int main()
{
   vector<string> foo = {
      "Aitor",
      "Lluvia",
      "Luna",
      "Azul"
   };

   for ( auto str : foo )
      cout  << str << endl;

   return 0;
}

amchacon

#3
Ni "forzado" ni "automatico", en C no habia ningun sistema para controlar que no adcedieras a posiciones erroneas. Ahi trabajas sabiendo la longitud del array (salvo en el caso de cadenas, que se ponia un cero en el ultimo elemento para acabar).

Bueno ni en C++ hay un sistema. Las razones de esto son puramente por eficiencia, es un desperdicio de recursos ir comprobando si adcedes a una posicion erronea cada vez. De modo que si lo haces, no da error de compilacion y sus consecuencias son indeterminadas (puede que modifiques a otras variables, puede que te de un error de ejecución...).

Los compañeros de arriba te han respondido usando la clase vector. Una objeto que contiene un array que puedes redimensionarlo a tu gusto, ese objeto ademas tiene control sobre su tamaño y podemos consultarlo con el metodo size().

Realmente a la hora de controlarlo no hay mucha diferencia: Su tamaño. Si adcedemos a posiciones invalidas dara error de ejecucion.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Yoel Alejandro

Si el autor del post viene de programar PHP sería mucho mejor atenerse a las clases de alto nivel de C++ (sencillas y potentes), que programar en el "rudimentario" (pero elemental y eficiente) nivel de C. ¿no?

Para programar en C, y sobre todo con arrays y cadenas, debes tener muy en cuenta aspectos de hardware para elaborar código eficiente. Mientras las clases de C++ abstraen la capa de hardware, manteniendo al programador en un nivel como "virtual" diría yo, independiente casi por completo de los aspectos máquina.

Lo mejor sería la clase vector sobre el tipo string, es lo que más se parece a la manera de trabajar PHP, javascript, Java y similares.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)