FUNDAMENTOS PRÁTICOS
A linguagem de programação denominada C foi criada em 1972 por Dennis Ritchie no centro de Pesquisas da Bell Laboratories. Sua primeira utilização marcante foi a reescrita do Sistema Operacional UNIX, que até então era escrito na linguagem Assembly.
Em meados da década de 70 o sistema operacional UNIX deixou o laboratório para ser utilizado nas universidades. Foi o suficiente para que o sucesso da linguagem atingisse grandes proporções na área de informática. Por volta do ano de 1980, já existiam várias versões de compiladores C disponíveis no mercado. Com isso a linguagem C não estava mais restrita somente ao ambiente operacional UNIX, mas já era utilizado por outros sistemas operacionais.
A linguagem C é uma ferramenta de propósito geral, constituindo-se ainda em uma ferramenta poderosa no desenvolvimento de programas em diversos paradigmas de programação. No entanto é mais utilizada na construção de compiladores, analisadores léxicos, bancos de dados, editores de texto, entre outras aplicações. Veja a seguir alguns exemplos de aplicações desenvolvidas com esta linguagem:
Sistema Operacional |
|
||
Banco de dados |
|
||
Planilhas eletrônicas | Excel | ||
Aplicações gráficas | Efeitos Especiais em filmes como: Star Trek e Star Wars |
A Linguagem C é de alto nível, pois seus programas são elaborados por meio de instruções próximas a linguagem de comunicação usada pelo ser humano (comunicação natural), mas pode ser considerada de nível intermediário. Essa classificação também considera a possibilidade que esta linguagem tem de efetuar a codificação mais próxima da linguagem de máquina ou binária (baixo nível), otimizando alguns programas que precisam de manipulações e acessos muito específicos e dinâmicos. Observe a seguir as indicações relativas ao nível de classificação para algumas linguagens:
A Linguagem C é "Case Sensitive", ou seja, as letras maiúsculas e minúsculas são manipuladas como símbolos completamente diferentes. Suponha a necessidade de armazenamento da idade, em anos, de uma pessoa. Para isso será necessário criar uma variável no bloco de declarações deste programa, sendo nele incluída a seguinte instrução:
Por meio desta declaração foi criada uma única variável, com o tipo de dado inteiro, que recebeu o nome de identificação IDADE. Esta variável seria completamente diferente de outra que se chamasse idade ou iDaDe, pois as letras que compõem o seu nome estão diferentemente definidas em letras maiúsculas e minúsculas. Sendo assim, estas três variáveis poderiam ser declaradas em um mesmo programa, não ocasionando nenhum tipo de erro de compilação, pois elas são completamente diferentes. Mas este tipo de declaração não é aconselhada porque pode dificultar a compreensão do programador sobre a ação realizada pelo código proposto.
As palavras reservadas nesta linguagem são escritas sempre em letras minúsculas, o que pode ocasionar erros, caso este cuidado não seja observado. Por exemplo, a declaração da variável IDADE não seria possível porque o tipo de dado especificado não existe.
O tipo de dado inteiro é descrito por meio da palavra reservada inteiro, descrita corretamente em minúsculo, sendo a grafia proposta no exemplo anterior muito diferente da reconhecida por esta linguagem.
Uma palavra reservada, em uma linguagem de programação, já possui um significado definido na linguagem, não podendo ser utilizada para criação de outros objetos, tais como variáveis, constantes ou subprogramas, pois não permitirá a correta execução da tarefa solicitada ao computador.
A Linguagem C possui 32 palavras reservadas, de acordo com o padrão definido pela American National Standards Institute (ANSI). Acompanhe a grafia correta de cada uma delas na relação apresentada a seguir :
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 |
Um programa em C é formado por no mínimo um subprograma, sendo este obrigatório para a criação de um programa. Este subprograma consiste de uma função específica, sendo a única a possuir um nome já definido - main (principal). É por meio dela que um programa é executado, e sua ausência não caracteriza a existência de um programa em C, mas um código escrito na linguagem C que não pode ser executado. Para a execução do mesmo é necessária a elaboração da função principal.
Outros subprogramas podem ser desenvolvidos pelo programador, atendendo as necessidades que este tenha no desenvolvimento do seu programa, mas entre estes subprogramas um será a função principal. Somente ela possui um nome já definido (main), tendo todos os outros subprogramas seus nomes especificados pelo programador, respeitando sempre as regras de fornecimento de nomes aos identificadores.
A utilização de comentários na elaboração de programas permite uma compreensão mais rápida das tarefas realizadas pelo programa, principalmente quando são desenvolvidos códigos extensos. Em C, os comentários começam com /* e terminam com */, mantendo-se todas as linhas existentes entre este início (/*) e fim (*/) de comentário como informações que não serão usadas pelo compilador, mas que auxiliam na correta compreensão do programador. O uso de // também insere um comentário no programa, sendo este iniciado a partir do código (//) e se estendendo até o final da linha onde ele se encontra, por exemplo:
/* SÍNTESE Objetivo: Saudar o usuário Entrada: Nenhuma Saída: Mensagem de saudação */ #include <stdio.h> // instrução da linguagem C void main (void) // instrução da linguagem C { // DECLARAÇÕES // INSTRUÇÕES printf("Olá usuário!!!"); // instrução da linguagem C }
Assim como na elaboração do algoritmo, os programas em C também são desenvolvidos por meio de alguns blocos lógicos principais (síntese, declarações, instruções), sendo todos eles destinados a uma organização coerente na codificação desejada. Respeitando esta organização, será elaborado um código eficiente por um programador organizado que não tem dificuldades na manipulação e manutenção dos seus programas.
A construção da síntese deve ser cuidadosa, pois ela é exatamente o algoritmo, ou melhor, a síntese dele.
Na construção dos algoritmos as palavras reservadas início e fim representam o começo e o término deste bloco. Cada instrução também é encerrada por meio de uma pontuação específica, sendo normalmente utilizado o ponto e vírgula (;).
O desenvolvimento dos programas em C possuem as mesmas regras, porém a grafia ou os símbolos são diferentes. O bloco é iniciado pelo símbolo de abertura de chaves ({) e encerrado pelo fechamento da mesma (}), enquanto cada instrução é terminada também pelo ponto e vírgula (;).
Observe o exemplo a seguir:
/* SÍNTESE Objetivo: Saudar o usuário Entrada: Nenhuma Saída: Mensagem de saudação */ #include <stdio.h> // instrução da linguagem C void main (void) // instrução da linguagem C { // DECLARAÇÕES // INSTRUÇÕES printf("Olá usuário!!!"); //instrução da linguagem C printf("Seja bem vindo ao Curso de C"); }
Ao se declarar um objeto (constante, variável, função) é necessário identificar qual o tipo de informação que ele manipulará , pois é através dessa declaração que o computador poderá verificar a existência e a disponibilidade de espaço suficiente para que o programa possa ser executado com sucesso.
A Linguagem C possui cinco tipos de dados escalares, sendo eles determinantes nas possibilidades de manipulação de informações efetuadas pelo computador que estiver executando o programa em C.
Tipo | Sintaxe em C | Tamanho(byte) | Faixa |
Caracter | char | 1 | 0 a 255 |
Inteiro | int | 2 | -32768 a 32767 |
Real | float | 4 | 3.4E-38 a 3.4E38 |
double | 8 | 1.7E-308 a 1.7E308 | |
Não Definido | void | 0 | Sem valor |
Observe a correta sintaxe na criação de algumas variáveis e constantes em C.
const int taxa = 15; // cria uma constante do tipo inteiro. char letra; // cria a variável LETRA que armazena um único caracter. int valor; // cria uma variável inteira com certa capacidade de armazenamento float salario; // variável real com certa precisáo (3.4*10-38 à 3.4*1038) double pi; // variável real com grande precisão (1.7*10-308 à 1.7*10308 )
A mudança nas propriedades relacionadas ao armazenamento de dados em C, podem ocorrer por meio dos modificadores. Eles são aplicados a alguns dos tipos de dados escalares da linguagem. Na relação a seguir são apresentados os quatro modificadores existentes na Linguagem C padrão ANSI.
Os modificadores não podem ser aplicados a qualquer tipo, por exemplo: em float não se pode aplicar nenhum deles (não tem efeito algum), enquanto que o int aceita qualquer um dos quatro.
O uso dos modificadores long e short contribui com o aumento ou redução do espaço de armazenamento do dado na memória. O unsigned permite a manipulação dos valores sem sinal, ou seja, só os valores positivos.
As variáveis e constantes em C podem possuir qualquer nome desejado pelo programador, desde que estes nomes respeitem as regras de criação dos identificadores, como esclarecido anteriormente.
Para se utilizar variáveis ou constantes em C é necessária a declaração de cada uma delas, respeitando as regras de organização e sintaxe da linguagem. A forma geral de declaração destes dois recursos são apresentadas abaixo:
Forma geral para variável:
<tipo de dado> <nome da variável>;
Forma Geral para constante
const <tipo de dado> <nome da constante> = <valor atribuído a constante>;
No exemplo abaixo é possível ver a criação de uma constante na linguagem computacional denominada C:
/* SÍNTESE Objetivo: Declarar uma constante e duas variáveis Entrada: Nenhuma Saída: Nenhuma */ #include <stdio.h> // instrução da linguagem C void main (void) // instrução da linguagem C { //DECLARAÇÕES const int tudo = 100; // declaração da constante inteira TUDO char letra; // declaração da variável caracter chamada LETRA float salario; // declaração de uma variável do tipo real //INSTRUÇÕES /* instruções a serem executadas pelo programa */ }
Estrutura de um programa
Um programa em C possui características que devem ser obedecidas, pois um erro de sintaxe ou semântica resulta na falha de cumprimento do objetivo almejado pelo programa.
Na continuação da aprendizagem sobre a programação estruturada, todos os códigos, ou programas em C, deverão ser elaborados respeitando a estrutura de desenvolvimento de programas em três grandes blocos, sendo eles:
O exemplo a seguir mostra a organização destas estruturas em um algoritmo simples, descrito respeitando as regras do português estruturado.
algoritmo nomeAlgoritmo; //Síntese //Objetivo: exemplificar a estrutura padrão de um programa escrito em C //Entrada: nenhuma //Saída: mensagem de sucesso no primeiro programa principal //Declarações //Instruções escreva("Esse é o meu primeiro programa!!"); fimPrincipal
A transformação deste algoritmo em um programa em C é apresentada na sequência. Observe que as estruturas se mantém, apesar de conterem alguns simples detalhes importantes que as diferenciam.
/*SÍNTESE Objetivo: exemplificar a estrutura padrão de um programa escrito em C Entrada: nenhuma Saída: mensagem de sucesso no primeiro programa */ #include <stdio.h> // inclusão da biblioteca padrão de entrada e saída void main (void) // inicio do programa - função main() { // abertura do bloco principal da função main() // DECLARAÇÕES /* declarações das variáveis e constantes */ // INSTRUÇÕES printf("Esse é o meu primeiro programa!!"); // função de escrita na tela getch(); // força uma parada para leitura } // final da função main(), logo fim do programa
Com a elaboração do algoritmo, seguido de sua tradução para a linguagem C, é possível identificar algumas descrições diferentes que são muito importantes para o programa em C. Acompanhe com atenção alguns cuidados importantes na elaboração de um programa fonte nesta linguagem:
No exemplo anterior foi possível acompanhar a elaboração de um algoritmo e sua tradução para a linguagem C, onde ambos estão respeitando as regras de sintática, semântica e a organização na descrição do programa.
INTRODUÇÃO BÁSICA ÀS ENTRADAS E SAÍDAS
A expressão ENTRADA significa, para a área de programação, todos os dados que serão informados ao computador através dos dispositivos de entrada acoplados a ele (teclado, mouse, scanner, etc.). Existe porém um dispositivo padrão para a leitura de dados na Linguagem C, o teclado, que sempre é acionado para ler valor(es) quando não existe nenhuma especificação. A SAÍDA representa todo dado que é passado do computador para o usuário por meio dos respectivos dispositivos (monitor, impressora, caixas acústicas, discos, etc.). Da mesma forma, esta linguagem também possui um dispositivo padrão de saída, sendo ele o monitor.
Conhecendo a importância da comunicação do computador com seus usuários, assim como dos usuários para com o computador, será esclarecida a seguir as instruções em C que possibilitam a entrada e saída de dados no computador
A primeira instrução a ser apresentada consiste de uma função, ou seja, de um subprograma existente na biblioteca stdio.h existente em todos os compiladores da Linguagem C que respeitam o padrão ANSI.
Esta função é responsável pela apresentação de dados no dispositivo padrão de saída da Linguagem C. Por se tratar de uma função, esta instrução não é uma palavra reservada da linguagem, mas sua utilização como nome de um outro recurso no programa (variável, constante, subprograma) pode dificultar a compreensão e manipulação do mesmo. A representação da forma geral desta função é mostrada a seguir:
A expressão de controle é obrigatória e sempre estará entre aspas ("). Ela controla tudo que será apresentado ao usuário, usando de códigos especiais para apresentar dados de qualquer tipo, além de algumas orientações sobre o posicionamento da informação na tela. Para mostrar dados de qualquer tipo são utilizados os códigos precedidos do símbolo percentual (%), enquanto que as orientações na tela tem um código com o precedente com a barra invertida (\).
Na expressão de controle são inseridos os códigos correspondentes a apresentação desejada, consistindo assim na máscara que controlará a apresentação das informações ao usuário. Nesta máscara são definidos os tipos de dados a serem apresentados, além de qual a posição na expressão de controle que eles serão mostrados no monitor.
Cada código % deve referenciar um valor ou recurso (variável, constante, subprograma) especificado na lista de argumentos do printf. Esta lista é iniciada após a expressão de controle, sendo separada por vírgula (,). A vírgula também separa os diferentes elementos existentes nessa lista que são correspondentes a cada código percentual existente na expressão de controle.
Existem vários códigos % que referem-se a diferentes tipos de dados que podem ser manipulados, mas os relacionados a seguir serão suficientes para a aprendizagem inicial nesta linguagem de programação.
Código | Significado |
%d | Inteiro |
%f | Real(float) |
%c | Caracter |
%s | String |
%o | Octal |
%x | Hexadecimal |
%lf | Real grande(double) |
%% | Mostra um % |
A seguir, observe alguns exemplos que usam esta função de saída:
Esta função faz a leitura dos dados informados pelo usuário. Ela possui a mesma organização da printf, mas fazendo a leitura dos dados, por isso sua manipulação ocorre sobre os dispositivos de entrada de dados, sendo o teclado acionado por esta função. Observe a representação da forma geral desta função:
Observe os exemplos de leitura de dados do usuário.
A leitura de um dado deve ser armazenada em uma variável, pois o valor informado poderá ser usado na realização de algum processamento do programa. Para que ele fique disponível para o programa é necessário, primeiro, a declaração da variável, que deve ter o tipo de dado coerente com a leitura desejada.
A leitura do dado deve ser armazenada no endereço de memória que o computador alocou para a variável declarada. Por isso o operador & é utilizado nesta função, armazenando o valor informado pelo usuário no correto endereço de memória onde tal variável foi criada pelo computador.
Analise o que algoritmo a seguir faz.
algoritmo informacoesPessoais; //Síntese //Objetivo: ler e escrever dados //Entrada: uma idade, um salário e a letra inicial do sexo de uma pessoa //Saída: a idade, o salário e o sexo informado pelo usuário //Declarações inteiro idade; real salario; caracter sexo; //Instruçõesescreva("Informe a idade: "); leia(idade); escreva("Informe o salário: "); leia(salario); escreva("Informe M para masculino ou F para feminino: "); leiaCaracter(sexo); escreva("Sua idade = ", idade," e seu salário = ",salario); escreval("A letra inicial do seu sexo = ",sexo);fimPrincipal
Agora, observe a tradução do algoritmo em um programa em C.
/* SÍNTESE Objetivo: ler e escrever dados Entrada: uma idade, um salário e a letra inicial do sexo de uma pessoa Saída: a idade, o salário e o sexo informado pelo usuário */ #include <stdio.h> #include <conio.h> void main (void) { //DECLARAÇÕES int idade; float salario; char sexo; //INSTRUÇÕES printf("Informe a idade: "); scanf("%d",&idade); printf("Informe o salário: "); scanf("%f",&salario); printf("Informe M para masculino ou F para feminino: "); sexo = getch(); printf("\nSua idade = %d e seu salário = %f ", idade, salario); printf("\nA letra inicial do seu sexo = %c",sexo); getch(); }
As duas últimas instruções printf possuem um código de barra invertida, que controla o posicionamento na tela. Especificamente o código \n leva o cursor para a próxima linha. Este cursor identifica a posição onde serão apresentados os valores de saída desejados.
Esta função faz a leitura imediata de um caractere do teclado, não utilizando a memória temporária (buffer) para armazená-lo. Ela permite ainda que o caractere pressionado seja mostrado na tela. Veja no exemplo a seguir a leitura de um caractere por meio desta função, sendo ele armazenado na variável LETRA.
void main () // início do corpo da função principal { //DECLARAÇÕES char letra; //INSTRUÇÕES letra = getche(); // retorna o valor lido e o atribui a LETRA }
A leitura de um único caractere também é realizada por esta função, mas ela usa o buffer para efetuar esta leitura, sendo necessário pressionar a tecla ENTER após digitar a tecla desejada. A tecla digitada permanece na memória temporária (buffer) até que o ENTER seja pressionado, o que solicitará ao computador a cópia dos dados do buffer para a memória principal, memória esta que o computador utiliza para manipular os dados enquanto são processados. Observe a sintaxe similar da getchar() com as outras funções que fazem a leitura de um único caractere.
void main () // início do corpo da função principal { //DECLARAÇÕES char tecla; //INSTRUÇÕES tecla = getchar(); /* retorna o valor lido na variável TECLA } usando o buffer */
Os operadores relacionais são usados para identificar o relacionamento existente entre dados, contribuindo muito com o processamento a ser efetuado por um programa.
O resultado da aplicação de um operador relacional sempre será lógico, ou seja, VERDADEIRO ou FALSO.
Na Linguagem C esses operadores respeitam a sintaxe apresentada na tabela a seguir:
Operador em Algoritmo | Operador em C | Significado da Operação |
> | > | Maior do que |
>= | >= | Maior ou igual a |
< | < | Menor do que |
<= | <= | Menor ou igual a |
== | == | Igual a |
!= | != | Diferente de |
Observe a seguir alguns exemplos na aplicação dos operadores relacionais
Exemplo em Algoritmo | Sintaxe do exemplo em C |
valor == 0 // verifica se VALOR é igual a zero max > 1 // verifica se MAX é maior que um letra != 'A' // verifica se LETRA é diferente de 'A' |
valor == 0 max > 1 letra!= 'A' |
Os operadores lógicos de conjunção (e), disjunção (ou) e negação (nao) também possuem uma sintaxe diferente na Linguagem C. Observe na relação a seguir a sintaxe de cada um deles que permitem a elaboração de expressões relacionais mais complexas e abrangentes.
Operador lógico em Algoritmo | Operador lógico em C |
e | && |
ou | || |
nao | ! |
Acompanhe na sequência a revisão das operações lógicas efetuadas sobre as tabelas verdades representadas a seguir. Suponha que os valores atribuídos as variáveis A e B sejam os representados por V (verdadeiro) e F (falso).
A | B | A && B |
V | V | V |
V | F | F |
F | V | F |
F | F | F |
O exemplo a seguir mostra as operaçães relacionais na expressão proposta e seu resultado.
Sempre deve haver cuidado com a análise da expressão proposta, pois os parênteses interferem diretamente no resultado final, modificam a ordem da sequência alcançada por cada expressão, pois eles alteram a precedência das operações (prioridades), por exemplo:
O operador de atribuição é utilizado para atribuir um valor a uma variável ou constante, somente na sua declaração, pois no decorrer do programa a constante não recebe nenhum outro valor. Este operador sempre armazena o valor, ou o resultado da expressão, que está a direita do símbolo de atribuição (um sinal igual =), armazenando este valor, ou resultado da expressão, na variável que está a sua esquerda.
Os operadores aritméticos em C possuem a sua sintaxe especificada por meio dos símbolos identificados a seguir:
A operação de divisão de inteiros (div do algoritmo) em C acontece sempre que dois valores inteiros são divididos (/), como pode ser visto na comparação a seguir:
Os resultados destas operações são apresentados pela linguagem C, quando forem solicitados dessa forma. Por isso deve ter cuidado com as operações de divisão a serem solicitadas no programa, pois o resultado sempre estará relacionado a sintaxe e a lógica desejada na elaboração da expressão.
Acompanhe o algoritmo que efetua uma operação aritmética.
algoritmo nomeAlgoritmo; //Síntese //Objetivo: Somar duas variáveis. //Entrada: Nenhuma. //Saída: Resultado da soma. principal //Declarações inteiro valor_1,valor_2,resultado; //Instruções valor_1 = 35; valor_2 = 42; resultado = valor_1 + valor_2; escreva ("Total = ",resultado); fimPrincipal
Acompanhe agora a tradução deste algoritmo para o programa computacional em C.
/* SÍNTESE Objetivo: Somar duas variáveis. Entrada: Nenhuma. Saída: Resultado da soma. */ #include <stdio.h> #include <conio.h> void main (void) { //DECLARAÇÕES int valor_1,valor_2,resultado; //Declarações das variáveis //INSTRUÇÕES valor_1 = 35; valor_2 = 42 resultado = valor_1 + valor_2; printf("Total = %d",resultado); }
Veja o resultado apresentado no monitor de vídeo do computador que está executando este programa.
Os operadores de incremento ou decremento podem ser escritos de uma forma mais simplificada na Linguagem C. O incremento representa um simples contador que acrescenta um ao valor da variável inteira utilizada na expressão. Por exemplo:
Estes operadores podem ser descritos de duas formas diferentes:
Estas diferenças são significativas, por isso acompanhe com atenção os exemplos a seguir:
Supondo os valores de x = 10; e y = 0;
Seus valores finais, após as operações acima seriam de x e y igual a 11
Iniciando com os menos valores propostos acima, os valores finais para as operações de pós-incremento seriam de x igual a 11 e y igual a 10.
As mesma lógica envolve os operadores de decremento em C:
Seus respectivos valores finais são: x = 9 e y = 9.
Com os mesmos valores iniciais, x é encerrado com 9 e y com 10.
A forma como as operações de atribuição são descritas em uma expressão também podem ser simplificadas na Linguagem C, porém isso deve ser compreendido corretamente, pois esta representação pode tornar-se um complicador na compreensão das expressões.
Expressão Convencional | Expressão Equivalente em C |
x = x + y; | x += y; |
x = x - y; | x -= y; |
x = x * y; | x *= y; |
x = x / y; | x /= y; |
x = x % y; | x %= y; |
/* SÍNTESE Objetivo: somar duas variáveis Entrada: valor das variaveis Síída: resultado da soma */ #include <stdio.h> #include <conio.h> void main( ) { //DECLARAÇÕES int numero_1, numero_2; //INSTRUÇÕES printf ("Informe o primeiro valor: "); scanf("%d",&numero_1); printf ("\nInforme o segundo valor: "); scanf("%d",&numero_2); numero_1 += numero_2; /*equivalente a expressão numero_1=numero_1+numero_2 */ printf ("\nValor 1 = %3d e Valor 2 = %3d", numero_1, numero_2); getch(); /* aguarda ser informada uma tecla para encerrar o programa */ }
Supondo que o usuário do programa digitou os valores 13 e 5, respectivamente, sendo a execução do programa demonstrada na representação do monitor de vídeo a seguir:
Atividade de Fixação
No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como seu entendimento sobre este conteúdo está, estão sendo sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento nesta disciplina.