






















































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila de curso de programação em C++
Tipologia: Notas de estudo
1 / 62
Esta página não é visível na pré-visualização
Não perca as partes importantes!























































1 Introdução
A linguagem C é uma linguagem de programação popular e amplamente utilizada para criar programas de computador. Programadores no mundo todo utilizam a linguagem C, pois ela oferece o máximo controle e eficácia. Se você é um programador, ou pretende se tornar um, eis alguns benefícios que você desfrutará ao aprender a linguagem C:
Esta animação mostra a execução de um programa simples em C. Ao final deste artigo, você entenderá como ela funciona
2 O que é C?
C é uma linguagem de programação de computadores. Isso significa que você pode usá-la para criar listas de instruções para um computador seguir. A linguagem C é uma das milhares de linguagens de programação atualmente em uso. Existe há várias décadas e ganhou ampla aceitação por oferecer aos programadores o máximo em controle e eficiência. A linguagem C é fácil de aprender: pode ter um estilo um tanto criptográfico comparada às outras linguagens, mas isso é logo superado.
A linguagem C é o que se chama de linguagem compilada. Isso significa que,
uma vez escrito o programa em C, ele deve ser passado por um compilador para transformar seu programa em executável para o computador rodar (executar). Um programa em C possui um formato legível ao homem, enquanto o executável gerado no compilador possui a forma legível para a máquina e é executada por ela. Isto significa que para escrever e executar um programa em C, você precisa ter acesso a um compilador de C. Se estiver usando uma máquina UNIX (por exemplo, escrevendo scripts CGI em C no seu computador UNIX, ou se você é um estudante que trabalha em uma máquina UNIX de um laboratório), o compilador de C está disponível gratuitamente. Ele é chamado “cc” ou “gcc” e está disponível na linha de comando. Se você é um aluno, estão a escola lhe fornecerá um compilador (descubra qual a escola usa e aprenda mais sobre ele). Se estiver trabalhando em casa em uma máquina Windows, você precisará fazer o download de um compilador de C gratuito ou comprar um compilador comercial. Um compilador comercial amplamente utilizado é o ambiente Visual C++ da Microsoft (ele compila programas em C e C++). Mas, infelizmente, este programa custa caro. Caso não disponha de algumas centenas de dólares para gastar em um compilador comercial, você pode usar um dos compiladores gratuitos disponíveis na internet. Veja delorie.com/djgpp como ponto de partida em sua pesquisa.
Vamos começar com um programa em C bastante simples e progredir a partir dele. Vamos supor que você usará a linha de comando UNIX e o gcc como seu ambiente para estes exemplos, mas caso contrário, todos os códigos também funcionarão (basta compreender e usar o compilador que tiver disponível).
3 O mais simples programa em C
Vamos começar com o programa em C mais simples possível e usá-lo tanto para entender os fundamentos da linguagem C como o processo de compilação em C. Digite o programa seguinte em um editor de textos padrão (vi ou emacs no UNIX, Bloco de notas no Windows ou TeachText no Macintosh). Depois salve o programa em um arquivo denominado samp.c. Se deixar de incluir .c , você provavelmente receberá informação de algum tipo de erro ao compilá-lo (portanto, não se esqueça de inserir o .c ). Certifique-se também de que o editor não anexe automaticamente caracteres extras (como .txt) ao nome do arquivo. Eis o primeiro programa: #include <stdio.h>
int main() { printf("Este é o resultado do meu primeiro program!\n"); return 0; } Quando executado, este programa instrui o computador a imprimir a linha: “Este é o resultado do meu primeiro programa!”, e depois encerra o programa. Posição Ao escrever este programa, posicione #include de forma que o sinal # esteja na coluna 1 (mais à esquerda). Isso facilita o seu entendimento, mas na verdade o espaçamento e recuo podem ser do jeito que você preferir. Em alguns sistemas UNIX, você encontrará um programa chamado cb , o C Beautifier (algo como “embelezador de C”), que formata códigos. O espaçamento e recuo mostrados acima são um bom exemplo a seguir.
Para compilar este código, siga estas etapas:
6 Printf
A instrução printf permite enviar o resultado para a saída padrão. Para nós, o termo “saída padrão” se refere à tela (embora você possa redirecionar a saída padrão para um arquivo de texto ou outro comando). Eis outro programa que o ajudará a aprender mais sobre printf: #include <stdio.h>
int main( ) { int a, b, c; a = 5; b = 7; c = a + b; printf("%d + %d = %d\n", a, b, c); return 0; } Digite este programa em um arquivo e salve-o como add.c. Compile-o com a linha gcc add.c -o add e depois o execute digitando add (ou ./add ). Você verá a linha “5 + 7 = 12” como resultado. Eis uma explicação das diferentes linhas neste programa:
O computador adiciona o valor em a (5) ao valor em b (7) para formar o resultado 12 e então coloca o novo valor (12) na variável c. Por este motivo, o sinal = nesta linha é denominado “operador de atribuição”.
7 Printf: lendo os valores de usuário
O programa anterior é bom, mas seria melhor se ele lesse os valores 5 e 7 inseridos pelo usuário, em vez de usar constantes. Em vez disso, tente este programa: #include <stdio.h>
int main() { int a, b, c; printf("Entre o primeiro valor:");
scanf("%d", &a); printf("Entre o segundo valor:"); scanf("%d", &b); c = a + b; printf("%d + %d = %d\n", a, b, c); return 0; }
Eis como este programa funciona ao ser executado:
Faça as alterações, depois compile e rode o programa para certificar-se de que funciona. Observe que scanf usa as mesmas strings de formato que printf (digite man scanf para mais informação). Observe também o & na frente de a e b. Este é o operador de endereço em C: ele retorna o endereço da variável (isto não fará sentido até aprendermos sobre os ponteiros). Você tem de usar o operador & em scanf em qualquer variável do tipo char, int ou float, bem como tipos de estrutura (que discutiremos em breve). Se excluir o operador &, você receberá um erro ao executar o programa. Tente executá-lo para ver que tipo de erro ocorre. Vamos ver algumas variações para entender printf completamente. Eis uma instrução simples de printf: printf(“Hello”); Esta chamada para printf tem uma string de formatos que diz ao printf para enviar a palavra “Hello” para a saída padrão. Compare-a com: printf(“Hello\n”); A diferença entre as duas é que a segunda versão exibe a palavra “Hello” seguida de uma quebra de linha. As linha seguintes mostram como exibir o valor de uma variável usando printf. printf("%d", b); O %d é uma expressão de controle que será substituída pelo valor da variável b
quando a instrução printf for executada. Freqüentemente, você vai desejar incluir o valor entre outras palavras. Uma forma de fazer isso é: printf("A temperatura é "); printf("%d", b); printf(" degrees"); Um modo mais fácil de dizer isso é: printf("A temperatura é %d graus\n", b); Você também pode usar múltiplas expressões de controle %d em uma instrução printf: printf("%d + %d = %d\n", a, b, c); Na instrução printf, é extremamente importante que o número de operadores na string de formato corresponda exatamente ao número e tipo de variáveis que a seguem. Por
Modifique este programa para que ele aceite 3 valores em vez de 2 e some todos eles juntos: #include <stdio.h>
int main() { int a, b, c; printf("Entre o primeiro valor:"); scanf("%d", &a); printf("Entre o segundo valor:"); scanf("%d", &b); c = a + b; printf("%d + %d = %d\n", a, b, c); return 0; } Tente apagar ou adicionar caracteres ou palavras aleatórias
em um dos programas anteriores e veja como o compilador reage a tais erros de compilação. Por exemplo, apague a variável b na primeira linha do programa anterior e veja o que o compilador faz quando você se esquece de declarar uma variável. Apague um ponto-e-vírgula e veja o que acontece. Omita uma das chaves. Remova um dos parênteses próximos à função principal. Faça uma alteração por vez e compile o programa para ver o que acontece. Simulando erros como esses você pode aprender sobre diferentes erros de compilação, o que facilitará futuras detecções quando você os cometer.
Erros a serem evitados na linguagem C
9 Desvio e looping
Em C, as instruções if e loops while regem-se pelos princípios das expressões Booleanas. Eis um programa simples em C que demonstra uma instrução if:
#include <stdio.h>
int main() {
int b; printf("Digite um valor:"); scanf("%d", &b); if (b < 0) printf("O valor é negativo "); return 0; } Este programa aceita um número do usuário. Ele então testa esse número
utilizando uma instrução if para ver se ele é menor que 0. Se for, o programa imprime uma mensagem. Caso contrário, o programa não faz nada. A parte (b < 0) do programa é a expressão booleana. A linguagem C avalia esta expressão para decidir se imprime ou não a mensagem. Se a expressão booleana se mostra Verdadeira , então a linguagem C executa a linha imediatamente posterior à instrução if (ou um bloco de linhas entre chaves logo após a instrução if). Se a expressão booleana se mostrar Falsa , então a linguagem C pula a linha ou bloco de linhas logo após a instrução if.
Eis um exemplo um pouco mais complexo: #include <stdio.h>
int main() { int b; printf("Digite um valor:"); scanf("%d", &b); if (b < 0) printf("O valor é negativo "); else if (b == 0) printf("O valor é zero "); else printf("O valor é positivo "); return 0; } Neste exemplo, as seções else if e else avaliam tanto para valores positivos como
zero. Eis uma expressão booleana mais complicada: if ((x==y) && (j>k))
z=1; else q=10; Esta instrução diz: “Se o valor da variável x for igual ao valor da variável y, e se o valor da variável j for maior que o valor da variável k, então defina a variável z como 1; de outro modo, defina a variável q como 10”. Você usará instruções if como esta em todos os seus programas C para tomar decisões. De um modo geral, a maioria das decisões será simples como o primeiro exemplo, mas, eventualmente, as coisas podem ser um pouco mais complicadas. Observe que a linguagem C utiliza == para testar a igualdade , enquanto utiliza =
para atribuir um valor a uma variável. O símbolo && em C representa uma operação booleana AND.
a++; printf("%d\n",a); } Você também pode colocá-lo para indicação: for (a=1,b=6; a < b; a++,printf("%dn",a)); É um pouco confuso, mas é possível. O operador vírgula permite separar diversas instruções diferentes nas seções de inicialização e incremento do loop for (porém não na seção de teste). Muitos programadores de linguagem C gostam de concentrar muitas informações em uma única linha de código. Outros acham que isto torna o código mais difícil de entender, e portanto desmembram essas instruções.
= versus == em expressões booleanas O sinal == é um problema na linguagem C pois frequentemente você se esquece e digita apenas =^ em uma expressão booleana. Este é um erro comum de ocorrer, mas para o compilador há uma diferença significativa. A linguagem C aceitará = e == em uma expressão booleana, mas
o comportamento do programa mudará consideravelmente quando usamos um ou outro. As expressões booleanas em C avaliam os inteiros e os inteiros podem ser usados dentro de expressões booleanas. O valor inteiro 0 em C é Falso, enquanto qualquer outro valor inteiro é Verdadeiro. É código seguinte é permitido em C: #include <stdio.h>
int main() { int a; printf("Digite um número:"); scanf("%d", &a); if (a) { printf("O valor é verdadeiro\n"); } return 0; } Se a for qualquer número diferente de 0, a instrução printf é executada. Em C, uma instrução como if (a=b) significa: “Atribuir b para a , e então testar a para seu valor Booleano". Assim, se a
retornar o valor 0, a instrução if é Falsa. Caso contrário, é Verdadeira. O valor de a muda durante o processo. Este não é o comportamento desejado se você pretendeu digitar == (embora esta característica seja útil quando usada corretamente), assim, tenha cuidado com o uso de = e ==.
10 Looping: um exemplo real
Suponhamos que você queira criar um programa que imprima uma tabela de conversão Fahrenheit para Celsius. Isso pode ser facilmente obtido com um loop for ou loop while: #include <stdio.h>
int main() { int a; a = 0; while (a <= 100) { printf("%4d graus F = %4d graus C\n", a, (a - 32) * 5 / 9); a = a + 10; } return 0; } Se executar este programa, ele produzirá uma tabela de valores iniciando em 0 graus F e terminando em 100 graus F. O resultado será este: 0 graus F = -17 graus C 10 graus F = -12 graus C 20 graus F = -6 graus C 30 graus F = -1 graus C 40 graus F = 4 graus C 50 graus F = 10 graus C 60 graus F = 15 graus C 70 graus F = 21 graus C 80 graus F = 26 graus C 90 graus F = 32 graus C 100 graus F = 37 graus C Os valores da tabela estão em incrementos de 10 graus. Observe como é fácil alterar os valores iniciais, finais ou de incremento da tabela que o programa produz. Para valores mais precisos, você pode usar valores de ponto flutuante : #include <stdio.h>
int main() { float a; a = 0; while (a <= 100) { printf("%6.2f graus F = %6.2f graus C\n",
printf("%6.2f graus F = %6.2f graus C\n", 98.6, (98.6 - 32.0) * 5.0 / 9.0); } printf("%6.2f graus F = %6.2f graus C\n", a, (a - 32.0) * 5.0 / 9.0); b = a; a = a + 10; } return 0; } Tente isto
Erros a serem evitados na linguagem C
for (x=1; x<10; x++); printf("%d\n",x); imprime apenas um valor, pois o ponto-e-vírgula após a instrução for atua como uma linha para a execução do loop for.
11 Matrizes
Nesta seção, criaremos um pequeno programa em C que gera 10 números aleatórios e os ordena. Para tal, utilizaremos uma nova disposição de variável denominada matriz.
Uma matriz permite declarar e trabalhar com uma coleção de valores de mesmo tipo. Por exemplo, você pode querer criar uma coleção de 5 inteiros. Uma forma para fazer isso seria declarar 5 inteiros diretamente: int a, b, c, d, e; Isso está certo, mas e se você precisasse de milhares de números inteiros? Uma
forma mais fácil é declarar uma matriz de 5 inteiros. int a[5]; Os cinco inteiros individuais dentro desta matriz são acessados por um índice.
Todas as matrizes iniciam em zero e vão até n-1 no C. Assim, int a[5]; contém 5 elementos. Por exemplo: int a[5];
a[0] = 12; a[1] = 9; a[2] = 14; a[3] = 5; a[4] = 1; Uma das vantagens sobre a indexação de matriz é que você pode usar um loop para manipular o índice. Por exemplo, o código a seguir inicializa todos os valores na matriz em 0: int a[5];
int i; for (i=0; i<5; i++) a[i] = 0; O código seguinte inicializa seqüencialmente os valores na matriz e então os imprime: #include <stdio.h>
int main() { int a[5]; int i; for (i=0; i<5; i++) a[i] = i; for (i=0; i<5; i++) printf("a[%d] = %dn", i, a[i]); } As matrizes são usadas a toda hora em C. Para entender seu uso, inicie um editor e digite o seguinte código: #include <stdio.h>
#define MAX 10
int a[MAX]; int rand_seed=10;
/* from K&R - retorna um número aleatório entre 0 e 32767.*/ int rand()
printf("%dn",a[i]); Esta codificação classifica os valores aleatórios e os imprime ordenadamente. Sempre que o executar, você obterá os mesmos valores. Para alterar os valores classificados, altere o valor de rand_seed sempre que executar o programa.
O único modo fácil para realmente entender o que o código está fazendo é executá-lo “à mão”. Isto é, assuma que MAX é 4 para facilitar, pegue uma folha de papel e finja que é o computador. Desenhe a matriz no papel e coloque 4 valores aleatórios e não- classificados na matriz. Execute cada linha da seção de classificação do código e desenhe exatamente o que acontece. Você verá que, sempre que submetidos ao loop interno, os valores maiores na matriz são empurrados para baixo e os valores menores vão para o topo da matriz. Tente isto
12 Mais sobre matrizes
Tipos de variáveis
Há 3 tipos padrão de variáveis em linguagem C:
Operadores e precedência de operadores
Os operadores em C são semelhantes aos operadores na maioria das linguagens: + : adição;
- : subtração; / : divisão; ***** : multiplicação; % : mod. O operador / realiza a divisão de inteiros se ambos os operandos forem números
inteiros; caso contrário, realiza a divisão por ponto flutuante. Por exemplo: void main() { float a; a=10/3; printf("%f\n",a); } Este código imprime um valor de ponto flutuante desde que a seja declarado como tipo float , mas a será 3.0 porque o código executou uma divisão de inteiros. A precedência de operador em C também é similar para a maioria das linguagens. A divisão e multiplicação ocorrem primeiro, depois a adição e a subtração. O resultado do cálculo 5+34 é 17, e não 32. Em C, o operador * tem precedência sobre o +. Você pode usar parênteses para alterar a ordem de precedência normal: (5+3)4 é 32. O 5+3 é executado primeiro porque está entre parênteses. Abordaremos a parte da precedência mais tarde, já que ela se torna um pouco complicada em C quando os ponteiros são introduzidos.
Conversão de tipo
A linguagem C permite executar conversões de tipo na sua execução. Você utiliza este recurso com freqüência ao usar ponteiros. A conversão de tipo também ocorre durante a operação de atribuição para determinados tipos. Por exemplo, no código acima, o valor inteiro foi automaticamente convertido para um flutuante. Você faz a conversão de tipo em C colocando o nome de tipo entre parênteses e colocando-o na frente do valor que deseja alterar. Assim, no código acima, ao substituir a linha a=10/3; por a=(float)10/3; produz 3.33333 como resultado, pois 10 é convertido em um valor de ponto flutuante antes da divisão.
Typedef
Você declara tipos nomeados e definidos pelo usuário em C com a instrução
typedef. O exemplo a seguir mostra um tipo que aparece freqüentemente no código C: #define TRUE 1 #define FALSE 0 typedef int boolean;
void main() { boolean b; b=FALSE;
i=i+3; i += 3; i=i*j; i *= j;
Tente isto
Erros que devem ser evitados na linguagem C Como descrito acima, o uso do operador / com 2 inteiros quase sempre produzirá um resultado inesperado, portanto pense bem ao utilizá-lo.
13 Funções
A maioria das linguagens permite criar funções de algum tipo. Funções permitem dividir um longo programa em seções nomeadas, de forma que as seções possam ser reutilizadas ao longo do programa. As funções aceitam parâmetros e retornam um resultado. Funções de C podem aceitar um número ilimitado de parâmetros. Em geral, a linguagem C não se preocupa em qual ordem você coloca suas funções no programa, contanto que o nome da função seja conhecido pelo compilador antes de ser invocado. Já falamos um pouco sobre funções. A função rand previamente descrita é bastante simples. Ela não aceita parâmetros e retorna um resultado inteiro: int rand() /* de K&R - produz um número aleatório entre 0 e 32767.*/ { rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } A linha int rand() declara a função rand para o resto do programa e especifica que aquele rand não aceitará nenhum parâmetro e retornará um resultado inteiro. Esta função não tem nenhuma variável local, mas se elas fossem necessárias, iriam logo abaixo da abertura {. A linguagem C permite declarar variáveis após qualquer { : elas existem até o programa atingir o } correspondente e então desaparecem. Desta forma, as variáveis locais de uma função desaparecem assim que o } correspondente é atingido na função. Enquanto existirem, as variáveis locais residem na pilha do sistema. Observe que não há nenhum ; depois de () na primeira linha. Caso tenha colocado um, acidentalmente, você receberá uma enorme cascata de mensagens de erro do compilador, que não farão sentido algum. Observe também que, mesmo sem parâmetros, você precisa usar o (). Eles indicam ao compilador que você está declarando uma função em vez de simplesmente declarar um int. A instrução return é importante para qualquer função que retorna um resultado. Ela especifica o valor que a função retornará e a encerra imediatamente. Isto significa que você pode colocar diversas instruções de retorno na função para proporcionar vários pontos de saída. Se você não colocar uma instrução de retorno em uma função, a função retorna quando atinge } e retorna um valor aleatório (muitos compiladores o advertirão se você não retornar um valor específico). Em C, uma função pode retornar valores de qualquer tipo: int, float, char, struct, etc.
Há vários modos corretos para executar a função rand. Por exemplo: x=rand();. A variável x recebe o valor retornado por rand nesta instrução. Observe que você deve usar () na chamada da função, mesmo que nenhum parâmetro seja passado. Caso contrário, x recebe o endereço de memória da função rand, que geralmente não é desejável. Você também pode invocar rand desta forma: if (rand() > 100) Ou deste modo: rand(); No último caso, a função é chamada, mas o valor retornado por rand é descartado. Talvez você nunca faça isso com rand, mas muitas funções retornam algum tipo de código de erro por meio da função, e se você não está muito preocupado com o código de erro (por exemplo, por saber que um erro é impossível), você poderá descartá-lo. Funções podem usar um retorno tipo void caso se deseje que não se retorne nada. Por exemplo: void print_header()
{ printf("Programa Número 1n"); printf("Programa Número 1n"); printf("Versão 1.0, lançada em 26/12/91\n"); } Esta função não retorna valor algum. Você pode invocá-la com a seguinte instrução: print_header(); Você deve incluir () na chamada. Se não o fizer, a função não é invocada, embora possa ser compilada corretamente em outros sistemas. As funções em C podem aceitar qualquer tipo de parâmetro. Por exemplo: int fact(int i) { int j,k; j=1; for (k=2; k<=i; k++) j=j*k; return j; } retorna o fatorial de i , que é passado como um parâmetro inteiro. Separe vários parâmetros
com vírgulas: int add(int i, int j) { return i+j; } A linguagem C evoluiu ao longo dos anos. Às vezes, você verá funções como add escritas do “modo antigo”, como mostrado abaixo: int add(i,j) int i; int j; { return i+j; }