Omitir navegación.
Inicio

090407 Clase 7 de abril

Imagen de SebaMinguez

Gracias nuevamente a Emiliano Seguimos con los arreglos. Se declaran ( ej)

    double[10]; /* arreglo double de 10 lugares contiguos en memoria, en un solo bloque */
Si un arreglo es estático o global (en esencia vive para siempre), puede ser inicializado de esta manera:
    int a[5] = {1, 2, 3, 4, 5};
En particular, puede escribirse también:
    int a[] = {1, 2, 3, 4, 5};
Puede también pasar esto:
    int a[10] = {1, 2, 3, 4, 5}; /* a[5] a a[9] van ceros */
Esto es un error:
    int[1] = {1, 2};
C permite arreglos de arreglos de arreglos ... arreglos multidimensionales (mientas la memoria de) Ej:
    float a[5][10];
que se acceden con a[0]0] el primero, a[0][1] ... a[4][9] Hay un caso especial de arreglos que es el arreglo de caracteres, especial en el sentido en que C no tiene strings. C solo tiene arreglo de caracteres. Entonces, que es 'hola mundo'? es un string ? pues no, no es un string, sino un arreglo de caracteres. De hecho, podríamos haber llegado el caso escrito de este modo:
#include <stdio h>
 
int main(){
    printf('hola mundo');
}
Podríamos haberlo escrito de esta manera:
#include <stdio h>
int main(){
    printf("%s\n", "hola mundo");
}
O
#include <stdio h>
 
static char lines[]={'h','o','l','a',' ','m','u','n','d','o','\0'};
 
int main(){
    printf("%s\n", lines);
    return ;
}
El '\0' (ascii cero) indica el fin del arreglo, es una convención de C. Así; que hecho cualquier string equivale a un arreglo:
    'hola' = {'h','o','l','a','\0'}
Para manipular strings, C tiene varias funciones (prototipos en string.h) como
    strcpy(s1, s2)  // copia s2 en s1
    strlen(s)       // cuantos caracteres tiene (sin contar '\0')
    strcmp(s1, s2)  /* compara s1 y s2. Devuelve:
                    &lt;0 si s1 &lt; s2
                    =0 si s1 = s2
                    >;0 si s1 &gt; s2*/
    strcat(s1, s2)  // concatena s1 y s2.
En C hacemos las cosas Bien y Bien es: Lo mas reducido posible y lo mas rápido posible. Tratemos de hacer una version de strcmp. 1 intento.
int strcmp(char s[], char s2[])
{
 
    int i;
    for(i=; s1[i] != && s2[i]!=; i++)
 
    if(s1[i] > s2[i]) return 1;
    else if (s1[i] < s2[i] return -1;
 
    if s1[i] > s2[i]) return 1;
    if s1[i] < s2[i]) return -1;
    else return ;
}
Esto es una porqueria! 2do intento: devolvemos valores >0, <0 ==0;
int mistrcmp(char s12], char s2[])
{
    int i;
    for(...que carajo iba aca.. jajaajaj...);
 
return s1[i] - s2[i];
}
Subsiste el if del for. 3er intento
int mistrcmp(char s1[]. s2[])
{
 
    int i;
    for(i=; s1[i] != '\0' && s2
============================================================================ TEMA PELIGROSO --------------

Punteros

Una variable tiene:

  • un valor
  • un tipo
  • una direccion de memoria

C permite saber esto último, la dirección de memoria donde esta una memoria con el operador de dirección, que es el &. Ej:

#include <stdio h>
int main()
{
    int i=10;
    printf("valor = %d\n", i);
    printf("direccion= %p\n", &i); /* %p muestra la direccion en hexadecimal */
 
    return ;
}
Podemos guardar las direcciones de memoria ? SI. Que tipo tendrá una variable que guarda direcciones ? Tendrá el tipo puntero al tipo apuntado. Ej: pointer.c Para que servirá una dirección ? a) ingresar datos
    scanf("%d", &i);
b) Problema: Hacer una función que tome dos enteros int y los intercambie.
#include <stdio h>
 
void swap(int i, intj)
{
    int tmp=i;
    i=j;
    j=tmp;
}
 
int main()
{
    int = 10, y = 11;
    swap(x,y);
    printf("%d %d\n", x, y);
    return -;
}
NO ANDUVO! La razón es que C pasa los argumentos a las funciones POR VALOR las funciones reciben COPIAS de los argumentos. Nota: C tiene el operador * de dereferencia o indirección. Dado un puntero p, *p entrega el valor guardado en la dirección de p. Ej:
    int i = 13, *p = &i; /*
    p -&gt; direccion de i
    *p -&gt; 13
*/
Con esto,
void swap(int *i, int *j)
{
    int tmp = *i;
    *i = *j;
    *j = tmp;
}
 
 
    swap(&x, &y);
Veamos este interesante efecto:
int i;
int *p = &i;
int **q = &p;
int ***r= &q;

Suma de punteros

A un puntero se le puede sumar un entero y da otro puntero del mismo tipo

Apunta al valor *p

si *p es un puntero a un tipo T, *p + n es por definición el valor de *p tomado como si fuera un entero + n por el tamaño del tipo T apuntado. Use mal un puntero y tendrá un hermoso error.

Resta de punteros

Da el mismo tipo, da un entero que indica cuantos valores pueden alojarse entre los dos punteros.

Trackback URL for "090407 Clase 7 de abril"

http://www.odiolasllaves.com.ar/trackback/94

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Mariano

Hola Seba, fijate en los

Hola Seba, fijate en los bloques de código. Yo estoy usando Opera 10.10 y Konqueror 3.5.9 .

Por ejemplo en el bloque 12, en el primer if: if(s1[i] & gt ; s2[i]) return 1;

Supongo que ahora se verá bien, pero en lugar del > veo: "& gt ;" pero sin los espacios (si lo pongo sin espacios se va a ver como >)

Supongo que sucede por que está entre etiquetas < code >

Saludos

Imagen de Mariano

Hola Seba, fijate en los

Hola Seba, fijate en los bloques de código. Yo estoy usando Opera 10.10 y Konqueror 3.5.9 .

Por ejemplo en el bloque 11 veo:

strcpy(s1, s2) // copia s2 en s1

strlen(s) // cuantos caracteres tiene (sin contar '\0')

strcmp(s1, s2) /* compara s1 y s2. Devuelve:

<0 si s1 < s2

=0 si s1 = s2

>0 si s1 > s2*/

strcat(s1, s2) // concatena s1 y s2.

y supongo que debería aparecer:

strcpy(s1, s2) // copia s2 en s1

strlen(s) // cuantos caracteres tiene (sin contar '\0')

strcmp(s1, s2) /* compara s1 y s2. Devuelve:

<0 si s1 < s2

=0 si s1 = s2

>0 si s1 > s2*/

strcat(s1, s2) // concatena s1 y s2.

Saludos

Imagen de Anónimo

No había visto que

No había visto que contestaste, por eso respondo un poco tarde.....

El problema aparece en Opera 10.10 y Konqueror 3.5.9.

En el código 11: /* compara s1 y s2. Devuelve: <0 si s1 < s2 =0 si s1 = s2 >0 si s1 > s2*/

En el código 12: for(i=; s1[i] != && s2[i]!=; i++)

if(s1[i] > s2[i]) return 1; else if (s1[i] < s2[i] return -1;

if s1[i] > s2[i]) return 1; if s1[i] < s2[i]) return -1;

En el código 14: for(i=; s1[i] != '\0' && s2

Y en otros mas... Supongo que es por que usarás alguna etiqueta

[\code] o algo así.
 
 
Saludos

Imagen de SebaMinguez

Gracias Mariano. Me fijé bien

Gracias Mariano. Me fijé bien y efectivamente estaban mal los caracteres. Tal vez en algun cambio de configuración del drupal se deformó...

Teoricamente se deberia poder escribir tal cual va y salir bien.

Aprovecho para comentar que cualquiera puede editar, con tan solo estar registrado. Las revisiones se van guardando, asi que siempre se puede volver atras ;)

Un abrazo y gracias por el tiempo.

Imagen de SebaMinguez

Hola! Me podrias indicar

Hola!

Me podrias indicar donde no se ven los < y >?

Vaoy a probar con distintos navegadores para ver si puede andar por ahi el problema, ya que yo los veo bien.

Gracias por la observación!

Imagen de Anónimo

Hola, fijate bien, por que

Hola, fijate bien, por que los signos > y < no se muestran como deberían en el código.

Gracias por subir todo este material.

Saludos