Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Array

Iniciado por player, 09 de Julio de 2009, 04:58:10 PM

« anterior - próximo »

player

Estoy leyendo este tema y de momento hay un ejemplo que no entiendo. Su enunciado es:

A cuarenta alumnos se les preguntó el nivel de calidad de los alimentos de la cafetería para alumnos en una escala de 1 a 10. Colocar las 40 respuestas en un array entero y sumar todos los resultados de la encuesta.

Este es el código que viene como ejemplo:


#include <stdio.h>
#define RESPONSE_SIZE 40 /* define array sizes */
#define FREQUENCY_SIZE 11

/* function main begins program execution */
int main( void )
{   
   int answer; /* counter to loop through 40 responses */
   int rating; /* counter to loop through frequencies 1-10 */

   /* initialize frequency counters to 0 */
   int frequency[ FREQUENCY_SIZE ] = { 0 };
   
   /* place the survey responses in the responses array */
   int responses[ RESPONSE_SIZE ] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10,
        1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6,
        5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };

   /* for each answer, select value of an element of array responses
  and use that value as subscript in array frequency to
  determine element to increment */
   for ( answer = 0; answer < RESPONSE_SIZE; answer++ ) {
      ++frequency[ responses [ answer ] ];
   } /* end for */

   /* display results */
   printf( "%s%17s\n", "Rating", "Frequency" );

   /* output the frequencies in a tabular format */
   for ( rating = 1; rating < FREQUENCY_SIZE; rating++ ) {
      printf( "%6d%17d\n", rating, frequency[ rating ] );
   } /* end for */

   return 0; /* indicates successful termination */

} /* end main */


Qué se consigue con int responses[ RESPONSE_SIZE ]? Declara la variable responses y la asocia al array [RESPONSE_SIZE]?

Y en frequency[ FREQUENCY_SIZE ], por qué lo inicializa a 0 y entre llaves?

Luego en el primer for hace una mezcla de todo y pone frequency[responses[answer]] y lo incrementa... y en el último for vuelve a usar frequency pero como frequency[rating] y no sé por qué. La verdad que lo veo bastante lioso y algo mal explicado para la gente que empezamos.. a ver si me podéis ayudar con alguna explicación. Gracias.

Pogacha


player

Ya..si...ya sé que en google hay todo eso, preguntaba por una duda en concreto, no por dónde encontrar teoría sobre arrays. De todas formas, ya lo tengo medio entendido por mi cuenta. Gracias por la "ayuda".

Pogacha

A ver si nos entendemos, claramente no sabes como funcionan los arrays, y no hay duda en concreto, simplemente no tenes idea de que estas hablando. Si te molesta mi "ayuda" no te preocupes ... otra vez me la guardo.

Buffon

Player, este foro es para principiantes ofc, pero parece que seamos tus profesores particulares <.< y realmente por tus preguntas no te has tomado la molestia en aprender que es un array y como funciona.

pero bueno:


   int frequency[ FREQUENCY_SIZE ] = { 0 };


