PR1-ULA

Estilo de código

General

Use máximo 80 caracteres por línea, si requiere más caracteres agregue un salto de línea luego de un operador y agregue 8 espacios de identificación:

// Correcto

int producto_de_cuatro_enteros = primer_valor * segundo_valor *
        tercer_valor * cuarto_valor;

// Incorrecto

int producto_de_cuatro_enteros = primer_valor * segundo_valor
* tercer_valor * cuarto_valor;

Use 4 espacios para cada nivel de indentación:

// Correcto

int main()
{
    int buscar_numero = 6;

    for (int i = 0; i < 20; i++)
    {
        if (i == buscar_numero)
        {
            printf("Encontrado");
        }
    }
    return 0;
}

// Incorrecto

int main()
{
int buscar_numero = 6;
for (int i = 0; i < 20; i++)
{
if (i == buscar_numero)
{
printf("Encontrado");
}
}
return 0;
}

Directivas de preprocesador

Macros

Siempre que use la macro #define coloque su identificador en mayúsculas:

// Correcto

#define TAM 100

// Incorrecto

#define tam 100

Además, si evalua alguna expresión use paréntesis para los parámetros y la macro final:

// Correcto

#define MINIMO(x, y) ((x) < (y) ? (x) : (y))

// Incorrecto

#define MINIMO(x, y) x < y ? x : y

Inclusión de cabeceras

Cabecera estándar:

// Correcto

#include <nombre_de_archivo.h>

// Incorrecto

# include <nombre_de_archivo.h>

Cabecera del usuario:

// Correcto

#include "nombre_de_archivo.h"

// Incorrecto

# include "nombre_de_archivo.h"

Funciones

Nombres

Use el estilo snake_case para los nombres de las funciones, esto es cuando se quiere agregar más de una palabra (p. ej., float kelvin_a_celsius(float)), o si solo requiere una palabra evite usar letras mayúsculas:

// Correcto

int producto(int, int);

// Incorrecto

int Producto(int, int);

Prototipos (Interfaz de funciones)

Todos los prototipos de las funciones van alineados:

// Correcto

void    intercambiar(int*, int*);
float   kelvin_a_celsius(float);
int     binario_a_decimal(char*, int);

// Incorrecto

void intercambiar(int*, int*);
float kelvin_a_celsius(float);
int binario_a_decimal(char*, int);

Declaración

Las llaves van en su propia línea y alineadas:

// Correcto

void intercambiar(int* a, int* b)
{
    int aux = *a;
    *a = *b;
    *b = aux;
}

// Incorrecto

void intercambiar(int* a, int* b){
int aux = *a;
*a = *b;
*b = aux; }

Invocación

Agregue un espacio entre parámetros, es decir, uno después de cada coma:

// Correcto

intercambiar(&a, &b);

// Incorrecto

intercambiar(&a,&b);

Función main

Use la siguiente estructura para la función principal main:

int main()
{

}

Pero si requiere recibir parámetros de entrada, entonces use:

int main(int argc, char* argv[])
{

}

Variables

Nombres

  • Use el estilo snake_case para los nombres de las variables, esto es cuando se requiere agregar más de una palabra (p. ej., numero_mayor), o si solo requiere una palabra evite usar letras mayúsculas.

  • Asigne nombres representativos, por ejemplo si está realizando una suma de números pares llame a su variable sumar_pares.

Declaración y asignación

Si desea declarar múltiples variables del mismo tipo separe por comas y espacios. Además, declare las variables al momento de usarlas, y debe asignarles un valor inicial:

// Correcto

int suma = 0, promedio = 0, numero_mayor = 0;

// Incorrecto

int suma = 0, promedio = 0, numero_mayor;

Apuntadores

Cuando declare un apuntador escriba el * al lado del tipo de dato:

// Correcto

char* a;

// Incorrecto

char *a;

Usualmente estas dos formas son válidas en el lenguaje C, pero la segunda permite diferenciar mejor cuando se declara un apuntador.

Operaciones

Use un espacio antes y después de los operadores:

// Correcto

float celsius = 5.0 / 9.0 * (fahrenheit - 32.0);

// Incorrecto

float celsius = 5.0/9.0*(fahrenheit-32.0);

Condicionales

  • Use 1 espacio entre la palabra reservada (p. ej., if) y la condición

  • Las llaves van en su propia línea y alineadas

