Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Dudas, muchas dudas

Estas en el tema de Dudas, muchas dudas en el foro de C/C++ en Foros del Web. Tengo bocha de dudas respecto a arrays, string, estructura y otras cosas 1)para que sirven los arrays, string No es lo mismo crear muchas variables ...
  #1 (permalink)  
Antiguo 11/09/2014, 12:30
Avatar de FrancoMA  
Fecha de Ingreso: septiembre-2014
Mensajes: 3
Antigüedad: 9 años, 7 meses
Puntos: 0
Dudas, muchas dudas

Tengo bocha de dudas respecto a arrays, string, estructura y otras cosas

1)para que sirven los arrays, string
No es lo mismo crear muchas variables o una funcion?

2)Cual es la diferencia entre un string y un array?

3) Es lo mismo declarar un string asi char greeting[] = "Hello"; que asi char greeting[6] = {'H', 'e', 'l', 'l', 'o', ''};

4) Para que sirven las estructuras? Es tema de Poo?

5)Para que sirven los punteros?

6) Como se llama una funcion? Las funciones tiene ambito como las variables?

7) Que son las dimensiones de un array? Los string tiene dimensiones tambi←n?

Gracias y chau
  #2 (permalink)  
Antiguo 11/09/2014, 16:00
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dudas, muchas dudas

Cita:
1)para que sirven los arrays, string
No es lo mismo crear muchas variables o una funcion?
R1) Si vas a crear hasta 5 variables mas facil es de la forma normal pero si vas a declarar mil un array tiene su ventaja.
Normal: int num1, num2, num3, num4, num5... hasta llegar a num1000;
Array: int num[1000];
¿Que es mas corto normal o array? =) Sin contar que para asignarles valor vas a tener que hacer uno a uno lo que duplica el trabajo, lo de antes era solo para crearlas.
Un string es eso..."Un array de chars".

Para guardar la palabra Hola se necesita 4chars no.
vamos a crear las variables de las 2 formas y ya veras lo que digo yo entonces sacas tu conclusión.

char letra1 = 'H';
char letra2 = 'o';
char letra3 = 'l';
char letra4 = 'a';

Y para imprimir como minimo:
printf("%c%c%c%c", letra1 , letra2 , letra3, letra4);
¿Es horrible no?

Ahora haremos lo mismo con array tradicional.
Solo una observación: Para albergar una palabra en array cuando se trate de char debes poner una letra de mas y nunca nunca nunca usar esta ultima letra. luego te explico el por que ;)

Creamos el array para las 4 letras +1 como dije y guardamos en cada una de ellas las letras.
char letra[5] = "Hola";
printf("%s",letra);

Tadaaaa! y ya esta...facil¿No?

Pues ahora te explico lo de la letra demás que pusimos en el array.

cuando ponemos tipo en una variable en realidad ese char, int, float no es para bonito XDD, el tipo int reserva una determinada cantidad de memoria distinta al char. Es como avisar al dueño de un aparcamiento que vas a meter un coche y no un camión XDD. un char es mas pequeño que un int, de echo un int es como mínimo 4veces mas grande que un char.
Pero eso dejamos para otro día, solo responderé tus dudas.
Suponemos que no se el tamaño de la frase que voy a guardar. ¿Lo mas normal es que dejemos espacio de sobra verdad? Po si es correcto, digamos que no se el tamaño de la palabra o frase, un ejemplo seria nombres, los nombres no son todos igual de largo ¿Verdad?
Creo que con 200 caracteres puedo guardar cualquier nombre y sobre nombre. Ya estoy hablando de 200 variables de tipo char, ya es una cantidad algo grande de crear y un array viene de perlas.
Entonces creemos eso:
char nombre[200];
hasta aquí nada nuevo.

Ahora hago un scanf normalito para tomar el nombre de la persona.
scanf("%s", &nombre);

¿Que pasa si lo imprimo? Se imprimiría esos 200 caracteres o solo lo que ocuparíamos? De ser asi como sabe el programa cual es la ultima letra a imprimir ???
Son muchas preguntas

