

























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 C
Tipologia: Notas de estudo
Compartilhado em 29/08/2010
4.3
(3)24 documentos
1 / 33
Esta página não é visível na pré-visualização
Não perca as partes importantes!


























Algoritmos e Lógica de Programação
Linguagem C
Prof. João Carlos Scudeller
A linguagem C foi desenvolvida por Dennis M. Ritchie e Brian W. Kerninghan a partir das linguagens BCPL e B. Sua primeira utilização importante foi reescrever o siste- ma UNIX no centro de pesquisa da Bell Laboratories em 1972.
ANSI C (American National Standards Institute) é a versão da linguagem C padro- nizada em 1989 nos EUA e no mundo através da ISO(International Standard Organization).
C++ é uma linguagem derivada da linguagem C. O conjunto de instruções que faz parte da linguagem C também faz parte da linguagem C++. Isto quer dizer que qualquer programa C compilado no padrão ANSI também pode ser compilado em C++, ou seja, eles são compatíveis.
main() { instruções }
Todo programa C é constituído de diversas funções e deve, obrigatoriamente, ter uma função chamada de main. Esta é a função que será executada em primeiro lugar, inde- pendente do lugar onde esteja localizada.
Todo programa C inclui chamada a várias funções contidas na biblioteca C padrão. Todo compilador C vem com uma biblioteca C padrão de funções que realizam tarefas ne- cessárias mais comuns.
Para que um programa C funcione é necessário incluir essas bibliotecas na compila- ção do programa fonte. Isto é feito através da diretiva #include
As bibliotecas mais comuns que devemos inserir em nossos programas são: #include <conio.h> #include <stdio.h>
Em C, os nomes de variáveis e funções definidos pelo usuário são chamados de i- dentificadores. Eles podem ter de um a vários caracteres (o padrão ANSI determina que
pelo menos os trinta e um (31) primeiros caracteres devem ser significativos). O primeiro caractere deve ser uma letra ou um sublinhado e os caracteres seguintes devem ser letras, números ou sublinhados.
Em C, letras minúsculas e maiúsculas são tratadas de modo diferente. Assim, raio, Raio e RAIO são três identificadores distintos. Normalmente todo programador C usa le- tras minúsculas para dar nome a identificadores e, letras maiúsculas para dar nome a cons- tantes.
Em C existem palavras ditas reservadas, ou palavras-chave, isto é, não podemos ter um identificador com um desses nomes. As palavras chaves da linguagem C são:
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while
Quando declaramos um identificador damos a ele um tipo. Há cinco tipos básicos de dados em C: caractere, inteiro, ponto flutuante, ponto flutuante de precisão dupla e sem valor ( char, int, float, double, void ). Existem outros tipos de dados derivados desses cin- co tipos. O tamanho e a faixa desses tipos de dados variam de acordo com o tipo de pro- cessador e com a implementação do compilador C. Um caractere ocupa geralmente 1 byte e um inteiro tem normalmente 2 bytes. O tipo void não representa valor nenhum.
A tabela abaixo lista todos os tipos de dados definidos no padrão ANSI
Tipo Tamanho apro- ximado em bits
Faixa mínima
Char 8 -127 a 127 unsigned char 8 0 a 255 signed char 8 -127 a 127 Int 16 -32767 a 32767 unsigned int 16 0 a 65535 signed int 16 O mesmo que int short int 16 O mesmo que int unsigned short int 16 0 a 65535 signed short int 16 O mesmo que short int long int 32 -2147483647 a 2147483647
math.h M_LOG2E 1.44269504... log de e na base 2 math.h M_LOG10E 0.434294481.. log decimal de e math.h M_LN2 0.693147180.. log natural de 2 math.h M_LN10 2.302585092.. log natural de 10 conio.h BLACK 0 cor preta conio.h BLUE 1 cor azul conio,h GREEN 2 cor verde conio.h CYAN 3 cor ciano conio.h RED 4 cor vermelho conio.h MAGENTA 5 cor magenta conio.h BROWN 6 cor marrom conio.h LIGTH- GRAY
7 cor cinza claro
conio.h DARK- GRAY
8 cor cinza escuro
conio.h LIGHTBLUE 9 cor azul claro conio.h LIGHTGRE- EM
10 cor verde claro
conio.h LIGHTC- YAN
11 cor ciano claro
conio.h LIGHTRED 12 cor vermelho cla- ro conio.h LIGHTMA- GENTA
13 cor magenta claro
conio.h YELLOW 14 cor amarelo conio.h WHITE 15 cor branca conio.h BLINK 128 piscante
O C, como qualquer outra linguagem, permite que se coloque comentários dentro do programa com o propósito de documentá-lo para um melhor entendimento futuro. Os co- mentários podem ser feitos de duas maneiras diferentes: quando ele for de uma única linha ela deve começar por duas barras (//) seguido do comentário; quando for composto por vá- rias linhas começa pelo para de caracteres /* e termina com */. Não deve haver espaços entre o asterisco e a barra.
// isto é um comentário de uma linha /* isto é um comentário distribuído em mais de uma linha */ O compilador ignora qualquer texto entre os símbolos de comentário. Use-os sem medo nos seus programas para torná-lo mais legível futuramente.
O comando de atribuição é efetuado com o sinal de igual (=) e tem a forma: Identificador = expressão Obs: o operador de atribuição (=) pode ser utilizado em expressões que também en- volvem outros operadores, como veremos mais adiante.
Os operadores aritméticos são:
Operador Ação Operador Ação
−= subtração e atribuição
++ Incremento
a += 2; equivalente a a = a + 2; a −= 3; equivalente a a = a − 3; y *= z + 2; equivalente a y = y * (z + 2);
x++; equivalente a x = x + 1; ++x; equivalente a x = x + 1; x−− equivalente a x = x − 1; −−x; equivalente a x = x – 1;
Ambos os operadores de incremento e decremento podem ser utilizados como prefi- xo ou sufixo do operando, porém, há uma diferença quando esses operadores são usados em uma expressão. Quando o operador de incremento ou decremento precede seu operando, C executa a operação de incremento ou decremento antes de usar o valor do operando. Se o operador estiver após seu operando, C usará o valor do operando antes de incrementá-lo ou decrementá-lo.
x = 10; y = ++x; coloca o valor 11 em y. Porém, se o código fosse escrito como: x = 10; y = x++ y receberia o valor 10. Em ambos os casos x recebe 11;
Maior!
= < <= == != && Menor ||
Como no caso das expressões aritméticas, é possível usar parênteses para alterar a ordem natural de avaliação de uma expressão relacional e/ou lógica.
Por exemplo:
!0 && 0 || 0 é falso. Porém, quando utilizamos parênteses, como abaixo, o resultado é verdadeiro.
! (0 && 0 || 0)
Podemos forçar uma expressão a ser de um determinado tipo usando o operador cast. A forma genérica de um cast é:
(tipo) expressão
onde tipo é qualquer tipo de dados válido em C. Por exemplo, para garantir que a expres- são x/2 resulte em um valor do tipo float , devemos escrever:
(float) x/2;
A tabela abaixo lista a precedência de todos os operadores C vistos até agora.
Maior!^ ++^ −−
Quando constantes e variáveis de tipos diferentes são misturados em uma expressão, elas são convertidas a um mesmo tipo, de acordo com as regras abaixo:
SE um operando é long double ENTÃO o segundo é convertido para long double SENÃO, SE um operando é double ENTÃO o segundo é convertido para double SENÃO, SE um operando é float ENTÃO o segundo é convertido para float SENÃO, SE um operando é unsigned long ENTÃO o segundo é convertido para unsigned long SENÃO, SE um operando é long ENTÃO o segundo é convertido para long SENÃO, SE um operando é unsigned int ENTÃO o segundo é convertido para unsigned int
As principais funções matemáticas utilizadas em nossos programas são listadas a- baixo.
Biblioteca Função Descrição Tipo stdlib.h abs(x) Valor absoluto de e int math.h acos(x) Arco co-seno de x double math.h asin(x) Arco seno de x double math.h atan(x) Arco tangente de x double math.h ceil(x) Arredonda um número real para cima
int
math.h cos(x) Co-seno de x double math.h exp(x) Número “e” elevado a x double math.h fabs(x) Valor absoluto de x double math.h floor(x) Arredonda um número real para baixo
int
math.h log(x) Logaritmo natural de x double math.h log10(x) Logaritmo de x na base 10 double math.h pow(y,x) Calcula y elevado a x double math.h sin(x) Seno de x double math.h sqrt(x) Raiz quadrada de x double
As funções para trabalhar com caractere estão no cabeçalho CTYPE.H.
Nome Descrição isalnum(ch) Retorna diferente de 0 se ch for alfabético ou numérico, caso contrário re- torna 0 isalpha(ch) Retorna diferente de 0 se ch for alfabético(letra), caso contrário retorna 0
Sintaxe: printf (“expressão de controle”,argumentos)
A função printf() escreve na tela os argumentos a ela passados formatados de acor- do com a expressão de controle , conforme a tabela abaixo:
Código Formato Código Formato %c Caractere simples %p Ponteiro %d Decimal %% Símbolo % %e Notação científica \n Nova linha %f Ponto flutuante \t Tabulação %o Octal \b Retrocesso %s String \” Aspas %u Decimal sem sinal \ Barra %x Hexadecimal minúsculos \f Salta formulário %X Hexadecimal maiúsculos \0 Nulo
Exemplo:
printf(“Escrevendo o numero dois %d”,2);
printf(“\n%s esta a %d milhões de milhas \n do Sol”,”Venus”,67);
O número colocado entre o símbolo % e o código de formato age como um especi- ficador de largura mínima de campo, preenchendo a saída com espaços. Se a string, ou o número, for maior que o mínimo, ela será escrita por inteiro.
printf(“\n%6d”,470);
O especificador de precisão aplicado a dados de ponto flutuante determina o número de casas decimais mostrado. Por exemplo, %10.4f mostra o número com pelo menos dez caracteres com quatro casas decimais.
Aplicado a strings, o especificador de precisão determina o comprimento máximo do campo. Por exemplo, %5.7s mostra uma string de pelo menos cinco e não excedendo sete caracteres.
Quando aplicado a números inteiros determina o número mínimo de dígitos que a- parecerão para cada número. Zeros iniciais serão adicionados para completar o número so- licitado de dígitos.
Sintaxe: scanf (“expressão de controle”,argumentos)
scanf () é uma função de entrada de dados pelo teclado, complemento de printf(), que nos permite ler dados formatados. A lista de argumentos deve consistir nos endereços das variáveis referenciado pelo símbolo &.
A expressão de controle inicia-se pelo caractere % seguido por um caractere que de- termina o tipo de dado a ser lido, conforme tabela apresentada na função printf().
Exemplo: scanf(“%d”,&numero);
Muitos programas em C contam com um teste condicional que determina o curso de uma ação, chegando a um valor verdadeiro (diferente de zero) ou falso (igual a zero).
Sintaxe: if ( expressão ) comando 1 ; else comando 2 ;
onde comando 1 e comando 2 pode ser um único ou um bloco de comandos. A cláusula else é opcional.
Se a expressão for avaliada como verdadeira (diferente de zero), o comando ou blo- co que forma o corpo do if é executado; caso contrário, o comando ou bloco que é o corpo do else, se ele existir, é executado. Nunca ambos serão executados.
Uma construção comum em programação é a forma if-else-if , algumas vezes cha- mada de escada if-else-if devido a sua aparência. A sua forma geral é:
if (expressão) comando ; else if ( expressão) comando; else if (expressão) comando;
... else comando;
As condições são avaliadas de cima para baixo. Assim que uma condição verdadei- ra é encontrada, o comando a ela associado é executado e desvia o resto da escada. Se ne- nhuma das condições é verdadeira, então o último else é executado.
A inicialização é um comando de atribuição que é usado para colocar um valor na variável de controle do laço. A condição é uma expressão relacional que determina quando o laço acaba. O incremento define como a variável de controle do laço varia cada vez que o laço é repetido. Essas três seções são separadas por pontos-e-vírgulas.
for (x = 1; x <= 100; x++) printf(“%d”,x); O laço for permite que mais de uma variável controlem o laço. No exemplo abaixo, as variáveis x e y controlam o laço, e ambas são inicializadas dentro do comando for :
for (x = 0, y = 0; x+y < 10; x++) { ... }
while ( condição) comando; onde comando é um comando vazio, um comando simples ou um bloco de comandos e a condição pode ser qualquer expressão. O laço se repete enquanto a condição for verdadei- ra. Quando a condição for falsa o controle do programa passa para a linha após o código do laço.
O laço abaixo imprime todos os valores de x de 0 até 10. x = 0; while (x <= 10) { printf(“%d”,x); x++ }
O laço do-while verifica a condição no final do laço, ao contrário dos laços for e while que verificam no inicio. Isso significa que o laço do-while sempre será executado ao menos uma vez.
do { comando; } while ( condição); O laço do-while repete até que a condição se torne falsa. O laço abaixo lerá números do teclado até que encontre um valor menor ou igual a
do { scanf(“%d”,num); } while (num > 100);
O comando break tem dois usos, um para terminar um case em um comando swit- ch, e outro para usá-lo para forçar uma terminação imediata de um laço, evitando o teste condicional normal do laço.
Quando o comando break é encontrado dentro de um laço, ele é imediatamente terminado e o controle do programa retorna no comando seguinte ao laço.
x = 0; while (x <= 10) { if x = 5 break; x++ }
O comando continue trabalha de forma parecida ao break, porém, ao invés de ter- minar o laço ele força para que ocorra a próxima iteração do laço, pulando qualquer código intermediário. Para o laço for , continue faz com que o teste condicional e a porção de in- cremento do laço sejam executados. Para os laços while e do-while , o controle do progra- ma passa para o teste condicional.
for (x=0; x<100; x++) { if (x % 2) continue printf(“%d\n”,x); }
Matriz é uma coleção de variáveis do mesmo tipo que é referenciada por um nome comum. Um elemento específico em uma matriz é acessado por meio de um índice. O endereço mais baixo corresponde ao primeiro elemento e o mais alto, ao último elemento. Matrizes podem ter de uma a várias dimensões.
A forma geral para declarar um vetor é: tipo nome_variavel[tamanho]; onde tipo declara o tipo de base do vetor, nome_variavel é o nome do vetor e tama- nho é o número de elementos que o vetor irá guardar. Para declarar um vetor de nome notas , do tipo real com 20 elementos float notas[20]; Em C, toda matriz tem 0 (zero) como o índice do seu primeiro elemento. Portanto, com a declaração acima estamos informando que o vetor notas tem 20 elementos, notas[0] até notas[19].
res que se deseja. Strings são uma lista de caracteres que aparecem entre aspas, não sendo necessário colocar o \0, que é colocado automaticamente pelo compilador.
Para declarar uma matriz str que guarda uma string de 30 caracteres, escreveríamos: char str[31]; A inicialização de uma string pode ser feita das seguintes maneiras: char nome[15] = “Mario”; char nome[15] = {‘M’,’a’,’r’,’i’,’o’}; char nome[] = “Mario”; Observe que na segunda forma de declaração, cada caractere foi colocado entre a- póstrofo e não entre aspas. Na terceira forma de declaração o próprio compilador calcula o tamanho da string. Em todas as declarações o próprio compilador coloca o caractere nulo (\0) no final da string.
C possui um grande número de funções para trabalhar com string, todas elas usam o cabeçalho padrão STRING.H. As principais são:’
strcat(s1,s2) – acrescenta a cadeia s2 ao final da cadeia s1. O compilador não veri- fica o tamanho da string s1. O usuário deve garantir que s1 seja suficientemente grande para armazenar o seu conteúdo original e o de str2.
strchr(s1,ch) – devolve um ponteiro para a primeira ocorrência de ch em s1. De- volve NULL se ch não está em s1.
strcmp(s1,s2) – compara a string s1 com a string s2. Devolve 0 (zero) se as duas cadeias forem iguais, um valor menor que zero (<0) se s1 < s2, e um valor maior que zero (>0) se s1 > s2. Esta função diferencia letras maiúsculas das minúsculas.
strcpy(s1,s2) – copia o conteúdo de s2 em s1. O conteúdo de s1, se houver, será perdido.
strncpy(s1,s2,n) – copia os primeiros “n” caracteres da string s2 para a string s1. strlen(s1) – devolve o tamanho, isto é, o número de caracteres da string s1. strncat(s1,s2,n) – acrescenta os “n” primeiros caracteres da string s2 na string s1. strstr(s1,s2) – procura a primeira ocorrência de s2 em s1. strrev(s1) – inverte a ordem dos caracteres da cadeia s1, isto é, escreve a cadeia s de traz para frente.
strupr(s1) – converte as letras minúsculas de s1 para maiúsculas. strlwr(s1) – converte as letras maiúsculas de s1 para minúsculas. atoi(s1) – converte a cadeia de caracteres numéricos s1 em um valor numérico intei- ro. Se não for possível fazer a conversão a função devolve o valor zero (0).
atof(s1) – converte a cadeia de caracteres numéricos s1 em um valor numérico de ponto flutuante (real). A cadeia de caracteres deve possuir uma representação de caracteres de um número de ponto flutuante.
As funções atoi e atof necessitam do cabeçalho stdlib.h para trabalharem. Obs: a leitura de uma string deve ser feita com a função gets e não com a função scanf , pois esta lê até o primeiro caractere em branco, desprezando os demais.
O correto entendimento e uso de ponteiros é crítico para uma programação bem su- cedida em C. Há três razões para isso: ponteiros fornecem os meios pelos quais as funções podem modificar seus argumentos; eles são usados para suportar as rotinas de alocação dinâmica de C; o uso de ponteiros pode aumentar a eficiência de certas rotinas.
Um ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente a posição de uma outra variável de memória. Se uma variável contém o ende- reço de uma outra, então a primeira variável é chamada para apontar para a segunda.
Uma variável que irá conter um ponteiro deve ser declarada como tal. A declaração consiste no tipo de base, um asterisco (*) e o nome da variável.
tipo *nome;
onde tipo é qualquer tipo válido em C e nome é o nome da variável ponteiro.
Existem dois operadores especiais para ponteiros ***** e &. O & é um operador unário que devolve o endereço na memória do seu operando.
m = &maior
coloca em m o endereço da memória que contém a variável maior. O endereço não tem relação alguma com valor de maior. O comando de atribuição acima pode ser entendido como “ m recebe o endereço de maior”.
Para entender melhor a atribuição anterior, assuma que a variável maior usa a posi- ção de memória 1500 para guardar o seu valor. Assuma também que maior tem o valor
O segundo operador de ponteiro, ***** é o complemento de &. É um operador unário que devolve o valor da variável localizada no endereço que o segue.
q = *m;
coloca o valor de maior em q. Portanto, q terá o valor 350 porque este valor estava arma- zenado na posição 1500, que é o endereço que estava armazenado em m. Podemos enten- der a atribuição acima como “ q receber o valor que está no endereço m ”.
m maior 1500 350 100 101 102... 1500 1501 1502...