Dev - C++ - Ayuda con Vector

   
Vista:

Ayuda con Vector

Publicado por Francisco (5 intervenciones) el 08/10/2014 05:01:25
Tengo este problema, ya realice el programa pero la verdad nose como hacerlo, ni en que me equivoco, dejo el programa y lo como lo hice:

Crear un programa que realice lo siguiente:
a) Genere un vector A de tamaño N con números enteros entre [15 , 75] (Utilice rand() para generar los elementos del vector).
b) Muestre los N elementos del vector A.
c) Genere un segundo vector B de tamaño N con números enteros entre [15 , 75] (Utilice rand() para generar los elementos del vector).
d) Muestre los N elementos del vector B.
e) Crear un tercer vector C con la suma de los elementos de los dos vectores A y B.
f) Muestre el vector C.
g) Obtenga el promedio del vector C.

Mi intento:

#include<conio.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
main()
{
int i,N,A[N],B[N],C[N],suma=0;
float promedio;
srand(time(0));

printf("\n Ingrese tamaño del vector A y B: ");
scanf("%d",&N);
printf("\n Vector A:");
for (i=1;i<=N;i++)
A[i]=rand()%51+15;

for (i=1;i<=N;i++)
printf(" %d",A[i]);
printf("\n Vector B:");
for (i=1;i<=N;i++)
B[i]=rand()%51+15;
for (i=1;i<=N;i++)
printf(" %d",B[i]);
printf("\n Vector C:");
for (i=1;i<=N;i++)
C[i]=A[i]+B[i];
printf(" %d",C[i]);
suma=suma+C[i];
promedio=suma/N;

printf("\n El promedio del vector C es: %.1f",promedio);

getche();
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Ayuda con Vector

Publicado por vangodp (287 intervenciones) el 08/10/2014 08:08:51
son muchos errores que veo.
Sobre los vectores. Si quieres declarar un vector de N números lo primero que tienes que tener en cuenta es que C es un programa lineal. Siempre acuérdate de eso, repita a ti mismo siempre que tenga dudas "El programa ejecuta linea a linea y no vuelve hacia atrás.".
Ahora que tienes claro lo que dije te lo explicare, si no ha entrado en tu cabeza vuelva a repetir lo anterior XDDD

1 esta es la linea1
2 esta es la linea2
3 3...

Si hago
int N, A[N];

Y después preguntas:
printf ( "\n Ingrese tamaño del vector A y B: " );
scanf ( "%d", &N );

¿que crees que esta ocurriendo?

1º declaras N
2º declaras A[N];
3º preguntas el tamaño de N
4º les el tamaño de N

¿No cres que falla algo?

Bueno te explico. Si vas a crear un vector de N números primero debes saber lo que vale N.
int N;
printf ( "\n Ingrese tamaño del vector A y B: " );
scanf ( "%d", &N );
Ahora que sabes lo que vale N es cuando debes crear A[]
int A[N];
...y no antes.

Segun tu orden te voy explicar el error que estabas cometiendo.
int N, A[N];
printf ( "\n Ingrese tamaño del vector A y B: " );
scanf ( "%d", &N );

1º declaras N hasta aqui nada malo pero ya cometes un error. "NO SABES LO QUE CONTIENE". Puede tener residuos de otro programa ;)
2º declaras A del tamaño de N que no sabes lo que vale.
3º preguntas el tamaño de N aun que a esta altura no le veo sentido.
4º guardas el tamaño de N
En el 4 paso te diré que jamas podrás modificar el tamaño de un vector. A menos que uses memoria dinámica.

Entonces si creas un vector de N números N no le debes cambiar nunca después de haber creado el vector.

Ahora pongámonos con el tema de los indices.

Si declaro un vector del tamaño de 10 enteros: int vector[10] = {0}; //con el ={0} pongo todas las casillas a 0. Solo se puede hacer al declarar un vector.

Si declaro un vector de 10 posiciones el indice ba de 0 a 9 SIEMPRE. Lo digo por los fors que andas haciendo.
for ( i = 1; i <= N; i++ )
A[i] = rand() % 51 + 15;

i = 1 es el inicio, y i <= N el fin. Sin embargo con lo de i es menor o igual a N te has invadido memoria que pertenece a otro programa y esto es muy serio.
Si declaras un vector de 10 el ultimo numero no es el 10 sino 10-1 y por eso la forma correcta de crear un for es:
for ( i = o; i < N; i++ )
¿cual tiene lógica?
1º no eres tu que decide desde onde se va contar.
Si creas int A[N] y N vale 10 tienes las seguientes casillas disponibles: A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[8], A[9].
Cuenta cuantas hay... veras que hay 10 de 0 a 9. la Decima casilla es la A[9] y la A[10] estas invadiendo con lo de i <= N
debes usar for (i = 0; i < N... o sea i menor que N es 9 ok tenga claro. puedes empezar a leer de donde quieras i = 3, i = N-1 pero nunca i = N que ya te has pasado pero siempre ten presente esas 2 cosas.
Si declaro N tamaño y N vale 10 el indice es desde lo que sea pero no debo superar N-1 ni pasar de N.
Puedo querer guardar de A[5] hasta el final A[9] desta forma: A[5], A[6], A[7], A[8], A[9]. Entonces seria:
int i = 0;
int N = 10;
int A[N] = {0};
for ( i = 5; i < N; i++ )
A[i] = 1 + rand() % 100; //genera numeros de 1 a 100.

luego lo imprimo entero:
for ( i = 0; i < N; i++ )
printf("%d\n", A[i]);

Otra cosa... nunca use getche ni la librería conio si quieres llegar a ser un buen programador.
Aun que lo haya dicho tu maestro XDD
para pausar puedes usar getchar() en ves de getch();
Si no pausa pon 2 getchar seguidos y así no hace falta poner conio nunca mas.
El motivo de no usar conio es que no funciona en otros sistemas operativos.
No creo que haga mucha gracia a una empresa que te contrate cuando vean que usas conio para pausar un programa XD.

Y es "solo" eso. Intenta arreglarlo y vuelva a poner aquí. Si necesitas mas ayuda te seguiremos el tema ;)

