[C con Clase] Consulta sobre c++

Steven Davidson srd4121 en njit.edu
Jue Oct 7 21:13:19 CEST 2010


Hola Fernando,

On 10/7/2010 2:25 PM, Fernando Samaha wrote:
> Hola, estoy haciendo un curso de c++ (soy novato) y quería hacer una
> pregunta sobre un array que en principio tiene un índice "i"
> numérico. Lo que quiero lograr es que si el índice es igual a 1, una
> variable char "a" sea igual a "casa", por ejemplo. Esto se puede

Primeramente, 'a' no es un 'char', sino un array de 'char'. Esto es una 
diferencia notable.

> hacer o chocan los tipos de datos (int y char)?
>

En tu caso, esto no debería suponer un problema.

> Lo que hice hasta ahora es lo siguiente que me da errores:
>

Veamos el código fuente

> #include<iostream.h>
> #include<time.h>
> #include<stdlib.h>
> #include<iomanip.h>

Estos nombres no son correctos para el estándar actual de C++. Si tienes 
un compilador antiguo, entonces no los cambies. Los nombres correctos son:

#include <iostreamh>
#include <ctime>
#include <cstdlib>
#include <iomanip>

// También agrega la siguiente línea después de la inclusión anterior
using namespace std;

> int main(){
> const int maximo=14;

Típicamente, las constantes se definen globalmente.

> int aleatorio(maximo);

Esto es incorrecto. Aparentas definir un prototipo llamado 'aleatorio'. 
Sin embargo, tu programa usa 'aleatorio' como un array, y no como una 
función.

Deberías usar corchetes [] y no paréntesis (). Esto es,

int aleatorio[maximo];

> int i, x=1;
> char a[9];
> srand((unsigned) time(NULL));
> for(i=0; i<maximo;++i){
> aleatorio[i]=rand%4;
> if(aleatorio[i]=0){

Esto es gramaticalmente correcto, pero lógicamente erróneo. Aquí estás 
asignando (copiando) el valor de 0 al elemento de índice 'i' del array 
'aleatorio'. Recuerda que el operador = indica asignación y == indica 
comparación de igualdad.

Esto debería ser:

if( aleatorio[i] == 0 )

> a="Local";

En C/C++, un array es tratado como una dirección de memoria constante. 
Por lo tanto, aquí estás intentando asignar la dirección de memoria de 
"Local" al array 'a', pero como 'a' es constante, te da un error.

Lo que te interesa es copiar el contenido de la cadena literal, "Local", 
al contenido del array, 'a'. Esto implica que tienes que recorrer el 
array 'a' e ir copiando carácter por carácter. Por ejemplo,

a[0] = 'L';
a[1] = 'o';
a[2] = 'c';
a[3] = 'a';
a[4] = 'l';
a[5] = 0;  // El carácter nulo indica el final de la cadena

Sin embargo, esto es engorroso tener que escribir explícitamente cada 
carácter. Lo que se suele hacer es usar la función estándar, 'strcpy()', 
que se declara en <cstring>, el cual debes incluir. Esto sería,

strcpy( a, "Local" );

Esta función copia cada carácter de "Local" a cada elemento de 'a'; 
también agrega el carácter nulo al final.

> }
> else
> if(aleatorio[i]=1){
> a="Empate";
> }
> else
> if(aleatorio[i]=2){
> a="Visitante";
> }

Estos casos son muy parecidos al anterior que he explicado.

> cout<<"Partido # "<<setw(5)<<x<<" "<<a<<endl;
> ++x;

La verdad es que no necesitas la variable 'x', porque se parece mucho a 
la variable 'i'. De hecho, podemos decir que x=i+1. Por lo tanto, puedes 
eliminar 'x' y escribir:

cout << "Partido # " << setw(5) << i+1 << " " << a << endl;

Así te ahorras una variable.

> }
> cin.ignore();
> cin.get();
> return 0;
> }
>


Espero que haya aclarado todas las dudas.

Steven





Más información sobre la lista de distribución Cconclase