está mal inicializado, no hay más, lo más correcto sería:


   int frequency[ FREQUENCY_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
o mejor aún
   int frequency[ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};


pero bueno, quitando eso de encima, que yo habría hecho con un calloc de toda la vida xDDDD

   int frequency[ FREQUENCY_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};

te crea un buffer de 11 posiciones y le asigna a cada posición el valor 0. Esto sale en todos los libros, igual que el anterior, que crea un buffer de 40 posiciones (40 alumnos) y mete en cada alumno la nota obtenida.

la gracia de frequencie cual es, para cada alumno, mira que nota ha dicho responses[answer], aquí está mal la variable answer, en realidad la debería haber llamano 'alumn', responses[answer] si answer vale 5, nos indica el alumno número '5' que nota ha sacado, según el ejemplo el alumno 5 ha sacado un 5, entonces responses[5] devuelve 5, responses[4] devuelve 8, etc etc.

Así, si haces frequency[ responses[ alumno]]++; y frecuency empieza con todos con 0, si ponemos un ejemplo diferencia, responses fuera de 4 alumnos y todos sacan un 3, al hacer.

frecuency[responses[0]]++;
frecuency[responses[1]]++;
frecuency[responses[2]]++;
frecuency[responses[3]]++;

tendriamos que frecuency = {0,0,0,4,0,0,0,0,0,0,0};


player

Gracias Buffon. El código está tal cual sacado del libro y me extrañaba que lo inicializara sólo a 0 y no pusiera las 11 posiciones como se supone que debería ser y tu has puesto, eso ya me ha descolocado para el resto del ejercicio.  Veo que hay por ahí algún otro fallo. Muchas gracias por tu ayuda y por aclarármelo.

A ver Pogacha no te lo tomes a mal, pero estoy siguiendo ese libro que todo el mundo dice que "es muy bueno" y como puedes ver estoy empezando y necesito que las explicaciones sean claras, lo que pasa que algunos códigos de ejemplo tienen fallos como habrás podido comprobar ahora y las explicaciones no son muy claras, entonces, si ya me he tomado la molestia de leerme el tema de arrays que viene en el libro y vengo aquí preguntando unas dudas en concreto que me ha creado ese ejemplo, yo no tengo la culpa de que el código esté mal y encima se me mande a leer más sobre arrays, porque si es el ejemplo lo que está mal necesito que alguien me lo aclare, porque yo puedo pensar que el ejemplo está mal pero aún no tengo la confianza necesaria para saber si estoy en lo cierto o no, entonces mejor pregunto.


Igual se han malinterpretado mis preguntas del tipo:

Y en frequency[ FREQUENCY_SIZE ], por qué lo inicializa a 0 y entre llaves?

Y se pensaba que no tenía ni idea de inicializar un array, pero no es así, ya se que un array se inicializa de esta forma y entre llaves, pero no entendía por qué hay un solo cero si se hace al principio un #define FREQUENCY_SIZE 11 y como pensaba que estaba bien y yo estaba equivocado ya me he descolocado para entender el resto del código.

Bueno gracias por vuestra ayuda y siento el malentendido. Ya no dejaré más dudas por aquí si se me echa en cara que parecéis mis profesores particulares. Ya me gustaría a mí aprender bien y poder ayudar a la gente a la que le cuesta como a mí. Saludos.


Mars Attacks

#6
De todas formas, aunque creas que ya sabes algo de todo esto, probablemente aún estés raspando la superficie. La inicialización vector[LOQUESEA] = {0} es equivalente a decirle que inicialice el primer elemento a cero y todos los restantes a elementos a cero (es decir; si hubieras puesto vector[LOQUESEA] = {1} te habría inicializado el primer elemento a uno y el resto a cero).

Existen muchas otras formas de hacerlo. Te recomiendo que, cuando estés viendo un capítulo, googlees hasta hartarte sobre esa parte de C o C++ en google, tanto en castellano como en inglés.

Por ejemplo, sobre inicialización de arrays:
http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c
http://www.conclase.net/c/curso/index.php?cap=010

y aún hay más tralla que no cuentan esos hilos.

player

Gracias por la información. Intentaré leer lo máximo posible sobre todo, lo que pasa que mucha información buena está en inglés y si ya me cuesta entendenrlo en español...en inglés ya ni os cuento. De todos modos veo que la programación me llevará bastantes años para cogerle el "truco" porque la verdad que es dificilísimo, muy complejo...y demasiado extenso.  Os veo a vosotros que controláis muchísimo del tema y yo me veo incapaz de coger un nivel así ni en 7 años por muchas horas de estudio que le dedique, veo que me cuesta demasiado coger las cosas.. Ya veremos cuando me toquen las asignaturas de programación como va la cosa. Saludos.

Buffon

hombre, ni en 20 años serás un experto de C++, pero con 7 tendrás un nivel más que aceptable.

sobretodo a la hora de hacer los casts, utilizar static_cast<> reinterpret_cast<> en vez del típico cast entre paréntesis.

También piensa que C++ es C++, no Visual C++ que te "fuerza" a utilizar algunas librerías o te "esconde" muchas inicializaciones, que realmente son cosa del OS y no del lenguaje.

player

Cita de: Buffon
hombre, ni en 20 años serás un experto de C++, pero con 7 tendrás un nivel más que aceptable.

Gracias por los animos.... :P

Cita de: Buffon
sobretodo a la hora de hacer los casts, utilizar static_cast<> reinterpret_cast<> en vez del típico cast entre paréntesis.

No tengo ni idea de lo que es esto, supongo que tarde o temprano lo descubriré

Cita de: Buffon
También piensa que C++ es C++, no Visual C++ que te "fuerza" a utilizar algunas librerías o te "esconde" muchas inicializaciones, que realmente son cosa del OS y no del lenguaje.

Al leer esto se me ha planteado una duda. Por ejemplo, si yo me paso varios años programando en C/C++ (que además es el lenguaje que más se utiliza en la carrera) después al terminar y salir al mercado laboral (si quisiera trabajar como programador) puedo estar buscando ofertas de trabajo pero pueden pedir cualquier otro lenguaje de programación que no sea ese, entonces, habiendo estado todos esos años con C/C++, se adquiere una buena base para luego cambiar de lenguaje y adaptarse más o menos de forma rápida?

Vicente

Cita de: player en 12 de Julio de 2009, 01:01:46 PM
Al leer esto se me ha planteado una duda. Por ejemplo, si yo me paso varios años programando en C/C++ (que además es el lenguaje que más se utiliza en la carrera) después al terminar y salir al mercado laboral (si quisiera trabajar como programador) puedo estar buscando ofertas de trabajo pero pueden pedir cualquier otro lenguaje de programación que no sea ese, entonces, habiendo estado todos esos años con C/C++, se adquiere una buena base para luego cambiar de lenguaje y adaptarse más o menos de forma rápida?

A programar se aprende programando. No es lo mismo C++ que C# o que Python, pero las ideas básicas son iguales en todos. Además en la carrera seguramente toques más cosas que C/C++.

player

Sí que se ven más cosas, claro, pero la gran mayoría de todo lo relacionado con la programación es C/C++

[EX3]

Cita de: player en 12 de Julio de 2009, 04:59:32 PM
Sí que se ven más cosas, claro, pero la gran mayoría de todo lo relacionado con la programación es C/C++
O no. Si te fueras a dedicar a programacion empresarial, de gestion, seguramente acabrias aprendiendo mas sobre Visual Basic, C# y/o Java, si fueras a desarrollar para dispositivos moviles de seguro Java, en el ambito de desarrollo web ASP y/o seguramente PHP, etc... cada area tiene sus lenguajes mas predominantes segun necesidad, productividad y herramientas orientadas mas a tal proposito. C++ es lo generico por decirlo de alguna forma, pero no es el todo para un programador, ni ningun lenguaje en si. La programacion como dice Vicente no es lenguaje que aprendas si no la programacion en si. Tomatelo con paciencia que con la practica veras como poco a poco vas aprendiendo mas de lo que puedas llegar a imaginar.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

player

#13
Me refería a la carrera, que la mayoría de cosas relacionadas con la programación las enfocan a C/C++ si no es que te coges asignaturas de programación en internet, bases de datos y de ese tipo, por eso estoy intentando aprender por mi cuenta antes de empezar esas asignaturas, así a la hora de hacer las prácticas puedo ir algo más suelto si ya llevo conocimientos aprendidos desde antes, pero también me gustaría especializarme más allá de lo que se ve en esas asignaturas.

Antes de entrar a la carrera estuve viendo algo de programación y digamos que tuve "malas experiencias" y le cogí demasiado respeto o cierta "manía" porque me veía incapaz de resolver el tipo de problemas como los que estoy viendo ahora,  así que cuando empecé me cogí las típicas asignaturas de matemáticas y demás que no tienen nada de programación, pero ahora ya tengo que cogerlas sí o sí si quiero seguir avanzando. Digamos que me va un poco mejor que antes pero me sigue costando mucho entender ciertas cosas y la verdad que me da bastante "miedo" tener que empezar a entregar prácticas de este tipo y hacer los exámenes.

Mucha gente  me dice que estoy perdiendo el tiempo con C y que me ponga a estudiar de lleno C# que es lo que más se usa ahora, pero claro, como has dicho [EX3] dependerá del campo en el que te muevas.

[EX3]

Cita de: player en 12 de Julio de 2009, 09:48:35 PM
Mucha gente  me dice que estoy perdiendo el tiempo con C y que me ponga a estudiar de lleno C# que es lo que más se usa ahora, pero claro, como has dicho [EX3] dependerá del campo en el que te muevas.
Para nada. C y C++ no es una perdida de tiempo, es mas, si dominas C/C++ C# lo sabras aprovechar mejor seguramente que alguien como yo que viene del Basic. Y eso que C# es lo que mas se usa ahora, pues tampoco es asi. C# todavia no tiene el cupo de mercado que aun ostenta Java por ponerte un ejemplo similar. C# de momento es popular dentro de plataformas Windows (PC y dispostivos moviles con Windows Mobile) y en XBox360 por XNA. Fuera de ahi esta todavia asentandose gracias a proyectos como Mono y algunas aplicaciones como el Unity3D lo usan para desarrollo pero creo que todavia no es algo equiparable al uso que tiene Java.

Hazte a la idea de que en la carrera no te van a enseñar a programar en C++ o en otro lenguaje, te van a enseñar a programar, punto. Quizas te enseñen metodologia de la programacion en Pascal y orientacion a objetos en Eiffel, como a mi compañero de trabajo. Por esto mismo, quitate el chip de programar en un lenguaje o en otro por que a la larga sera lo que menos te importe.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.