¿Prefiero que aprendas y sepas programar bien que hacerte los deberes ok? Si te lo hago y nada mas nunca aprenderás de verdad y ahora tienes la oportunidad de entender el tema para siempre, basta practicar lo antes dicho. ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Vector

Publicado por Martín (65 intervenciones) el 08/10/2014 16:07:00
Un comentario:

Y entiendo que se trata de C, porque en C++ habría alguna diferencia.

La construcción:
1
2
3
int N;
	scanf("%d", &N);
	int A[N];
no es válida en C (y tampoco en C++), porque el tamaño de A tiene que conocerse en tiempo de compilación.

-- Una aclaración en letra más pequeña:
Si el tamaño del array A se conociera en tiempo de compilación, puede usarse:
1
2
const int N = 250;
	int A[N];
y en este caso el array A sería creado en la stack, y sería de tipo VLA (por Variable Length Array - array de tamaño variable), porque en C, const int N crea una variable de tipo "read-only" (de sólo lectura), pero no una constante verdadera. (Una constante verdadera se crearía con #define N 250).

Martín
Profesor particular de C++
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con Vector

Publicado por vangodp (287 intervenciones) el 08/10/2014 21:41:53
No se si te creo o creo en el compilador XD
d5af7587993ac2b0929b98a1fd054a1c
No seras que usas un compilador algo antiguo?
Se que N debería ser un const pero nunca me tiro el error ese. A lo mejor lo han solventado, o NPI XD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Vector

Publicado por Martín (65 intervenciones) el 09/10/2014 17:17:10
Sí, tal cual, acepto; el estándar ISO C90 lo consideraba un error, pero estos "Variable Length Array" son válidos a partir del ISO C99.

con esta línea de comando:
1
gcc -std=c90 -O0 -g3 -pedantic -Wall -c -fmessage-length=0 -o main.o "..\\main.c"
Se obtiene el error:
1
ISO C90 forbids variable length array 'A' [-Wvla]
Pero con
1
gcc -std=c99 -O0 -g3 -pedantic -Wall -c -fmessage-length=0 -o main.o "..\\main.c"
ya no.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con Vector

Publicado por vangodp (287 intervenciones) el 10/10/2014 15:19:18
Entonces vendra activado en codeblocks por defecto por que nunca la active.
Suelo programar en C++. Son las preguntas del foro lo unico que hago en C XDD.
Luego echare una mirada en las confi a ver si esta activado eso XD
Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Vector

Publicado por Martín (65 intervenciones) el 10/10/2014 18:12:13
Hola;

Code::Blocks puede usar distintos compiladores, pero en la foto de pantalla veo que estás usando el mingw (i686-w64-mingw32-gcc.exe).

Bueno, mingw es un port para Windows del gcc, Y el gcc aceptaba ya los Variable Length Array como extensión al lenguaje C antes de que saliera el estándar C99.

Entonces, por más que al compilar desde Code::Blocks se esté usando por defecto el estándar C90, es esperable que el compilador tenga esa extensión incluida (porque es un gcc para Windows), sin importar los parámetros con los que esté compilando.

Para que el compilador use el estándar C99, puedes poner -std=c99 en Build Options >> Compiler Settings >> Other options.

--- En C++ la cosa es totalmente distinta.
Los "Variable Length Array" no existieron nunca. Hay ahora algo muy parecido en el estándar C++14, y se llaman "Runtime-Sized Arrays".

Pero...

Pero mira; hay una curiosidad más en el g++ (el compilador de C++, ya no el de C). Un programa como este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
using namespace std;
 
void dynamic_length_array(int n)
{
    int arr[n];
    //int i;
    for(int i=0; i<n; ++i)
    {
        arr[i] = i*i;
    }
 
    for(int i=0; i<n; ++i)
    {
        cout << "arr[" << i << "] = " << arr[i] << endl;
    }
}
 
int main()
{
    dynamic_length_array(10);
 
    return 0;
}
debería terminar en desastre, pero no lo hace, y es porque el g++ ha implementado una extensión para los DLA en C++
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Ayuda con Vector

Publicado por vangodp (287 intervenciones) el 10/10/2014 19:47:00
uso el mingw-w64 por los threads.
O sea que ya viene activado por defecto el c90. Y para desactivar hay que poner -std=c99 en other options...
Perfecto =) tomo nota

Por cierto... muy interesante eso: Runtime-Sized Arrays
Aun no termino de pillar el c++11 y ya estamos con el 14 XDD. Da gusto ver un lenguage que se actualiza. Sin duda C/C++ son los mejores.
C una espada ninja y C++ una navaja suiza jejej
Suerte! Y gracias por la aclaracion =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar