[PPA 03] Introducción a C parte 2. Strings, arrays y punteros.

Tercer tema para el curso de programación para audio que se está dictando en el Subterrakeo. Click aquí para info de horarios, cómo llegar o para suscribirse a la lista de correos.

arrays.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
    // Declara y llena un array:
    int arr[5] = {1,2,3,4,5};
   
    // Y si son muchos?
    int a[50];
    int i;
    for(i=0; i<50; i++){
        a[i] = i+1;
    }

    // Un string es un array de caracteres.
    char unString[40] = "Mi nombre";
    if(strcmp(unString, "Rafa") != 0){
        printf("Su nombre no es Rafa\n");
    }
}

punteros.c:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>

int main(){
        //===============================//
        //  Dos Operadores importantes:  //
        //===============================//
        // Operación "indirección" o "valor de": *
        // Operador "dirección de": &
       
        int *pa; //declara un puntero a int
        int a=2; //declara un int

        pa = &a; // Asigna la dirección de a al puntero pa. "pa está apuntando a a"

        printf("a: %i \n",a);
        printf("&a: %p \n",&a);
        printf("pa: %p \n", pa);
        printf("*pa: %i \n", *pa);
        printf("\n");

        //====================================//
        //  Los arrays también son punteros:  //
        //====================================//
        int unArray[10] = {1,2,3,4,5,6,7,8,9,10};
       
        // En este caso &unArray[0] es equivalente a unArray
        printf("&unArray[0]: %p \n", &unArray[0]);
        printf("unArray: %p \n", unArray);
        printf("unArray[1]: %i \n", *(unArray+1)); //Aritmetica de punteros!!
       
        //=============================================================//
        //  Los strings son arrays de chars -> también son punteros.     //
        //=============================================================//
        char unString[10] = "Hola!";
        /* unString = "Hola!";*/
        printf("unString: %s \n", unString);
        printf("unString[2]: %c \n", unString[2]);
        printf("*(unString+2): %c \n", *(unString + 2));
}

transpose.c:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <string.h>

int mod12(int nota){
    while(nota < 0) nota += 12;
    while(nota >= 12) nota -= 12;
    return nota;
}

int main()
{
    char nota[3], **p1, **p2,
         *tabla[12] = {"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
    int intervalo;

    printf("Ingrese la nota base (Mayusculas y # para sostenidos. Ej: D#):");
    scanf("%s",nota);

    printf("Entre el intervalo en semitonos:");
    scanf("%d",&intervalo);

    // Apunte p1 al ppio del array y p2 al final:
    p1 = tabla;
    p2 = tabla + 11;

    // Encuentre la posicion de la nota base en el array,
    // incrementando el puntero hasta encontrarla:
    while(strcmp(*p1,nota)){
        p1++;
        if(p1>p2){ //mas allá del final del array
            printf("No se pudo encontrar %s\n",nota);
            return 1;
        }
    }

    //sume el intervalo a la dirección de la nota base:
    p1 += mod12(intervalo);

    //Si se va mas allá del fin de la tabla, inicie de nuevo por la izquierda
    if(p1 > p2) p1-=12;

    printf("%s transportado %d semitonos es %s\n", nota, intervalo, *p1);
    return 0;
}

Ejercicios:

1. Modifique el ejemplo de la escala mayor para que pregunte y reciba el nombre de la nota inicial con letras (no números, por ejemplo "Db"). Utilice un diccionario de notas parecido al siguiente en lugar de las comparaciones de las líneas 17-27.

1
char* escala[12] = {"C","Db","D","Eb","E","F","Gb","G","Ab","A","Bb","B"};

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>