Condicional simple

// Correcto

if (n > 0)
{
    printf("n es positivo\n");
}

// Incorrecto

if(n > 0){
printf("n es positivo\n");
}

Condicional compuesto

Cuando use el condicional compuesto haga previamente 1 salto de línea después de cerrar las llaves y continúe en el mismo nivel de indentación:

// Correcto

if (x > 0)
{
    printf("x es positivo\n");
}
else if (x < 0)
{
    printf("x es negativo\n");
}
else
{
    printf("x es cero\n");
}

// Incorrecto

if (x > 0)
{
    printf("x es positivo\n");
}else if (x < 0)
{
    printf("x es negativo\n");
}else
{
    printf("x es cero\n");
}

Condicional múltiple

Use 4 espacios adicionales de indentación dentro de cada caso del switch y agregue un salto de línea después de cada uno:

// Correcto

switch (n)
{
    case -1:
        printf("n es -1\n");
        break;

    case 1:
        printf("n es 1\n");
        break;

    default:
        printf("n no es -1 y tampoco 1\n");
        break;
}

// Incorrecto

switch (n)
{
    case -1:
    printf("n es -1\n");
    break;
    case 1:
    printf("n es 1\n");
    break;
    default:
    printf("n no es -1 y tampoco 1\n");
    break;
}

Repeticiones

  • Si necesita variables temporales de iteración puede usar las letras i, j, k a menos que use nombres específicos que hagan su código más legible

  • Use 1 espacio entre la palabra reserva (p. ej., while) y la condición

  • Las llaves van en su propia línea y alineadas

  • Agregue 4 espacios de indentación para las instrucciones dentro del bucle

Repita para

// Correcto

for (int i = 0; i < LIMITE; i++)
{
    for (int j = 0; j < LIMITE; j++)
    {
        for (int k = 0; k < LIMITE; k++)
        {
            // instrucciones
        }
    }
}

// Incorrecto

for (int i = 0; i < LIMITE; i++)
{
for (int j = 0; j < LIMITE; j++)
{
for (int k = 0; k < LIMITE; k++)
{
            // instrucciones
}
}
}

Repita mientras

// Correcto

while (condición)
{
    // instrucciones
}

// Incorrecto

while (condición){
// instrucciones
}

Hacer mientras

// Correcto

do
{
    // instrucciones
}
while (condición);

// Incorrecto

do{
    // instrucciones
}while (condición);

Tipos de datos del usuario

Use el estilo PascalCase, es decir que cada palabra que contenga el nombre debe comenzar por mayúsculas y no se separan (p. ej., NumeroRacional).

Tipo de dato simple

// Correcto

typedef int Entero;

// Incorrecto

typedef int entero;

Tipo de dato compuesto (Registro)

  • Realice 1 salto de línea luego de escribir typedef struct

  • Las llaves van en su propia línea y alineadas

  • Agregue 4 espacios de indentación para las instrucciones dentro del registro

// Correcto

typedef struct
{
    int numerador;
    int denominador;
}
NumeroRacional;

// Incorrecto

typedef struct {
    int numerador;
    int denominador;
}Numeroracional;

Comentarios

Use // para realizar un comentario breve en una línea y agregue un espacio para escribir el texto

// Correcto

// este es mi primer comentario

// Incorrecto

//este es mi primer comentario

Use espacio+asterisco+espacio para realizar comentarios en varias líneas

// Correcto

/*
 * evite repetir lo que ya dice el código, agregue información adicional
 * evite entregar un programa con bloques de código comentados
 */

// Incorrecto

/** evite repetir lo que ya dice el código, agregue información adicional
 *evite entregar un programa con bloques de código comentados
 */

Archivos

Nombres

Use el estilo snake_case para los nombres de los archivos, esto es cuando se quiere agregar más de una palabra (p. ej., calcular_horas.c), si solo requiere una palabra evite usar letras mayúsculas.

Ejemplo de tipos de archivos

  • pr1_ula.h cabecera

  • hola_mundo.c código fuente C

  • entrada.txt texto simple

  • lib_ejemplo.a o lib_ejemplo.lib biblioteca estática (GNU/Linux y Windows respectivamente)

  • lib_ejemplo.so o lib_ejemplo.dll biblioteca dinámica (GNU/Linux y Windows respectivamente)

Referencias

Créditos