




























































































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
programando em c
Tipologia: Notas de estudo
1 / 165
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































por David Menoti
Programação em C, David Menoti, PPGIA – PUCPR, 2003
Este curso tem como objetivo apresentar os conceitos básicos da linguagem de programação C. A linguagem de programação C possui tanto características de “baixo nível” quanto “alto nível”, sendo esta uma de suas maiores vantagens.
A linguagem Assembler , uma linguagem “imortal”, é recomendada para aplicações que exigem recursos de baixo nível e excelente desempenho. Enquanto que linguagens como Delphi e Visual Basic são indicadas para aplicações de alto nível, onde são necessários recursos que facilitem a geração de interface com o usuário. O que acontece, hoje, é que estão sendo construídas linguagens cada vez mais específicas para cada tipo de aplicação. Entretanto, a linguagem C é recomendada para o desenvolvimento de aplicações onde existe um balanço entre estes dois extremos, baixo nível e alto nível. Com isto a linguagem C está cada vez mais restrita, apesar de ter se tornado muito popular, a aplicações científicas ou a aplicações onde não existam linguagens específicas que facilitem a vida do programador.
O C é uma linguagem de programação genérica que é utilizada para a criação de programas diversos como processadores de texto, planilhas eletrônicas, sistemas operacionais, programas de comunicação, programas para a automação industrial, gerenciadores de bancos de dados, programas de projeto assistido por computador, programas para a solução de problemas da Engenharia, Física, Química e outras Ciências, etc ... É bem provável que o software que você usou para imprimir este texto tenha sido escrito em C ou C++.
Na atualidade, a maioria dos recursos de programação oferecidos, juntamente com o sistema operacional e o próprio compilador C, são implementados em C. Ressaltando-se que existem várias versões de compiladores C para os mais diversos sistemas operacionais.
Neste curso estudar-se-á a estrutura do ANSI C, o C padronizado pela ANSI ( American National Standards Institute ), aceito pela maioria dos compiladores. Serão apresentadas ainda algumas funções comuns em compiladores para alguns sistemas operacionais. Quando não houver equivalentes para as funções em outros sistemas, apresentar-se-á formas alternativas de uso dos comandos.
A linguagem C pertence a família de linguagem que tem como características a confiabilidade, a modularidade, recursos de baixo nível, a simplicidade, facilidade de uso e portabilidade.
Programação em C, David Menoti, PPGIA – PUCPR, 2003
Uma importante característica da linguagem C é que ela é sensível a escrita (do inglês Case Sensitive ), ou seja, letras maiúsculas e minúsculas fazem diferença. Quando se declara uma variável com o nome Contador , ela será diferente de contador , CONTADOR , CoNtAdOr e todas as demais variações possíveis da palavra contador que difiram de Contador. Da mesma maneira, os comandos do C for e while , por exemplo, só podem ser escritos em minúsculas pois caso contrário o compilador não irá interpretá-los como sendo comandos, mas sim como variáveis.
Uma particularidade interessante no programa C é seu aspecto modular e funcional, em que, o próprio programa principal é uma função. Esta forma de apresentação da linguagem facilita o desenvolvimento de programas, pois permite o emprego de formas estruturadas e modulares.
<definições de pré-processamento> <protótipos de funções> <declarações de variáveis globais> void main(void) { /* corpo da função principal, com declarações de suas variáveis, seus comandos e funções */ }
Figura 2-1 Estrutura de um programa em C Primeiramente, inserimos as definições de pré-processamento. Estas definições são aqueles comandos iniciados com o símbolo #. Estas definições são processadas, antes que a compilação do código realmente comece, daí vem-se o nome de definições de pré- processamento.
Programação em C, David Menoti, PPGIA – PUCPR, 2003
Os protótipos de funções que serão utilizadas no programa devem ser declarados 1 anteriormente da utilização das mesmas. Por exemplo, se a função main “precisa” de uma função que está definida abaixo da mesma, esta função deve ser declarada antes. Caso uma função invocada por uma função primeira não seja declarada antes desta função primeira o compilador C, dirá que a tal função invocada não foi declara/definida.
As variáveis que são declaradas fora do corpo de funções são tidas como variáveis globais. Estas variáveis são “vistas” por todas as funções.
A função main é uma função que deve existir em todo programa escrito em C. Já a sintaxe apresentada neste exemplo, diz que esta função tanto receberá um parâmetro vazio^2 ( void ) quanto retornará um valor vazio.
As demais funções são definidas da forma como se apresenta na Figura 2-1. Primeiramente o tipo de retorno é declarado, depois se deve declarar o nome da função, seguido de seus parâmetros.
Cada parâmetro contido na lista de parâmetros deve ser declarado, antes da abertura de chave {. Podemos também declarar os parâmetros na própria lista de parâmetros. Isto será mais bem evidenciado quando estivermos estudando as funções em C.
Vale lembrar que a estrutura na Figura 2-1 não é fixa, apesar de ser recomendada. A estrutura pode ser alterada dependendo da experiência do programador.
2.3.1 Primeiro programa
O primeiro, e mais simples, programa em C apresentado neste curso é mostrado abaixo:
#include <stdio.h> /* Um Primeiro Programa */ int main () { printf ("Oi mundo!\n"); return(0); }
(^1) É importante salientar a diferença entre declaração e definição de função. Uma função primeiramente é declarada, depois ela é definida, ou seja, implementada. Nada, porém, impede que a mesma seja declara e definida juntamente. (^2) Podemos entender também vazio ( void) como sendo nada (inexistência).
Programação em C, David Menoti, PPGIA – PUCPR, 2003
2.3.2 Segundo programa
Vejamos agora um programa mais complicado:
#include <stdio.h> int main () { int Dias; /* Declaracao de Variaveis / float Anos; printf ("Entre com o número de dias: "); / Entrada de Dados / scanf ("%d",&Dias); Anos=Dias/365.25; / Conversao Dias->Anos */ printf ("\n\n%d dias equivalem a %f anos.\n",Dias,Anos); return(0); } Vamos entender como o programa acima funciona. São declaradas duas variáveis chamadas Dias e Anos. A primeira é um int (inteiro) e a segunda um float (ponto flutuante). As variáveis declaradas como ponto flutuante existem para armazenar números que possuem casas decimais, como 5,1497.
É feita então uma chamada à função printf() , que coloca uma mensagem na tela. Queremos agora ler um dado que será fornecido pelo usuário e colocá-lo na variável inteira Dias. Para tanto usamos a função scanf(). A string "%d" diz à função que iremos ler um inteiro. O segundo parâmetro passado à função diz que o dado lido deverá ser armazenado na variável Dias. É importante ressaltar a necessidade de se colocar um & antes do nome da variável a ser lida quando se usa a função scanf(). O motivo disto só ficará claro mais tarde. Observe que, no C, quando temos mais de um parâmetro para uma função, eles serão separados por vírgula.
Temos então uma expressão matemática simples que atribui a Anos o valor de Dias dividido por 365.25 (365.25 é uma constante do tipo ponto flutuante 365,25). Como Anos é uma variável float o compilador fará uma conversão automática entre os tipos das variáveis (veremos isto com detalhes mais tarde).
A segunda chamada à função printf() tem três argumentos. A string "\n\n%d dias equivalem a %f anos.\n" diz à função para pular duas linhas, colocar um inteiro na tela, colocar a mensagem " dias equivalem a " , colocar um valor float na tela, colocar a mensagem " anos." e pular outra linha. Os outros parâmetros são as variáveis, Dias e Anos , das quais devem ser lidos os valores do inteiro e do float , respectivamente.
Programação em C, David Menoti, PPGIA – PUCPR, 2003
O que faz este programa?
#include <stdio.h> int main() { int x; scanf("%d",&x); printf("%d",x); return(0); }
Uma função é um bloco de código de programa que pode ser usado diversas vezes em sua execução. O uso de funções permite que o programa fique mais legível, mais bem estruturado. Um programa em C consiste, no fundo, de várias funções colocadas juntas.
Abaixo o tipo mais simples de função:
#include <stdio.h>
int mensagem () /* Funcao simples: so imprime Ola! */ { printf ("Ola! "); return(0); }
int main () { mensagem(); printf ("Eu estou vivo!\n"); return(0); } Este programa terá o mesmo resultado que o primeiro exemplo da seção anterior (2.3.1). O que ele faz é definir uma função mensagem() que coloca uma string na tela e retorna 0. Esta função é chamada a partir de main() , que, como já vimos, também é uma função. A diferença fundamental entre main e as demais funções do problema é que main é uma função especial, cujo diferencial é o fato de ser a primeira função a ser executada em um programa.
2.4.1 Argumentos
Argumentos são as entradas que a função recebe. É através dos argumentos que passamos parâmetros para a função. Já vimos funções com argumentos. As funções printf() e scanf() são funções que recebem argumentos. Vamos ver um outro exemplo simples de função com argumentos: #include <stdio.h>
Programação em C, David Menoti, PPGIA – PUCPR, 2003
2.4.2 Retornando valores
Muitas vezes é necessário fazer com que uma função retorne um valor. As funções que vimos até aqui estavam retornando o número 0. Podemos especificar um tipo de retorno indicando-o antes do nome da função. Mas para dizer ao C o que vamos retornar precisamos da palavra reservada return. Sabendo disto fica fácil fazer uma função para multiplicar dois inteiros e que retorna o resultado da multiplicação. Veja: #include <stdio.h> int prod (int x,int y) { return (x*y); }
int main () { int saida; saida=prod (12,7); printf ("A saida e: %d\n",saida); return(0); } Veja que, como prod retorna o valor de 12 multiplicado por 7, este valor pode ser usado em uma expressão qualquer. No programa fizemos a atribuição deste resultado à variável saida, que posteriormente foi impressa usando o printf. Uma observação adicional: se não especificarmos o tipo de retorno de uma função, o compilador C automaticamente suporá que este tipo é inteiro. Porém, não é uma boa prática não se especificar o valor de retorno e, neste curso, este valor será sempre especificado.
Com relação à função main, o retorno sempre será inteiro. Normalmente faremos a função main retornar um zero quando ela é executada sem qualquer tipo de erro.
Mais um exemplo de função, que agora recebe dois floats e também retorna um float:
#include <stdio.h> float prod (float x,float y) { return (x*y); }
int main () { float saida; saida=prod (45.2,0.0067); printf ("A saida e: %f\n",saida); return(0); }
Programação em C, David Menoti, PPGIA – PUCPR, 2003
2.4.3 Forma geral
Apresentamos aqui a forma geral de uma função: tipo_de_retorno nome_da_função (lista_de_argumentos) { código_da_função }
Veja como você está. Escreva uma função que receba e some (a função deve somente fazer o cálculo) dois inteiros e retorne o valor da soma.
2.5.1 Caracteres
Os caracteres são um tipo de dado: o char. O C trata os caracteres ('a', 'b', 'x', etc ...) como sendo variáveis de um byte (8 bits). Um bit é a menor unidade de armazenamento de informações em um computador. Os inteiros ( int s) têm um número maior de bytes. Dependendo da implementação do compilador, eles podem ter 2 bytes (16 bits) ou 4 bytes ( bits). Isto será melhor explicado nos capítulos posteriores. Na linguagem C, também podemos usar um char para armazenar valores numéricos inteiros, além de usá-lo para armazenar caracteres de texto. Para indicar um caractere de texto usamos apóstrofes. Veja um exemplo de programa que usa caracteres: #include <stdio.h> int main () { char Ch; Ch='D'; printf ("%c",Ch); return(0); } No programa acima, %c indica que printf() deve colocar um caractere na tela. Como vimos anteriormente, um char também é usado para armazenar um número inteiro. Este número é conhecido como o código ASCII correspondente ao caractere. Veja o programa abaixo:
#include <stdio.h> int main () { char Ch; Ch='D'; printf ("%d",Ch); /* Imprime o caracter como inteiro */
Programação em C, David Menoti, PPGIA – PUCPR, 2003
um caractere com valor inteiro igual a zero (código ASCII igual a 0). O terminador nulo também pode ser escrito usando a convenção de barra invertida do C como sendo '\0'. Embora o assunto vetores seja discutido posteriormente (5.2), veremos aqui os fundamentos necessários para que possamos utilizar as strings. Para declarar uma string, podemos usar o seguinte formato geral: char nome_da_string[tamanho]; Isto declara um vetor de caracteres (uma string) com número de posições igual a tamanho. Note que, como temos que reservar um caractere para ser o terminador nulo, temos que declarar o comprimento da string como sendo, no mínimo, um caractere maior que a maior string que pretendemos armazenar. Vamos supor que declaremos uma string de 7 posições e coloquemos a palavra João nela. Teremos:
J o a o \ ... ... No caso acima, as duas células não usadas têm valores indeterminados. Isto acontece porque o C não inicializa variáveis, cabendo ao programador esta tarefa. Portanto as únicas células que são inicializadas são as que contêm os caracteres 'J', 'o', 'a', 'o' e '\0'.
Se quisermos ler uma string fornecida pelo usuário podemos usar a função gets(). Um exemplo do uso desta função é apresentado abaixo. A função gets() coloca o terminador nulo na string, quando você aperta a tecla "Enter".
#include <stdio.h> int main () { char string[100]; printf ("Digite uma string: "); gets (string); printf ("\n\nVoce digitou %s",string); return(0); } Neste programa, o tamanho máximo da string que você pode entrar é uma string de 99 caracteres. Se você entrar com uma string de comprimento maior, o programa irá aceitar, mas os resultados podem ser desastrosos. Veremos porque posteriormente.
Como as strings são vetores de caracteres (5.2), para se acessar um determinado caractere de uma string, basta "indexarmos", ou seja, usarmos um índice para acessarmos o caractere desejado dentro da string. Suponha uma string chamada str. Podemos acessar a segunda letra de str da seguinte forma:
str[1] = 'a';
Programação em C, David Menoti, PPGIA – PUCPR, 2003
Por quê se está acessando a segunda letra e não a primeira? Na linguagem C, o índice começa em zero. Assim, a primeira letra da string sempre estará na posição 0. A segunda letra sempre estará na posição 1 e assim sucessivamente. Segue um exemplo que imprimirá a segunda letra da string "Joao", apresentada acima. Em seguida, ele mudará esta letra e apresentará a string no final.
#include <stdio.h> int main() { char str[10] = "Joao"; printf("\n\nString: %s", str); printf("\nSegunda letra: %c", str[1]); str[1] = 'U'; printf("\nAgora a segunda letra eh: %c", str[1]); printf("\n\nString resultante: %s", str); return(0); } Nesta string, o terminador nulo está na posição 4. Das posições 0 a 4, sabemos que temos caracteres válidos, e portanto podemos escrevê-los. Note a forma como inicializamos a string str com os caracteres 'J' 'o' 'a' 'o' e '\0' simplesmente declarando char str[10] = "Joao". Veremos, posteriormente que "Joao" (uma cadeia de caracteres entre aspas) é o que chamamos de string constante, isto é, uma cadeia de caracteres que está pré-carregada com valores que não podem ser modificados. Já a string str é uma string variável, pois podemos modificar o que nela está armazenado, como de fato fizemos.
No programa acima, %s indica que printf() deve colocar uma string na tela. Vamos agora fazer uma abordagem inicial às duas funções que já temos usado para fazer a entrada e saída.
2.5.3 printf
A função printf() tem a seguinte forma geral: printf (string_de_controle,lista_de_argumentos); Teremos, na string de controle, uma descrição de tudo que a função vai colocar na tela. A string de controle mostra não apenas os caracteres que devem ser colocados na tela, mas também quais as variáveis e suas respectivas posições. Isto é feito usando-se os códigos de controle, que usam a notação %. Na string de controle indicamos quais, de qual tipo e em que posições estão as variáveis a serem apresentadas. É muito importante que, para cada código de controle, tenhamos um argumento na lista de argumentos. Apresentamos agora alguns dos códigos % :