Digamos que queremos guardar el nombre "Floriponcio" XD
si tenemos una memoria de 20 seriaalgo asi:
[][][][][][][][][][][][][][][][][][][][][][][].....hasta 200
pero solo quiero poner "Floriponcio"
[F][l][o][r][i][p][o][n][c][i][o][][][][][][][][][][][][]....
Pero hay una cosa que no ves cuando imprimes y es una marca que va luego después de la ultima letra que es el carácter nulo '\0'. Y se queda así en memoria:
[F][l][o][r][i][p][o][n][c][i][o][\0][][][][][][][][][][][]....
por eso si voy a declarar un array de tamaño justo debo poner un char demás es por esa marca. Y nunca debes ocupar esa casilla.
Ese carácter se encarga de decir por ejemplo a la función scanf hasta donde debe imprimir.
Eso solo en el caso de los chars, con int, float y otras no pasa eso y puedes declarar justo el tamaño que vas usar ;)

Cita:
2)Cual es la diferencia entre un string y un array?
Creo que ya te conteste antes un array puede ser de enteros, float o otros tipos pero cuando se refiere a string se refiere a un array de chars ;)
Cita:
3) Es lo mismo declarar un string así char greeting[] = "Hello"; que asi char greeting[6] = {'H', 'e', 'l', 'l', 'o', ''};
No! en absoluto cuando haces: char greeting[] = "Hello"; estas reservando memoria conforme la cantidad de letras y de la otra forma haces manualmente.

De echo eso respalda lo que dije antes, que si haces eso el programa va reservar la cantidad de 5 +1 para el nulo. Prueba compilar eso y veras que lo que imprime es la cantidad de char en memoria:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main (){
  4.    
  5.     char palabra[] = "hello";//reserva la cantidad de letras para "Hello" mas la letra nulo '\0' de forma que queda "Hello0" en memoria.
  6.     printf("%d", sizeof(palabra)); //dice la cantidad de letras mas la letra nulo
  7.    
  8.     return 0;
  9. }

Si haces la reserva manualmente cuida no equivocarte el tamaño ni que falte el carácter nulo o del contrario corres el riesgo de escribir encima de memoria que no te corresponde o imprimir toda la memoria ram XDDD

Cita:
4) Para que sirven las estructuras? Es tema de Poo?
Bueno supongo que hablas de C++.
Una estructura sirve para agrupar varios datos.
Por ejemplo:
struct agenda{
char nombre[100];
int edad;
int peso;
};
Luego puedo crear cuantas agendas quiera con esos mismos datos que contiene.
seria tan fácil como hacer: agenda a[100];.
Lo anterior crearía 100 agendas con nombre, edad y peso para guardar las medidas de todo el instituto jaja XD. Básicamente es hacer copias del modelo inicial.

En C++ las estructuras no son POO o al menos eso creo. Una estructura en C++ es como una clase pero con sus atributos públicos. Lo que refuerza lo que he dicho de que no es poo ya que para ser poo debería tener los atributos privados y solo ser posible ser accedidos desde la parte publica de la clase.

Cita:
5)Para que sirven los punteros?
Un puntero tiene muchos usos.
Pero por ejemplo cuando pasas una variable de una función a otra estas haciendo copias de dicha variable en la nueva función que pasas dicha variable. O sea que si paso un int por valor en realidad no estoy pasando el int, sino una copia de el a esta nueva función y si se realizan cambios en esa copia en realidad no me va afectar la variable original.
A cambio si paso un puntero o una variable por referencia es como decir donde esta guardada dicha
variable para que esos cambios se produzcan en esa variable y no en una copia de esa variable.XD
Tu ten presente que un puntero no es mas que una variable. Una variable que guarda la dirección de memoria de otra variable y todo te ira bien, si pasas por valor pasas una copia y si pasas por referencia(puntero) pasas la dirección donde quieres que se realizan los cambios. ;)

Cita:
6) Como se llama una funcion? Las funciones tiene ambito como las variables?
Se llama por su nombre, y le debes pasar sus parámetros si así lo exige.
Con lo del ambito no lo pillo al que te refieres pero las funciones suelen tener por ejemplo el return al final. el tipo que se indica al declarar una función como por ejemplo:
int foo(){
return 0;
}
en realidad el int sirve para saber si el compilador debe reservar o no el espacio para ese 0 u otra variable que esta retornando. Si por ejemplo solo vas imprimir algo por pantalla no tiene lógica reservar memoria por lo cual la función debería ser void y así no se reserva memoria para esa función.
Otra cosa es que dentro de esta función declares mas variables. Cosa que iria pillando mas bocados a la memoria ram.
Cita:

