Lenguaje C
Estudiaremos el lenguaje de programacion C
- Bienvenidos.
- Hola Mundo
- Funciones
- Variables
- Acondicionados
- Bucles
- Operadores y Abstracción
- Linux y la línea de mando
- Mario
- Comentarios
- Tipos
- En resumen
Bienvenidos
- En nuestra sesión anterior, aprendí sobre Scratch, un lenguaje de programación visual.
- De hecho, todos los conceptos esenciales de programación presentados en Scratch se utilizarán a medida que aprendas a programar cualquier lenguaje de programación.
- Recuerde que las máquinas sólo entienden binario. Donde los humanos escriben_Código de fuente_, una lista de instrucciones para la computadora que es humana legible, máquinas sólo entienden lo que ahora podemos llamar_Código de la máquina_. Este código de máquina es un patrón de unos y ceros que produce un efecto deseado.
- Resulta que podemos convertirnos.Código de fuente_en
machine code
usando una pieza muy especial de software llamada_compilador. Hoy en día, le presentaremos a un compilador que le permitirá convertir el código fuente en el lenguaje de programación_C_en el código de la máquina. - Hoy en día, además de aprender sobre cómo codificar, usted estará aprendiendo sobre cómo escribir un buen código.
- El código se puede evaluar sobre tres ejes. Primero,_corrección_se refiere a "hace" el código que se ejecuta según lo previsto? Segundo,_diseño_se refiere a "cómo bien está el código" ? Por último,_estilo de estilo_se refiere a "cómo estéticamente agradable y consistente es el código?"
Hola Mundo
El entorno de desarrollo integrado (IDE) que se utiliza para este curso es_Código de Estudio Visual_, afectuosamente conocido como
- Una de las razones más importantes por las que utilizamos VS Code es que tiene todo el software requerido para el curso ya pre-cargado en él. Este curso y las instrucciones aquí presentes fueron diseñadas con VS Code en mente.
Instar manualmente el software necesario para el curso en su propio ordenador es un dolor de cabeza engorroso. Mejor usar siempre Código VS para asignaciones en este curso.
El compilador puede dividirse en varias regiones:
Tenga en cuenta que hay un explorador de archivos en el lado izquierdo donde se puede encontrar sus archivos. Además, observe que hay una región en el medio llamada editor de texto donde puede editar su programa. Finalmente, hay un
command line interface
, conocido como una command line__ventana de comandos CLI, o ventana de terminal donde podemos enviar comandos a la computadora en la nube.Usaremos tres comandos para escribir, compilar y ejecutar nuestro primer programa:
code hello.c
make hello
./hello
El primer comando, code hello.c
crea un archivo y nos permite escribir instrucciones para este programa. El segundo comando, make hello
, compila el archivo de nuestras instrucciones en C y crea un archivo ejecutable llamado hello
. El último comando, ./hello
, dirige el programa llamado hello
.
Podemos construir su primer programa en C escribiendo
code hello.c
a la ventana de la terminal. Observe que deliberadamente bajamos el nombre completo de archivo e incluimos el.c
extensión. Luego, en el editor de texto que aparece, escriba código de la siguiente manera:#include <stdio.h> int main(void) { printf("hello, world\n"); }
Tenga en cuenta que cada carácter de arriba sirve para un propósito. Si lo escribes incorrectamente, el programa no funcionará.
printf
es una función que puede producir una línea de texto. Observe la colocación de las comillas y el punto y coma. Además, observe que el\n
crea una nueva línea después de las palabrashello, world
.Haciendo clic en la ventana de la terminal, puede compilar su código mediante la ejecución
make hello
. Note que estamos omitiendo.c
.make
es un compilador que buscará nuestrohello.c
archivo y convertirlo en un programa llamadohello
. Si ejecutar este comando resulta en ningún error, puede proceder. Si no, revise su código para asegurarse de que coincide con lo anterior.Ahora, tipo
./hello
y su programa ejecutará diciendohello, world
.Ahora, abre el_Exploador de archivos_a la izquierda. Usted notará que ahora hay dos dos archivos llamados
hello.c
y otro archivo llamadohello
.hello.c
es capaz de ser leído por el compilador: It-s donde se almacena su código.hello
es un archivo ejecutable que se puede ejecutar, pero no puede ser leído por el compilador.
Funciones
En Scratch, utilizamos el
say
bloquear para mostrar cualquier texto en la pantalla. De hecho, en C, tenemos una función llamadaprintf
que hace exactamente esto.Observe que nuestro código ya invoca esta función:
printf("hello, world\n");
Observe que la función printf se llama. El argumento pasado a printf es "hello", worldán. La declaración de código se cierra con un
;
.Un error común en la programación C es la omisión de un punto y coma. Modifique su código como sigue:
#include <stdio.h> int main(void) { printf("hello, world\n") }
Fíjate que el punto y coma ya no está.
En la ventana de la terminal, corre
make hello
. Ahora se encontrará con numerosos errores. Colocando el punto y coma de nuevo en la posición correcta y corridamake hello
de nuevo, los errores desaparecen.Aviso también el símbolo especial
\n
en tu código. Intenta quitar esos personajes y_hacer_su programa de nuevo ejecutandomake hello
. Escúpedo./hello
en la ventana del terminal, cómo cambió su programa? Esto\
El carácter se llama un_de escape de carácter_que le dice al compilador que\n
es una instrucción especial.Restaurar su programa a lo siguiente:
#include <stdio.h> int main(void) { printf("hello, world\n"); }
Observe el punto y coma
\n
han sido restaurados.La declaración al comienzo del código
#include <stdio.h>
es un comando muy especial que le dice a la compilación que desea utilizar las capacidades de un_biblioteca_llanstdio.h
, a_Archivo de la cabeza_. Esto le permite, entre muchas otras cosas, utilizar elprintf
función. Usted puede leer acerca de todas las capacidades de esta biblioteca en elPáginas manuales. Las Páginas Manual proporcionan un medio por el cual para entender mejor lo que hacen varios comandos y cómo funcionan.Las bibliotecas son colecciones de funciones pre-escritas que otros han escrito en el pasado que podemos utilizar en nuestro código.
Resulta que CS50 tiene su propia biblioteca llamada
cs50.h
. Usamos esta biblioteca en tu programa.
Variables
Recordemos que en Scratch, tuvimos la capacidad de preguntarle al usuario "Qué es tu nombre" y decir "hello" con ese nombre adjunto.
En C, podemos hacer lo mismo. Modifique su código como sigue:
#include <stdio.h> int main(void) { string answer = get_string("What's your name? "); printf("hello, %s\n", answer); }
El
get_string
función se utiliza para obtener una cadena del usuario. Luego, la variableanswer
se pasa alprintf
función.%s
dice que elprintf
función para prepararse para recibir unstring
.answer
es un lugar especial de retención que llamamos un_variable variable_.answer
es de tipostring
y puede sostener cualquier cuerda dentro de ella. Hay muchos.Tipos de datos, tales comoint
,bool
,char
, y muchos otros.%s
es un marcador de posición llamado_código de formato_que dice elprintf
función para prepararse para recibir unstring
.answer
es elstring
ser pasado a%s
.Corriendo
make hello
de nuevo en la ventana del terminal, observe que aparecen numerosos errores.Mirando los errores
string
yget_string
no son reconocidos por el compilador. Tenemos que enseñar al compilador estas características añadiendo una biblioteca llamadacs50.h
:#include <cs50.h> #include <stdio.h> int main(void) { string answer = get_string("What's your name? "); printf("hello, %s\n", answer); }
Note que
#include <cs50.h>
se ha añadido a la parte superior de su código.Ahora corriendo
make hello
de nuevo en la ventana del terminal, puede ejecutar su programa escribiendo./hello
. El programa ahora pide su nombre y luego se dice hola con su nombre adjunto, como se pretendía.printf
permite muchos códigos de formato. Aquí hay una lista incomprensiva de las que usted puede utilizar en este curso:%c %f %i %li %s
%s
se utiliza parastring
variables.%i
se utiliza paraint
o variables entera.
Acondicionados
Otro bloque de construcción que utilizó dentro de Scratch fue el de_condicionales_. Por ejemplo, es posible que desee hacer una cosa si x es mayor que y. Además, es posible que desee hacer algo más si esa condición no se cumple.
Miramos algunos ejemplos de Scratch.
En C, puede asignar un valor a un
int
o entero de la siguiente manera:int counter = 0;
Observe cómo una variable llamada
counter
de tipoint
se le asigna el valor0
.C también se puede programar para añadir uno a
counter
como sigue:counter = counter + 1;
Observe cómo
1
se añade al valor decounter
.Esto puede representarse también como:
counter = counter++;
Observe cómo
1
se añade al valor decounter
. Sin embargo, el++
se utiliza en lugar decounter + 1
.También puede restar uno de
counter
como sigue:counter = counter--;
Observe cómo
1
se elimina al valor decounter
.Usando este nuevo conocimiento sobre cómo asignar valores a las variables, puedes programar tu primera declaración condicional.
En la ventana de la terminal, tipo
code compare.c
y código de escritura de la siguiente manera:#include <cs50.h> #include <stdio.h> int main(void) { int x = get_int("What's x? "); int y = get_int("What's y? "); if (x < y) { printf("x is less than y\n"); } }
Observe que creamos dos variables, un
int
o entero llamadox
y otro llamadoy
. Los valores de estos se poblan con laget_int
función.Puede ejecutar su código ejecutando
make compare
en la ventana de la terminal, seguido de./compare
. Si recibes algún mensaje de error, revisa tu código para detectar errores._Gráficos de flujo_son una forma por la que se puede examinar cómo funciona un programa informático. Tales gráficos se pueden utilizar para examinar la eficiencia de nuestro código.
Mirando un diagrama de flujo del código anterior, podemos notar numerosas deficiencias.
Podemos mejorar su programa codificando de la siguiente manera:
#include <cs50.h> #include <stdio.h> int main(void) { int x = get_int("What's x? "); int y = get_int("What's y? "); if (x < y) { printf("x is less than y\n"); } else if (x > y) { printf("x is greater than y\n"); } else { printf("x is equal to y\n"); } }
Observe que todos los resultados potenciales se contabilizan ahora.
Puedes rehacer y volver a ejecutar tu programa y probarlo.
Examinando este programa en un diagrama de flujo, puede ver la eficiencia de nuestras decisiones de diseño de código.
Considerando otro tipo de datos llamado
char
podemos empezar un nuevo programa escribiendocode agree.c
a la ventana de la terminal.Dónde a
string
es una serie de personajes, unchar
es un solo personaje.En el editor de texto, escriba código de la siguiente manera:
#include <cs50.h> #include <stdio.h> int main(void) { // Prompt user to agree char c = get_char("Do you agree? "); // Check whether agreed if (c == 'Y' || c == 'y') { printf("Agreed.\n"); } else if (c == 'N' || c == 'n') { printf("Not agreed.\n"); } }
Observe que las citas simples se utilizan para caracteres individuales. Además, observe que
==
asegurar que algo es igual a otra cosa, donde un signo igual tendría una función muy diferente en C. Por último, observe que||
efectivamente significa o.Puedes probar tu código escribiendo
make agree
en la ventana de la terminal, seguida de./agree
.
Bucles
También podemos utilizar los bucles de la construcción de bloques de Scratch en nuestros programas C.
Miramos algunos ejemplos de Scratch. Considere el siguiente código:
int counter = 3; while (counter > 0) { printf("meow\n"); counter = counter - 1; }
Aviso que su código asigna el valor de
3
a lacounter
variable. Entonces, elwhile
Loop dicemeow
y quita uno del mostrador para cada iteración. Una vez que el contador no es mayor que cero, el bucle termina.En la ventana de la terminal, escriba
code meow.c
y código de escritura de la siguiente manera:#include <stdio.h> int main(void) { printf("meow\n"); printf("meow\n"); printf("meow\n"); }
Observe que esto hace lo que se pretende pero tiene una oportunidad para un mejor diseño.
Podemos mejorar nuestro programa modificando su código de la siguiente manera:
#include <stdio.h> int main(void) { int i = 3; while (i > 0) { printf("meow\n"); i--; } }
Note que creamos un
int
llamei
y asignarle el valor3
. Entonces, creamos unwhile
bucle que se correrá tan tiempo comoi > 0
. Luego, el bucle corre. Cada vez1
se resta ai
utilizando eli--
declaración.Del mismo modo, podemos implementar una especie de conteo modificando nuestro código de la siguiente manera:
#include <stdio.h> int main(void) { int i = 1; while (i <= 3) { printf("meow\n"); i++; } }
Observe cómo nuestro contador
i
se ha iniciado en1
. Cada vez que el bucle se ejecuta, aumentará el mostrador por1
. Una vez que el mostrador es mayor que3
, detendrá el bucle.Generalmente, en informática contamos desde cero. Mejor revisar su código de la siguiente manera:
#include <stdio.h> int main(void) { int i = 0; while (i < 3) { printf("meow\n"); i++; } }
Observe que ahora cuenta desde cero.
Otra herramienta en nuestra caja de herramientas para bucle es un
for
bucle.Puedes seguir mejorando el diseño de nuestro
meow.c
programa usando unfor
bucle. Modifique su código como sigue:#include <stdio.h> int main(void) { for (int i = 0; i < 3; i++) { printf("meow\n"); } }
Observe que el
for
El bucle incluye tres argumentos. El primer argumentoint i = 0
comienza nuestro contador en cero. El segundo argumentoi < 3
es la condición que se está comprobando. Finalmente, el argumentoi++
le dice al bucle que se incremente por uno cada vez que el bucle corre.Incluso podemos bucle para siempre usando el siguiente código:
#include <cs50.h> #include <stdio.h> int main(void) { while (true) { printf("meow\n"); } }
Note que
true
siempre será el caso. Por lo tanto, el código siempre funcionará. Perderá el control de la ventana de su terminal ejecutando este código. Usted puede romper de un infinito golpeandocontrol-C
en el teclado.Si bien proporcionaremos mucha más orientación más tarde, puede crear su propia función dentro de C de la siguiente manera:
void meow(void) { printf("meow\n"); }
La inicial
void
significa que la función no devuelve ningún valor. El(void)
significa que no se proporcionan valores a la función.Esta función se puede utilizar en la función principal de la siguiente manera:
#include <stdio.h> void meow(void); int main(void) { for (int i = 0; i < 3; i++) { meow(); } } void meow(void) { printf("meow\n"); }
Observe cómo el
meow
función se llama con lameow()
instrucción. Esto es posible porque elmeow
función se define en la parte inferior del código y el prototipo de la función se proporciona en la parte superior del código comovoid meow(void)
.Tu
meow
función puede modificarse para aceptar la entrada:#include <stdio.h> void meow(int n); int main(void) { meow(3); } // Meow some number of times void meow(int n) { for (int i = 0; i < n; i++) { printf("meow\n"); } }
Observe que el prototipo ha cambiado a
void meow(int n)
para demostrar quemeow
acepta unint
como su aportación.
Operadores y Abstracción
Puede implementar una calculadora en C. En su terminal, escriba
code calculator.c
y código de escritura de la siguiente manera:#include <cs50.h> #include <stdio.h> int main(void) { // Prompt user for x int x = get_int("x: "); // Prompt user for y int y = get_int("y: "); // Perform addition printf("%i\n", x + y); }
Observe cómo el
get_int
función se utiliza para obtener un entero del usuario dos veces. Un entero se almacena en elint
variable llamadax
. Otro se almacena en elint
variable llamaday
. Entonces, elprintf
función imprime el valor dex + y
, designado por la%i
símbolo.Los operadores se refieren a las operaciones matemáticas que son compatibles con su compilador. En C, estos operadores matemáticos incluyen:
+
para la adición-
para la resta*
para multiplicación/
para la división%
para el resto
_Abstracción_es el arte de simplificar nuestro código de tal manera que se ocupa de problemas más pequeños y más pequeños.
Expandiendo sobre nuestro conocimiento previamente adquirido sobre las funciones, podríamos abstraer la adición en una función. Modifique su código como sigue:
#include <cs50.h> #include <stdio.h> int add(int a, int b); int main(void) { // Prompt user for x int x = get_int("x: "); // Prompt user for y int y = get_int("y: "); // Perform addition int z = add(x, y); printf("%i\n", z); } int add(int a, int b) { int c = a + b; return c; }
Observe que el
add
función toma dos variables como su entrada. Estos valores se asignan aa
yb
y preforma un cálculo, devolviendo el valor dec
. Además, observe que el alcance (o el contexto en que existen variables) dex
es elmain
función. La variablec
sólo dentro del ámbito de aplicación de laadd
función.El diseño de este programa se puede mejorar de la siguiente manera:
#include <cs50.h> #include <stdio.h> int add(int a, int b); int main(void) { // Prompt user for x int x = get_int("x: "); // Prompt user for y int y = get_int("y: "); // Perform addition printf("%i\n", add(x, y)); } int add(int a, int b) { return a + b; }
Note que
c
en eladd
función se elimina por completo.Aunque muy útil para poder abstraerse a un
add
función, también puede realizar la adición a través de la truncación de la siguiente manera:#include <cs50.h> #include <stdio.h> int main(void) { // Prompt user for x long x = get_long("x: "); // Prompt user for y long y = get_long("y: "); // Perform addition printf("%li\n", x + y); }
Observe que la adición se realiza dentro de la
printf
función.Del mismo modo, la división puede realizarse de la siguiente manera:
#include <cs50.h> #include <stdio.h> int main(void) { // Prompt user for x int x = get_int("x: "); // Prompt user for y int y = get_int("y: "); // Divide x by y printf("%i\n", x / y); }
Observe que la división se realiza dentro de la
printf
función.Linux y la línea de mando
_Linux_es un sistema operativo al que se puede acceder a través de la línea de comandos en la ventana de terminal de VS Code.
Algunos argumentos comunes de línea de comando que podemos usar incluyen:
cd
, para cambiar nuestro directorio actual (carrete)cp
, para copiar archivos y directoriosls
, para listar archivos en un directoriomkdir
, para hacer un directoriomv
, para mover archivos y directorios (reaantes)rm
, para eliminar (eliminando) archivosrmdir
, para eliminar directorios (eliminados)
La más comúnmente se usa es
ls
que listará todos los archivos del directorio o directorio actual. Adelante y mecanols
en la ventana de la terminal y golpeenter
. Verás todos los archivos de la carpeta actual.Otro comando útil es
mv
, donde puede mover un archivo de un archivo a otro. Por ejemplo, podría utilizar este comando para cambiar el nombreHello.c
(Nota la parte superiorH
) ahello.c
por mecíamv Hello.c hello.c
.También puede crear carpetas. Puedes escribir
mkdir pset1
para crear un directorio llamadopset1
.A continuación, puede utilizar
cd pset1
para cambiar su directorio actual apset1
.
Mario
Todo lo que hemos discutido hoy se ha centrado en varios bloques de construcción de su trabajo como un científico informático emergente.
Lo siguiente le ayudará a orientarse hacia el trabajo en un problema establecido para esta clase en general: Cómo se aborda un problema relacionado con la informática?
Imagina queríamos emular lo visual del juego Super Mario Bros. Teniendo en cuenta las cuatro cuadrillas de preguntas en la imagen, cómo podríamos crear código que representa aproximadamente estos cuatro bloques horizontales?
En la ventana de la terminal, tipo
code mario.c
y código de la siguiente manera:#include <stdio.h> int main(void) { for (int i = 0; i < 4; i++) { printf("?"); } printf("\n"); }
Observe cómo se imprimen cuatro signos de interrogado usando un bucle.
Del mismo modo, podemos aplicar esta misma lógica para poder crear tres bloques verticales.
Para lograrlo, modifique su código de la siguiente manera:
#include <stdio.h> int main(void) { for (int i = 0; i < 3; i++) { printf("#\n"); } }
Observe cómo se imprimen tres ladrillos verticales usando un lazo.
Y si queríamos combinar estas ideas para crear un grupo de tres por tres bloques?
Podemos seguir la lógica de arriba, combinando las mismas ideas. Modifique su código como sigue:
#include <stdio.h> int main(void) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("#"); } printf("\n"); } }
Observe que un bucle está dentro de otro. El primer bucle define qué fila vertical se está imprimiendo. Para cada fila, se imprimen tres columnas. Después de cada fila, se imprime una nueva línea.
Y si quisiéramos asegurarnos de que el número de bloques para ser constante, es decir, inmutable? Modifique su código como sigue:
int main(void) { const int n = 3; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("#"); } printf("\n"); } }
Observe cómo
n
es ahora una constante. Nunca se puede cambiar.Como ilustrado anteriormente en esta conferencia, podemos hacer que nuestro código nos den un aviso al usuario para el tamaño de la cuadrícula. Modifique su código como sigue:
#include <cs50.h> #include <stdio.h> int main(void) { int n = get_int("Size: "); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("#"); } printf("\n"); } }
Note que
get_int
se utiliza para pedir al usuario.Un consejo general dentro de la programación es que nunca debe confiar completamente en su usuario. Es probable que se porten mal, escribiendo valores incorrectos donde no deberían. Podemos proteger nuestro programa del mal comportamiento comprobando para asegurarnos de que la entrada del usuario satisfaga nuestras necesidades. Modifique su código como sigue:
#include <cs50.h> #include <stdio.h> int main(void) { int n; do { n = get_int("Size: "); } while (n < 1); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("#"); } printf("\n"); } }
Observe cómo el usuario se le pide continuamente para el tamaño hasta que la entrada del usuario sea 1 o mayor.
Comentarios
Los comentarios son partes fundamentales de un programa informático, donde dejas comentarios explicativos para ti y otros que pueden estar colaborando contigo con respecto a tu código.
Todo el código que crea para este curso debe incluir comentarios robustos.
Normalmente cada comentario es unas pocas palabras o más, proporcionando al lector una oportunidad para entender lo que está sucediendo en un bloque específico de código. Además, tales comentarios sirven como recordatorio para usted más tarde cuando usted necesita revisar su código.
Observaciones implican colocación
//
en su código, seguido de un comentario. Modifique su código de la siguiente manera para integrar los comentarios:#include <cs50.h> #include <stdio.h> int main(void) { // Prompt user for positive integer int n; do { n = get_int("Size: "); } while (n < 1); // Print an n-by-n grid of bricks for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("#"); } printf("\n"); } }
Observe cómo cada comentario comienza con un
//
.
Tipos
Una de las deficiencias de Cás es la facilidad por la que gestiona la memoria. Mientras que C le proporciona un control inmenso sobre cómo se utiliza la memoria, los programadores tienen que ser muy conscientes de los posibles escollos de la gestión de la memoria.
Los tipos se refieren a los posibles datos que se pueden almacenar dentro de una variable. Por ejemplo, a
char
está diseñado para acomodarse a un solo personaje comoa
o o2
.Los tipos son muy importantes porque cada tipo tiene límites específicos. Por ejemplo, debido a los límites de la memoria, el valor más alto de una
int
puede ser4294967295
. Si intentas contar unint
más,_desbordamiento entero_resultado de donde se almacenará un valor incorrecto en esta variable.El número de bits limita lo alto y bajo que podemos contar.
Los tipos con los que podría interactuar durante este curso incluyen:
bool
, una expresión booleana de true o falsochar
, un solo personaje como un o 2double
, un valor de punto flotante con más dígitos que una flotaciónfloat
, un valor de punto flotante, o número real con un valor decimalint
, enteros hasta cierto tamaño, o número de bitslong
, enteros con más bits, para que puedan contar más que un intstring
, una cadena de personajes
Como está codificando, preste especial atención a los tipos de variables que está utilizando para evitar problemas dentro de su código.
Examinamos algunos ejemplos de desastres que pueden ocurrir a través de errores relacionados con la memoria.