C: Programação Imperativa em Baixo Nível
Introdução
C é uma linguagem de programação imperativa de propósito geral, com tipagem estática. Além disso, é uma linguagem de baixo nível, o que significa que fornece construções que mapeiam de forma eficiente para as instruções típicas da máquina. Basicamente, é uma maneira mais fácil de escrever programas de baixo nível. Em vez de escrever código de baixo nível em uma linguagem de montagem, você pode abstrair muito e escrever programas equivalentes em C.
Por ser um nível tão baixo, muitos kernels de sistemas operacionais e até mesmo outras linguagens de programação são implementadas, pelo menos em parte, usando o C. Além disso, muitas linguagens de programação modernas atualmente usam a sintaxe e as melhores práticas de C.
Executando Programas em C
Precisamos compilar o código C em código de máquina legível pelo computador para executar um programa escrito nesta linguagem.
gcc -o nome_executavel arquivo.c
Muitos desenvolvedores optam por escrever C usando um editor de texto básico, mas também há ambientes de desenvolvimento integrados mais especializados, alguns dos mais populares incluem Code Blocks , Eclipse e NetBeans.
Main e Bibliotecas
Cada programa deve conter uma função principal que será o ponto de partida da execução.
int main(){
//seu código aqui
return 0;
}
Para fazer uso das funções das bibliotecas, é necessário usar #include
no cabeçalho do programa com esta sintaxe:
#include <libname>
Bibliotecas mais utilizadas:
stdio.h
: permite entrada e saída de valores;stdlib.h
: Conjunto de funções para conversão numérica, geração de números pseudo-aleatórios, alocação de memória, funções de controle de processos e outras finalidades;math.h
: Conjunto de matemática comum.
Printando
printf("Olá\n");
printf("Mundo");
printf("!\n");
Nós podemos usar \n
para quebrar a linha.
Variáveis e Tipos de Dados
Os nomes diferenciam maiúsculas de minúsculas e podem começar com: letras ou sublinhado. Depois, pode incluir letras, números e sublinhados. A convenção diz: Comece com uma palavra minúscula, então palavras adicionais são capitalizadas. Se é uma constante, usamos palavras maiúsculas separadas por sublinhado.
char testGrade = 'A'; // único caractere de 8 bits.
char name[] = "Amintas"; // array de caracteres (string)
// você pode torná-los sem-sinal adicionando prefixo "unsigned"
short age0 = 10; // um inteiro de pelo menos 16 bits
int age1 = 20; // um inteiro de pelo menos 16 bits (não melnor que short)
long age2 = 30; // um inteiro de pelo menos 32 bits
long long age3 = 40; // um inteiro de pelo menos 64 bits
float gpa0 = 2.5; // ponto flutuante de precisão simples
double gpa1 = 3.5; // ponto flutuante de precisão dupla
long double gpa2 = 3.5; // ponto flutuante de precisão estendida
int isTall; // 0 se falso, diferente de zero se verdadeiro
isTall = 1;
const is IS_TALLER = 1; // podemos usar constantes com o prefixo "const"
// você pode formatar a saída dessa maneira
testGrade = 'F';
printf ("% s, sua nota é% c \n", name, testGrade);
/ *
%c caractere
%d número inteiro (base 10)
%e número exponencial de ponto flutuante
%f número de ponto flutuante
%i inteiro (base 10)
%o número octal (base 8)
%s uma sequência de caracteres
%u número decimal (inteiro) sem sinal
%x numero em hexadecimal (base 16)
%% imprime um sinal de porcentagem
\% imprime um sinal de porcentagem
* /
Casting and Conversão
Realizamos casting e conversões usando a seguinte sintaxe:
printf("%d \n", (int)3.14); // 3
printf("%f \n", (double)3 / 2); // 1.0
Ponteiros
Podemos manipular os ponteiros usando a seguinte sintaxe:
int num = 10;
printf("%p \n", &num); // valor do num (10)
int *pNum = # // armazenando o ponteiro
printf("%p \n", pNum); // valor do num (10)
printf("%d \n", *pNum); // endereço do num
Números
Podemos manipular os números usando a seguinte sintaxe:
printf("%d \n", 2 * 3); // Aritimética Básica: +, -, /, %, *
printf("%d \n", 10 % 3);
printf("%d \n", (1 + 2) * 3); // ordem das operações
printf("%f \n", 10 / 3.0); // ints e doubles
int num = 10;
num += 100; // +=, -=, /=, *=
printf("%d \n",num);
num++; // ++, --
printf("%d \n", num);
printf("%f \n", pow(2, 3)); // potência
printf("%f \n", sqrt(144)); // raiz quadrada
printf("%f \n", round(2.7)); // número arredondado
Entrada do Usuário
Podemos obter e manipular a entrada do usuário usando a seguinte sintaxe:
// obtendo um array de char (String)
char name[10];
printf("Enter your name: ");
fgets(name, 10, stdin);
printf("Hello %s! \n", name);
// obtendo um inteiro
int age;
printf("Enter your age: ");
scanf("%d", &age);
printf("You are %d \n", age);
// obtendo um único char
char grade;
printf("Enter your grade: ");
scanf("%c", &grade);
printf("You got an %c on the test \n", grade);
// recebendo um double
double gpa;
printf("Enter your gpa: ");
scanf("%lf", &gpa);
printf("Your gpa is %f \n", gpa);
Vetores (Arrays) e Matrizes
Podemos instanciar e manipular matrizes e matrizes usando a seguinte sintaxe:
int luckyNumbers[6]; // podemos definir o tamanho do array anteriormente
int luckyNumbers[] = {4, 8, 15, 16, 23, 42}; // podemos definir o tamanho do array dinamicamente
// indexes: 0 1 2 3 4 5
luckyNumbers[0] = 90;
printf("%d \n", luckyNumbers[0]); // podemos definir os elementos de um array
printf("%d \n", luckyNumbers[1]);
int numberGrid[2][3]; // podemos definir uma matriz similarmente
int numberGrid[2][3] = { {1, 2, 3}, {4, 5, 6} };
numberGrid[0][1] = 99;
printf("%d \n", numberGrid[0][0]);
printf("%d \n", numberGrid[0][1]);
Funções
Nós usamos funções desta maneira:
int addNumbers(int num1, int num2); // precisamos declarar funções antes do main
int main(){
int sum = addNumbers(4, 60);
printf("%d \n", sum);
return 0;
}
int addNumbers(int num1, int num2){ // depois do main, podemos implementar funções declaradas
return num1 + num2;
}
Condicionais
int isStudent = 0;
int isSmart = 0;
// if then else
if(isStudent != 0 && isSmart != 0){
printf("You are a student\n");
} else if(isStudent != 0 && isSmart == 0){
printf("You are not a smart student\n");
} else {
printf("You are not a student and not smart\n");
}
// podemos fazer comparações:>, <,> =, <=,! =, ==
if(1 > 3){
printf("number omparison was true\n");
}
if('a' > 'b'){
printf("character comparison was true\n");
}
char myGrade = 'A';
// switch case
switch(myGrade){
case 'A':
printf("You Pass\n");
break;
case 'F':
printf("You fail\n");
break;
default:
printf("Invalid grade\n");
}
Iterações (Loops)
Podemos iterar desta maneira:
// while loop
int index = 1;
while(index <= 5){
printf("%d \n", index);
index++;
}
// do-while loop
index = 1;
do{
printf("%d \n", index);
index++;
}while(index <= 5);
// for loop
for(int i = 0; i < 5; i++){
printf("%d \n", i);
}
Estruturas (Structs)
As estruturas são como objetos no Paradigma OO. Podemos usá-lo desta maneira:
// definindo struct
struct Book{
char title[100];
char author[100];
}
// instanciando e manipulando struct
int main(){
struct Book book1;
book1.numPages = 600;
strcpy( book1.title, "Harry Potter" );
strcpy( book1.author, "JK Rowling");
printf("%s \n", book1.title);
return 0;
}
Escrevendo e Lendo Arquivos
Podemos manipular arquivos externos desta maneira:
char line[255];
// se o arquivo não existir, um novo arquivo será criado
FILE * filePointer = fopen("PATH/file.txt", "w"); // criando/escrevendo/sobrescrevendo um arquivo
FILE * filePointer = fopen("PATH/file.txt", "a"); // acrescentando conteúdo em um arquivo
// podemos escrever, sobrescrever ou anexar conteúdo com este comando
fprint(fpointer, "content");
// podemos ler uma linha de um arquivo, uma linha por chamada
fgets(line, 255, fpointer);
// depois de usar um arquivo, precisamos fechar o ponteiro
fclose(fpointer);