7) Que son las dimensiones de un array? Los string tiene dimensiones tambi←n?
Es su tamaño! Y Si los strings tienen tamaño.
Debo señalas que los strings en C++ no son propiamente un tipo de datos si no mas bien es una clase.

De echo para saber el tamaño de un string en cpp se hace de esta forma:
string mistring = "Mama donde esta mi sopa";
cout << mistring.size();

Eso te mostraría el tamaño del string size() es una función que pertenece a la clase iosteam que declaras en el header.

Ufff creo haber contestado todo... si tienes mas dudas sigue preguntando jeje
  #3 (permalink)  
Antiguo 11/09/2014, 17:34
Avatar de FrancoMA  
Fecha de Ingreso: septiembre-2014
Mensajes: 3
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Dudas, muchas dudas

Te explico lo de el ámbito de las funciones:
Hace poco quise hacer una calculadora (básica, lo único que hacia era + - / *), la hice usando estructuras switch, dentro de cada 'case' estaban las operaciones a hacer. Quise pasar las operaciones a funciones pero cuando los llamaba me daba error 'scope'.
Para que me entiendas mejor te dejo el código:
Calculadora que anda: http://codepaste.net/oaci9f
Calculadora que no anda: http://codepaste.net/fwsp53

¿Me podes explicar como es eso de los parámetros de las funciones? Siempre me dan error de ambito, soy demasiado pelotudo :|
PD: ¿'Div' es una palabra reservada?
  #4 (permalink)  
Antiguo 11/09/2014, 19:41
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dudas, muchas dudas

Los errores que me tiran es que declaras algunas funciones pero no las implementas.
si pones su prototipo debes poner la definicion.
Te arregle el caso de la suma, tu arregla los otros.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5. int a;
  6. int b;
  7.  
  8. void suma();
  9. //void resta();
  10. //void por();
  11. //void div();
  12.  
  13. int main(){
  14.     inicio:
  15.     int operacion;
  16.    
  17.     cout << "Elija la operacion que desea:\n";
  18.     cout << "Suma[1]\nResta[2]\nMultiplicacion[3]\nDivision[4]\n";
  19.     cin >> operacion;
  20.    
  21.     if (operacion > 4) {
  22.        
  23.         cout << "Esa opcion no existe\n";
  24.        
  25.         goto inicio;
  26.     }
  27.        
  28.    
  29.     switch (operacion) {
  30.        
  31.         case 1:
  32.             suma();
  33.             break;
  34.         case 2:
  35.             //resta();
  36.             break;
  37.         case 3:
  38.             //por();
  39.             break;
  40.         case 4:
  41.             //div();
  42.             break;
  43.         default:
  44.             break;
  45.  
  46.     }
  47.    
  48.     return 0;
  49.    
  50.    
  51. }
  52.  
  53. void suma(){
  54.    
  55.    
  56.     cout << "Ingrese el primer numero a sumar: ";
  57.     cin >> a;
  58.     cout << "\nIngrese el segundo numero a sumar: ";
  59.     cin >> b;
  60.    
  61.     cout << "El resultado es: " << a + b;
  62.    
  63. }

Y no te olvides poner los break en cada caso y ademas es obligatorio poner el default o te puede colgar el programa si entras una opción invalida en el menú como puede ser elegir el 5 que no existe.

Si vas a imprimir el resultado no hace falta que las funciones retornen nada sino que pueden ser void mismo.
Y no uses goto nunca mas en tus programas que para eso esta el control de flujo(for,while,do-while...) XDD

en fin creo que esta todo ok ¿No?

  #5 (permalink)  
Antiguo 12/09/2014, 13:02
Avatar de FrancoMA  
Fecha de Ingreso: septiembre-2014
Mensajes: 3
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Dudas, muchas dudas

Que tiene de malo en 'goto'? en otra página me recomendaron lo mismo
  #6 (permalink)  
Antiguo 12/09/2014, 16:36
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dudas, muchas dudas

Has imaginado miles de goto en tu código?? XD
Seria un disparate encontrarte en medio de eso jajaja
Lea aquí: http://es.wikipedia.org/wiki/C%C3%B3digo_espagueti

Etiquetas: dudas, funcion, muchas, punteros, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:19.