Universidade Metodista de Piracicaba - UNIMEP
Faculdade de Ciência e Tecnologia da Informação - FCTI

Março/2000

ÍNDICE

1. Introdução	
2. Estrutura Básica de Um Programa em "C"	
Tipos Básicos de Dados	
Modificadores de Tipo	
Identificadores
Variável	
Modificadores de Tipo de Acesso	
Operadores	
3. Funções de Tela	
4. Funções de Entrada e Saída	de Dados
Constantes Barra Invertida
Comandos de Formato	
Função printf()
Função scanf()
5. Comandos de Seleção	
	Comando de Seleção Simples e Composta
Comando de Seleção Multipla	
6. Comandos de Repetição	
	Repetição com teste no início
	Repetição com teste no final
	Repetição contada ou automática
7. String	
	Funções para manipulação de strings;
	Funções para manipulação de caracteres;
Funções matemáticas
Funções micelânia
8. Matriz	
9. Bibliotecas Padrão da Linguagem "C"	
Linguagem C

1- INTRODUÇÃO

	A linguagem “C” foi criada na década de 70 por Dennis M. Ritchie a partir de uma outra  linguagem: o “B”, criada por Ken Thompson. O “B”, por sua vez, veio da linguagem BCPL, inventada por Martin Richards.

	A linguagem “C” tornou-se muito importante e popular por possuir tanto características de “alto nível ” quanto de “baixo nível ”  sendo considerada uma linguagem de programação de “nível médio “. Outra característica muito importante é ser portável, isto é, poder ser usada em várias máquinas de portes e sistemas operacionais diferentes.

	A linguagem “C” possui a vantagem se ser estruturada e compilada sendo bastante usada para construção de sistemas operacionais, planilha eletrônica, interpretadores, editores de texto, compiladores, etc.

	Com a evolução dos microcomputadores surgiram várias versões de compiladores “C” havendo a necessidade de padronização, formalizada pela ANSI.

2- Estrutura básica de um programa em “C”

	Um programa em “C” consiste em uma ou mais funções, sendo que a única função que necessariamente precisa estar presente é a denominada main() (principal), que é a primeira função a ser executada quando o programa se inicia. As outras funções podem proceder ou suceder a função main().

main( )
{	
	// corpo da função – bloco de comandos e ou funções
}	

Os parênteses após a palavra  “main()”, indica que é uma função. O nome das demais funções desenvolvidas em C, pode ser qualquer um, menos “main”. 

O código que estiver dentro das chaves será executado seqüencialmente quando a função for chamada. Cada bloco de instruções deve ser colocado entre chaves e podem ser aninhados uns dentro dos outros.

A linguagem “C” é “Case Sensitive”, isto é, maiúsculas e minúsculas fazem diferença. Se for declarada uma variável com o nome soma ela será diferente de Soma, SOMA, SoMa ou sOmA. Da mesma forma que os comandos em “C” devem ser sempre escritos com letras minúsculas.
Os comentários e as observações do programa podem aparecer em qualquer lugar desde que colocados entre os delimitadores /* comentário */ ou // comentário. Em “C” as instruções são sempre encerradas por “; “.

Tipos Básicos de dados

Tipo	Bit	Byte	Escala	
char	8	1	-128 a 127	
int	16	2	-32768 a 32767	
float	32	4	3.4E-38 a 3.4E+38	
double	64	8	1.7E-308 a 1.7E+308	
void	0	0	sem valor	

Modificadores de tipo

Exceto o void, os tipos de dados básicos podem ter vários modificadores precedendo-os. Um modificador é usado para alterar o significado de um tipo básico para adaptá-lo mais precisamente às necessidades de diversas situações:

signed (com sinal)
unsigned (sem sinal)
long (máxima precisão)
short (menor precisão)

TIPO	TAM.(bytes)	ESCALA	
Char	1	-127 a 127	
Unsigned char	1	0 a 255	
Signed char	1	-127 a 127	
Int	2	-32767 a 32767	
Unsigned int	2	0 a 65535	
Signed int	2	-32767 a 32767	
Short int	2	-32767 a 32767	
Unsigned short int	1	0 a 65535	
Signed short int	1	-32767 a 32767	
Long int	4	-2147483647 a 2147483647	
Signed long int	4	-4294967295 a 4294967295	
Unsigned long int	4	0 a 4294967295	
Float	4	3.4 *(10-38) a 3.4 * (10+38) 	
Double	8	1.7*(10-308) a 1.7*(10+308)	
Long double	16	3.4*(10-4983) a 3.4*(10+4983)	

- IDENTIFICADORES
	São usados para dar nomes às variáveis, constantes, tipos e ou funções. Para a criação desses identificadores deverá ser consideradas as informações a seguir:

•	Podem ser formados por letras, números ou sublinhado(_);
•	Tem que começar por letra ou sublinhado;
•	Letras maiúsculas e minúsculas são caracteres distintos;
•	Não podem ser palavras reservadas;
•	Podem conter qualquer tamanho porém somente os 31primeiros caracteres são significativos. 

 -VARIÁVEL

	É uma posição de memória com um nome, que é usada para armazenar uma informação de um tipo específico que pode ser modificada pelo programa.

	Forma Geral :-
			  tipo  lista_de variáveis;

	Exemplo:-	int a,b,d;
			float x,y;
			unsigened int w;

-Inicialização de variáveis:

	As variáveis podem ser inicializadas no mesmo momento em que elas são declaradas, colocando um sinal de igual e a informação desejada.

Exemplo:	char op=‘S’; /* as informações do tipo caracter são envolvidas por apóstrofes */
			int primeiro=0;
			char mensagem[20]=”Bom Dia !!”; /* as  strings são envolvidas por aspas */

 -MODIFICADORES DE TIPO DE ACESSO

•	Constantes :- Não podem ser modificadas pelo programa.

	Forma Geral:-
			const tipo identificador;

	Exemplo:-	const int max=10;
			const float taxa1=0.7,taxa2=0.5;

Outra forma de declarar uma informação como constante é usando a diretiva de compilação #define.

	Forma Geral:-
			#define identificador=informação   /* não tem ; */

	Exemplo:-	#define volume=10
			#define pi=3.141516

•	Volatile :- É usado quando uma variável pode ser modificada inesperadamente por eventos externos ao controle do programa.

	Forma Geral:-
			volatile tipo lista_de_variáveis;

	Exemplo:-	volatile int tempo; /* pode ser modificada pelo hardware para atualizar a hora  */.

– OPERADORES

•	Atribuição:-	nome_da_variável = expressão;
			
			Exemplo:-	x=2;
					sexo=‘F’;
					total=(a*b)/100;
					x=y=z=0; /* pode-se atribuir o mesmo valor a muitas variáveis */

			Abreviações:-	x=x+100;		x+=100;
						b=b*7;			b*=7;
						z=z-2;			z-=2;

•	Aritméticos:-	- subtração
			+ adição
			* multiplicação
			/ divisão /* quando a divisão for inteira o dado é truncado */
			% resto da divisão de números inteiros
			++ incremento de 1   /* equivale x=x+1   */
--decremento  de 1    /* equivale x=x-1    */

OBS:- Os operadores de incremento e decremento podem ser usados como prefixo ou sulfixo da variável sobre a qual estão sendo aplicados. A diferença é que quando são prefixo eles incrementam e retornam o valor da variável já incrementada. Quando são sulfixo eles retornam o valor da variável sem o incremento e depois incrementam a variável. 

Exemplos:-		X=23;
	Y=X++;
		Resultado é Y=23 e X=24.
	
	X=23;
		Y=++X;
	Resultado é Y=24 e X=24.

		X=5;Y=2;
	Z=X/Y;
Resultado é  Z=2 

	X=1;Y=2;
		Z=X%Y;
	Resultado é Z=1
	
•	Relacionais:
			> maior que
			< menor que
			>= maior ou igual
			<= menor ou igual
			== igual
			!= diferente

•	Lógicos:
		&&   (e)
			||      (ou)
			!      (não)

Existem outros operandos que não serão tratados por enquanto. Exemplo:  operadores de ponteiros, operador ponto, operador seta, etc.

•	Precedência dos Operadores

		maior		!    ++    --
				*     /      %
				+    -
				<     >    <=    >=
				==     !=
				&&
				| | 
		menor		=  
			
Os operadores do mesmo nível de precedência são avaliados pelo compilador da esquerda para a direita. Os parênteses podem ser usados para alterar a ordem.

Em C, VERDADEIRO é qualquer valor diferente de zero e o FALSO=0. As expressões que usam operadores relacionais ou lógicos devolvem zero para falso e 1 para verdadeiro.	

3 - FUNÇÕES DE TELA  (biblioteca conio.h)

clrscr() - limpar a tela;
clreol() - limpa a linha;
gotoxy(coluna,linha) - posiciona o cursor;
window(coluna incial,linha inicial,coluna final, linha final) -cria uma janela na tela;
textcolor(cor) - seleciona a cor dos caracteres de  texto;
textbackground(cor) – seleciona a cor do fundo da tela;

TABELA DE CORES:

0	PRETO	
1	AZUL	
2	VERDE	
3	CIANO	
4	VERMELHA	
5	MAGENTA	
6	MARROM	
7	CINZA CLARO	
8	CINZA ESCURO	
9	AZUL CLARO	
10	VERDE CLARO	
11	CIANO CLARO	
12	ALARANJADO	
13	MAGENTA CLARO	
14	AMARELO	
15	BRANCO	

4- FUNÇÕES DE ENTRADA E SAÍDA DE DADOS (biblioteca <stdio.h>)

getchar() - entrada de um caracter individual; 
getch() - entrada de um caracter. O caracter não é exibido na tela não é necessário teclar <enter>;
getche() - entrada de um caracter. O caracter é exibido na tela não é necessário teclar <enter>;
putchar - exibe um caracter na tela;
gets() - entrada de string;
puts() - saída de string;
scanf() - entrada de dados formatada com string de controle de acordo com o tipo da variável;
printf() - saída de dados formatada com string de controle de acordo com o tipo da variável;
cprintf() - saída de dados formatada colorida com string de controle de acordo com o tipo da variável;

- CONSTANTES BARRA INVERTIDA

	São utilizadas para controlar a exibição de dados na tela e na impressora.

	CÓDIGO			SIGNIFICADO

	      \n				nova linha (line feed)
	      \b				retrocesso (backspace)
	      \t				tabulação horizontal
	      \v				tabulação vertical
	      \a				alerta(beep)
	      \”				para exibir aspas
	      \\				para exibir barra invertida
	      \f				salto de folha (form fee)
	      \r				retorna ao início da linha (return)
	      \0				nulo

 - COMANDOS DE FORMATO

	São constantes que definem o tipo e o formato dos dados a serem exibidos.

	Comando			Formato

	%c				caracter
	%d				inteiros decimais com sinal
	%i				inteiros decimais com sinal
	%f				decimais com ponto flutuante
	%s				string
	%e				notação científica
	%o				octal
	%x				hexadecimal
	%l				inteiro longo
	%lf				double
	%u				decimal sem sinal

- A função printf()

	A função printf serve para exibir uma informação no vídeo ou na impressora e possui a seguinte estrutura:

	Forma Geral: 

		printf(“expressão de controle”, lista de argumentos);

Exemplo1:
	int i=4;
	float=5.5;

		printf(“%d\n”, i);
	
		printf(“Este numero e inteiro: %d  e este e real: %f”, i , j);

		Resultado: 4
			       Este número é inteiro: 4 e este é real: 5.5
	
	Exemplo2:
		
printf(“%s esta a %d milhões de milhas do sol”, “Venus”, 67);
	
Resultado: Venus esta a 67 milhões de milhas do sol

- Diferenças entre impressão de caracter e cadeia de caracteres:

		printf(“A letra %c pronuncia-se %s”, ‘j’, “jota”);
	
Resultado: A letra j pronuncia-se jota

-Tamanho de campos de impressão

Vamos abordar este assunto através de exemplos:

	Exemplo1:	
main()
{
		printf(“Os alunos são %2d\n”,350);
		printf(“Os alunos são %4d\n”,350);
		printf(“Os alunos são %6d\n”,350);
}

Os números 2, 4 e 6, indicam o tamanho do campo de impressão e \n indica saltar para outra linha.

Resultado:

	Os alunos são 350
	Os alunos são   350
	Os alunos são       350

Exemplo2:

main()
{
	printf(“%4.2f\n”,3456.78);
	printf(“%3.2f\n”,3456.78);
	printf(“%3.1f\n”,3456.78);
	printf(“%10.3f\n”,3456.78);
}

Resultado:
	
	3456.78
	3456.78
	3456.8
	    3456.780

- Complementando com zero à esquerda

main()
{
	printf(“\n%04d”,21);
	printf(“\n%06d”,21);
	printf(“\n%6.4d”,21);
printf(“\n%6.0d”,21);
}

Resultado:

	0021
	000021
	    0021
  	        21

- Imprimindo caracteres

Em C um caractere pode ser representado de diversas maneiras: o próprio caractere entre aspas simples ou sua representação decimal, hexadecimal ou octal segundo a tabela ASCII.

Exemplo:
	printf(“ %d  %c  %x  %o \n”,’A’, ’A’, ’A’, ’A’);

Resultado:

	65  A  41  101

- A Função scanf()
	
A função scanf() é outra das funções de E/S implementadas em todos os compiladores C. Ela é o complemento de printf() e nos permite ler dados formatados da entrada padrão (teclado).

Forma Geral:

	scanf(“expressão de controle”, lista de argumentos)

A lista de argumentos deve consistir nos endereços das variáveis. C oferece um operador para tipos básicos chamado operador de endereço e referenciado pelo símbolo & que retorna o endereço do operando. Na função scanf() cada nome de variável deve ser precedida por um ampersand(&) ou E-comercial. Somente strings não devem conter & na frente. 

Exemplo1: O programa a seguir exibe a idade em dias de uma pessoa.

#include <stdio.h>
#include <conio.h>

void main()
{
	int anos, dias;
	printf(“Digite sua idade em anos: “);
	scanf(“%d”,&anos);
	dias = anos*365;
	printf(“Sua idade em dias é %.d\n”,dias);
	getchar();
}

Resultado:

	Digite sua idade em anos: 4
	Sua idade em dias é   1460

Exemplo2: O programa abaixo transforma a temperatura de graus fahrenheit para graus celsius.

#include <stdio.h>
#include <conio.h>

void main()
{ 
	float ftemp,ctemp;
	clrscr();
	printf(“Digite temperatura em graus Fahrenheit: “);
	scanf(“%f,&ftemp);
	ctemp=(ftemp-32) * 5/9;
	printf(“Temperatura em graus Celsius é %f”, ctemp);
	getchar();
}

Exemplo3: O programa abaixo calcula a média aritmética de duas notas de um aluno.

#include <stdio.h>
#include <conio.h>

void main()
{ 
	float media,nota1,nota2;
	clrscr();
	printf(“\t Digite a 1ª nota: “);
	scanf(“%f",&nota1);
           printf("\t Digite a 2ª nota: ");
           scanf("%f",&nota2);
	media=(nota1 + nota2)/2;
	printf(“\t A média é: %5.2f”, media);
	getch();
}

Para segurança não utilize outras funções de entrada em um programa que está utilizando scanf().

O comando scanf poderá armazenar uma string desde que não contenha espaço em branco. O comando apropriado para entrada de dados do tipo string é o gets( ).

5- comandos de  Seleção

	Uma estrutura de seleção permite que uma ou mais ações sejam executadas a partir do resultado lógico de  uma ou mais condições.

Forma Geral:-

If  (expressão) comando1;
else  comando2;

onde:  expressão: - expressão lógica ou relacional ou chamada à uma função;
	 comando: - qualquer comando válido da linguagem “C”.

O comando if representa uma tomada de decisão que será resultado da expressão. Se o resultado for diferente de zero o comando1 será executado caso contrário ( se o resultado for igual a zero) será executado o comando2.
Para delimitar blocos de comandos utiliza-se { }.

If  (expressão) 
   {
      comando1;
      comando2;
      ....
   }
else 
   {
      comando1;
      comando2;
      ....
   }

Exemplos:- 

		If    (x>9)     y=100;
		else            y=200;

		If ((x==2) && (x!=1))
		{
			a=10;
			b=20;
			c=30;
		}
		else
		 	a=b=c=0;

Pode-se usar o operador ?  para substituir o comando if    else.

Forma Geral:-

	Expressão1 ? Expressão2 : Expressão3;

onde:  Expressão1,2 e 3: - expressões lógicas ou relacionais ou chamadas a funções;

Exemplos:-

	y = x>9?100:200;

	valor>0?printf(“positivo”):printf(“negativo”);

- Comando de Seleção Multipla

	A seleção de múltipla escolha é uma outra forma diferente que permite a escolha de ações que serão executadas à partir do resultado de uma comparação.

Forma Geral:-

switch  (expressão) 
{  
   case  constante1 : comandos; break;
   case  constante2 : comandos; break;
   .....
  default : comandos;
}

onde:  expressão: - expressão lógica ou relacional ou chamada à uma função;
	 constante:- qualquer valor inteiro ou caracter;
            comandos: - quaisquer comandos válidos da linguagem “C”.

O  default é opcional e só será executado se não houver nenhuma outra opção verdadeira. 

O comando break é utilizado para desviar a execução para o final  do comando switch.

Exemplos:
	char ch;
	
		switch (ch)
		{
		     case ‘1’ : printf(“Inclusão”);break;
		     case ‘2’ : printf(“Consulta”);break;
		     default : printf(“Fim”);
		}

		int num,a,b;	
switch (num)
		{
		     case 1,2     : a=2*2; b=-1; break;
		     case 3,4,5  : a=2*3; b=0;  break;
		}

Exemplo1: Dados três valores numéricos  diferentes calcular e exibir o menor deles.

#include <stdio.h>
#include <conio.h>

void main()
{ float a,b,c,menor;

  clrscr();
  gotoxy(30,2);printf("Descobrindo o Menor Valor");
  gotoxy(20,5);printf("Digite o 1º valor :");scanf("%f",&a);
  gotoxy(20,7);printf("Digite o 2º valor :");scanf("%f",&b);
  gotoxy(20,9);printf("Digite o 3º valor :");scanf("%f",&c);
  if (a < b) menor=a;
	else menor=b;
  if (c < menor) menor=c;
  gotoxy(20,15);printf("O Menor Valor = %5.0f",menor);
  gotoxy(40,23);printf("Tecle Algo para terminar ");
  getch();
}

Exemplo2: Este programa calcula a equação do 2º grau para delta maior que zero e exibe as duas raízes ou a mensagem Não existe raízes reais.
   
#include <stdio.h>
#include <conio.h>
#include <math.h>

void main()
{
int a,b,c;
float d,x1,x2;

clrscr();
gotoxy(20,4);
printf("CALCULO DA EQUACAO DO 2§ GRAU\n\n\n");
printf("\t O VALOR DE A ? ");
scanf("%d",&a);
printf("\t O VALOR DE B ? ");
scanf("%d",&b);
printf("\t O VALOR DE C ? ");
scanf("%d",&c);
d=pow(b,2)-4*a*c;
if (d>=0) {
   x1= (-b+sqrt(d))/2*a;
   x2= (-b-sqrt(d))/2*a;
   printf("\n\t A 1¦ raiz = %f\n",x1);
   printf("\t A 2¦ raiz = %f\n",x2);
} 
else
printf("\n\t\t NAO EXISTE RAIZES REAIS !!!\n\n\n");
gotoxy(20,22);
printf("TECLE ALTO PARA SAIR");
getch();
}

Exemplo 3: Dado o valor de uma dívida fazer um programa que permita ao usuário verificar qual será o valor da dívida convertido em dolar, franco, iene e libra.

include <stdio.h>
include <conio.h>

void main ()
{         int x;
	float divida;
           clrscr();
	printf("Digite a divida  : ");scanf("%f",&divida);
	printf("Digite a moeda para conversao : ");scanf("%i",&x);
	gotoxy(15,10);printf(" 1 - Dolar");
	gotoxy(15,12);printf(" 2 - Franco");
           gotoxy(15,14);printf(" 3 - Iene");
           gotoxy(15,16);printf(" 4 - Libra");
	switch (x)
	{	case 1:	divida /=0.916;break;
		case 2:	divida /=0.032;break;
		case 3: 	divida /=1.473;break;
		case 4: 	divida /=1.010;break;
		default: printf("moeda invalida");
	}
           gotoxy(25,22);
	printf("divida: %7.2f \n",divida);
           getch();
}

6- comandos de Repetição

	Os comandos de repetição são muitas vezes chamados de laços ou loops e se dividem em: laços condicionais e laços contados.

	Os laços condicionais são representados com dois comandos de repetição um com teste no início e o outro com teste no final do laço.

•	Repetição com teste no início: permite que uma seqüência de comandos seja executada um certo número de vezes enquanto o resultado do teste lógico do laço for  verdadeiro. Nesse caso o teste lógico é feito no início do laço, se o resultado for falso o processo não será executado nenhuma vez.

Forma Geral:-
			while (expressão) comando;

onde:  expressão: - expressão lógica ou relacional ou chamada à uma função;
	comandos: - quaisquer comandos válidos da linguagem “C”.

	Se a expressão de teste for verdadeira (diferente de zero), o corpo do laço while é executado uma vez e a expressão de teste é avaliada novamente. Este ciclo de teste e execução é repetido até que a expressão de teste se torne falsa (igual a zero), então o laço termina e o controle do programa passa para a linha seguinte ao laço.

	O corpo de um while pode ter uma única instrução terminada por ponto-e-vírgula, várias instruções entre chaves.

while (expressão)
   {
      comando1;
      comando2;
     .....
    }

Exemplos:-
			while (ch!=’A’)
			{  
   c=a+b;
			   printf(“%d”,c);
			   scanf(“%c”,&ch);
			}

	while ((a>0) || (b>0))
			{
   c+=b;
   --a;
   --b;
			 }			

•	Repetição com teste no final: permite que uma seqüência de comandos seja executada um certo número de vezes enquanto o resultado do teste lógico do laço for  verdadeiro. Nesse caso o teste lógico é feito no final  do laço, o que implica em executar o laço pelo menos uma vez.

Forma Geral:-

			do
 { 
    comando;
 } while (expressão);

onde:  expressão: - expressão lógica ou relacional ou chamada à uma função;
  	comando: - qualquer comando válidos da linguagem “C”.

Exemplos:-
			do
			{  
   a++
			   printf(“%d”,a);
			}  while (a<100);

	do
			{
   scanf(“%f”,&a);
   scanf(“%d”,&b);
} while ((a<=0) || (b<=0));

As chaves são necessárias mesmo que se tenha apenas 1 comando.

•	Laços contados ou automáticos: permite que uma seqüência de comandos seja executada um número de vezes previamente estabelecida. Em “C” o comando de repetição para laços contados pode ser utilizado de muitas formas diferentes que serão vistas a seguir, como por exemplo utilizando uma condição de parada para o laço. Entretanto a forma mais utilizada desse tipo de laço é quando se tem um número de vezes pré-estabelecido  para ser repetido o laço.

Forma Geral:-

		for(inicialização;condição de término;incremento) comando;

onde: 
inicialização: - atribuição de um valor inicial para a variável de controle do laço;
condição de término:- enquanto a condição for verdadeira, os comandos do laço serão executados;
incremento:- expressão que altera o valor da variável de controle do laço;
	comandos: - quaisquer comandos válidos da linguagem “C”.

	É necessário a utilização de chaves para indicar a execução de um bloco de comandos.

for(inicialização;condição de término;incremento) 
{ 
comando1;
comando2;
....
		}

Exemplos:-
			for ( x=1;x<=100;x++ )
  				printf(“%d”,x);

			for (x=100;x!=65;x-=5)
			{  
  z = x*x;
			  printf(“O quadrado de %d  e  %d”,x,z);
			}

			for (x=0,y=0;x<10;x++,y--)
				printf(“%d    %d”,x,y);

			for(x=0; ;x++)
			{
   			   printf(“%d”,x);
			   if (x==10) break;
			}

	O comando break pode ser usado no corpo de qualquer estrutura de laço “C”. Causa a saída imediata do laço e o controle passa para o próximo estágio do programa.

	Se o comando break estiver em estruturas de laços aninhados afetará somente o laço que o contém e os laços internos a este.

Exemplo 1: Dados dois valores quaisquer calcular e exibir a adição, a subtração, a multiplicação e a divisão entre eles. Preparar a tela em formato de tabela e repetir o processo 4 vezes.

#include <stdio.h>
#include <conio.h>
#include <dos.h>

void main()
{
float a,b,soma,sub,mult,div,res;
char  op;
int i;
clrscr();
gotoxy(20,2);printf("<<< OPERACOES MATEMATICAS >>>");
gotoxy(10,4);printf("1º NUMERO");
gotoxy(40,4);printf("2º NUMERO");
gotoxy(60,4);printf("OPERACAO");
gotoxy(70,4);printf("RESULTADO");
for (i=1;i<=4;i++)
 {
   gotoxy(12,i+6);scanf("%f",&a);
   gotoxy(42,i+6);scanf("%f",&b);
   getchar();
   do{
     gotoxy(62,i+6);clreol();scanf("%c",&op);
   }while ((op!='+') && (op!='-') && (op!='*') && (op!='/'));
   switch (op)
   {
     case '+':res=a+b;break;
     case '-':res=a-b;break;
     case '*':res=a*b;break;
     case '/':res=a/b;
   }
   gotoxy(72,i+6);printf("%8.2f",res);
 }
   getch();
}

Exemplo 2: O mesmo exercício resolvido de outra forma diferente (utilizando outro comando de repetição com teste).

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <ctype.h>

void main()
{
  float a,b,soma,sub,mult,div,res;
  char  op;
  char opcao='S';
  int i=1;
  clrscr();
  gotoxy(20,2);printf("<<< OPERACOES MATEMATICAS >>>");
  gotoxy(10,4);printf("1º NUMERO");
  gotoxy(40,4);printf("2º NUMERO");
  gotoxy(60,4);printf("OPERACAO");
  gotoxy(70,4);printf("RESULTADO");
  window(1,6,80,24);
  while (opcao=='S')
   {
      gotoxy(12,i);scanf("%f",&a);
      gotoxy(42,i);scanf("%f",&b);
      getchar();
      do {
	gotoxy(62,i);clreol();scanf("%c",&op);
      }while ((op!='+') && (op!='-') && (op!='*') && (op!='/'));
      switch (op)
      {
	case '+':res=a+b;break;
	case '-':res=a-b;break;
	case '*':res=a*b;break;
	case '/':res=a/b;
      }
      gotoxy(72,i);printf("%8.2f",res);
      gotoxy(30,15);printf("Deseja Continuar <S/N> ? ");
      do {
	gotoxy(55,15);clreol();scanf("%c",&opcao);
	opcao=toupper(opcao);
      }while ((opcao!='S') && (opcao!='N'));
      i++;
      if (i>=13)
	{
	  clrscr();
	  i=1;
	 }
   }
 }

Exemplo 3: Dado o nome do cliente e o valor da aplicação calcular e exibir o rendimento final da aplicação deduzindo o imposto. O programa deverá ser repetido até quando o usuário desejar.

  #include <stdio.h>
  #include <conio.h>
  #include <ctype.h>
  void main()
  {
	char nome[20],op='S';
	float va,rl;
	do {
	 clrscr();
	 printf("\t\t APLICACOES\n");
	 printf("\t Nome.....: ");gets(nome);
	 printf("\t Valor....: ");scanf("%f",&va);
	 if (va<=10000.00) rl=va*0.014-0.002*va;
	   else rl=va*0.018-0.002*va;
	 printf("\t Rendimento .. : %8.2f\n\n",rl);
	 printf("\t\t Deseja Continuar <s/n > ? ");
	 do
	  { gotoxy(50,6);clreol();scanf("%c",&op);
	    op=toupper(op);
	  } while ((op!='S') && (op!='N'));
	  getchar();
	} while (op=='S');
  }

7 - STRING

Em linguagem “C” não existe o tipo string. A utilização desse tipo de variável se dá  através da utilização de um cadeia de caracteres, isto é um vetor de caracteres terminados por um nulo (\0). Para implementar esse tipo de dado deve-se ter sempre  um caracter a mais para armazenar o terminador nulo.

	Para declarar um tipo string:

		char   nome[11];

	Na memória a estrutura de armazenamento que se forma é:
nome
											
0	1	2	3	4	5	6	7	8	9	10

	Para fazer a entrada de dados utilizamos as funções de entrada:

	gets(nome); // mais utilizado pois aceita qualquer tipo de caracter.

	ou

	scanf(“%s”,nome); // não aceita espaço em branco (limitada).
	 
Não utiliza & pois a primeira posição da string contem o endereço de memória.
				
	Se digitarmos um nome como por exemplo “PAULO” teremos:

nome
P	A	U	L	O	\0						
0	1	2	3	4	5	6	7	8	9	10

Para manipular as informações armazenadas em uma string podemos utilizar as funções string (relacionadas abaixo) ou utilizamos as funções caracter (também relacionadas abaixo), já que uma string é um vetor de caracteres.

Algumas Funções de Manipulação de Strings 

arquivo de cabeçalho <string.h>

Função	Descrição	Forma Geral	
strcpy()	copia uma string em outra.	strcpy (s1,s2); // copia o conteúdo de s2 em s1 e termina com nulo.	
strcmp()	compara duas strings.	x=strcmp(s1,s2); // x==0 se as strings forem iguais ou x!=0 se forem diferentes.	
strcat()	junta o conteúdo de duas strings.	strcat(s1,s2); // s1 irá conter o resultado da junção das 2 strings.	
strlen()	fornece o tamanho de uma string.	x=strlen(s1); // x vai conter o número de caracteres ocupados na string .	
strchr()	verifica se um caracter pertence a string.	x=strschr(s1,ch); // x !=0 se existir o caracter ou x==0 se não existir.	
strstr()	verifica se uma string existe dentro da outra string.	x=strstr(s1,s2); // x !=0 se s2 existir em s1 ou x==0 se não existir.	

Algumas Funções de Manipulação de Caracteres 

 arquivo de cabeçalho <ctype.h>

Função	Descrição	Forma Geral	
isdigit() 	verifica se o caracter é um número de 0-9.
	isdigit(a); // !=0 é número; =0 não é número.	
isalpha()	verifica se o caracter é uma letra	isalpha(a); // !=0 é letra; =0 não é letra.	
isupper()	verifica se um caracter está em maiúscula	isupper(a); // !=0 é maiúscula =0 não é.	
ispunct()	verifica se um caracter é pontuação.	ispunct(a); // !=0 é pontuação; =0 não é.	
isspace()	verifica se um caracter é espaço.	isspace(a); // !=0 é espaço; =0 não é.	
toupper()	transforma um caracter em letra maiúscula.	a=toupper(a); //  o conteúdo de a em maiúscula.	
tolower()	transforma um caracter em letra minúscula.	a=tolower(a); // o conteúdo de a em minúscula.	

Algumas Funções Matemáticas 

	arquivo de cabeçalho <math.h>

Função	Descrição	Forma Geral	
pow() -	calcula a potência de um número.	pow(num,pot); // num = base e pot = expoente	
fmod()	calcula o resto da divisão de números inteiros = %	fmod(5,2); // vai retornar 1.	
sqrt ()	calcula a raíz quadrada do número.	sqrt(num); // extrai a raíz quadrada de num	
fabs()	retorna o valor absoluto de um número.	fabs(-8); // retorna 8.	
ceil ()	arredonda para cima um número representado por um double em um número inteiro.	ceil(2.45); // retorna 3.	
floor()	arredonda para baixo um número representado por um double em um número inteiro.	floor(2.78); // retorna 2.	

Algumas Funções Micelâneas
 
	arquivo de cabeçalho <stdlib.h>

			
atof()	converte uma string em um número doble.	x=atof(s1); // x recebe o número float convertido	
rand()	gera uma seqüência de números pseudo-randômicos.	srand(u);// inicializador de números inteiros u = inteiro sem sinal
x=rand(100); // gera um número inteiro no intervalo de 0 –99.	
atoi()	converte uma string em um número inteiro.	x=atoi(s1); // x recebe o número inteiro convertido.	

Exemplo1:-
Dadas duas palavras diferentes (fazer crítica) desenvolver um programa   que contenha:
      a) o número de caracteres de cada uma das palavras;
      b) qual a menor palavra ou se se são do mesmo tamanho
      c) juntar as duas strings em uma variável auxiliar
      d) copiar a 2a string na 1a string

#include <stdio.h>
#include <conio.h>
#include <string.h>

void main()
{
  char st1[15],st2[15],aux[30]="";
  clrscr();
  gotoxy(20,2);printf("<< Usando Funcoes String >>");
  gotoxy(10,5);printf("Digite uma palavra: ");
  do {
   gotoxy(32,5);clreol();
   gets(st1);
   } while (strlen(st1)>=15);
  gotoxy(10,7);printf("Digite outra palavra: ");
  do {
   gotoxy(32,7);clreol();
   gets(st2);
  } while ((strlen(st1)>=15) || (strcmp(st1,st2)==0));
  gotoxy(10,11);printf("O tamanho da 1a palavra e =%d",strlen(st1));
  gotoxy(10,13);printf("O tamanho da 2a palavra e =%d",strlen(st2));
  gotoxy(10,15);
  if (strlen(st1) < strlen(st2)) printf("A 1a palavra e a menor");
  else if (strlen(st1) > strlen(st2)) printf("A 2a palavra e a menor");
  else printf("As duas tem o mesmo tamanho !!");
  strcat(aux,st1);
  strcat(aux,st2);
  gotoxy(10,17);printf("As duas juntas=%s",aux);
  gotoxy(10,19);printf("A primeira string =%s",strcpy(st1,st2));
  getchar();
  }

Exemplo2:-
Este programa mostra a utilização de algumas funções de caracteres e outras funções de conversão.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

void main()
{
  char s1[50];
  int i;
  clrscr();
  gotoxy(10,2);printf("Digite uma linha de texto: ");
  do {
   gotoxy(37,2);clreol();
   gets(s1);
  }while(strlen(s1)>=50);
  for (i=0;i<strlen(s1);i++)
   {
     if (isalpha(s1[i])) s1[i]='L';
	      else if (isspace(s1[i])) s1[i]='E';
		   else if (ispunct(s1[i])) s1[i]='P';
		      else s1[i]='N';
   }
   gotoxy(10,4);printf("Texto ‚: %s",s1);
  getchar();
  }

Exemplo3:-
Este programa mostra a utilização de algumas funções de caracteres e outras funções de conversão .

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

void main()
{
  char ch,str1[25],str2[25],num[5]="";
  int i,num1;
  float num2;
  clrscr();    // crítica para aceitar apenas números
  gotoxy(10,5);printf("Digite um número: ");
   i=0;ch=' ';
   while ((ch!='\r') && (i<=3))
   {
     do {
       gotoxy(30+i,5);clreol();ch=getche();
     }while ((isdigit(ch)==0) && (ch!='\r'));
     num[i]=ch;
     i++;
   }
   if (strlen(num) > 1)
      {
	num1=atoi(num); // converte uma string em um numero inteiro
	num2=atof(num); // converte uma string em um número double
	gotoxy(10,7);printf("string convertida em inteiro ‚=%d",num1);
	gotoxy(10,9);printf("string convertida em double  ‚=%f",num2);
	itoa(num1,str1,10); // converte número inteiro em uma string
	ltoa(num2,str2,10); // converte número float em uma string
	gotoxy(10,11);printf("o número inteiro convertido em string ‚=%s",str1);
	gotoxy(10,13);printf("o número float convertido em string ‚  =%s",str2);
	}
  getchar();
  }

Exemplo4:-
Exercício utilizando funções string.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

void main()
{
  char senha1[9]="segredos",senha2[9];
  int i,x;
  clrscr();
  gotoxy(20,2);printf("<< Teste da Senha >>");
  gotoxy(10,11);printf("Entre com a senha=");gets(senha2);
  for (i=0;i<strlen(senha2);i++) senha2[i]=tolower(senha2[i]);
  x=strcmp(senha1,senha2);
  if (x!=0) printf("\n\t\t senha invalida !!\n");
			else printf("\n\t\tsenha correta!!\n");
  getchar();
  }

Exemplo5:-
Exercício utilizando funções string - crítica para aceitar somente letras .

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
void main()
{
  char ch=' ',st1[15];
  int i=0;
  clrscr();
  gotoxy(20,2);printf("<< Usando Funcoes String >>");
  gotoxy(10,5);printf("Digite uma palavra: ");
  while ((ch!='\r') && (i<=14))
  {
  do {
   gotoxy(32+i,5);clreol();
   ch=getche();
  } while ((isalpha(ch)==0) && (ch!='\r'));
  if (ch!='\r'){ if (isupper(ch)) ch=tolower(ch);
		else ch=toupper(ch);
		st1[i]=ch;
		if (i==14) st1[15]='\0';
		i++;
		}
	   else st1[i]='\0';
  }
  gotoxy(10,7);printf("A palavra e =%s",st1);
  getchar();
  }

Exemplo6:-
Exercício utilizando funções string.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

void main()
{
  char ch=' ',st1[15];
  int i=0,sinal;
  clrscr();
  gotoxy(20,2);printf("<< Usando Funcoes String >>");
  gotoxy(10,5);printf("Digite uma palavra: ");
  do {
  sinal=1;
  do{
    gotoxy(30,5);clreol();
    gets(st1);
  }while (strlen(st1)>=15);
  for (i=0;i<strlen(st1);i++)
  {
  if (isupper(st1[i])) st1[i]=tolower(st1[i]);
		else st1[i]=toupper(st1[i]);
  if (isalpha(st1[i])==0) sinal=0;
  }
  }while (sinal==0);
  gotoxy(10,7);printf("A palavra em maiúscula = %s",st1);
  getchar();
  }

8- MATRIZ

	Uma matriz é um tipo de  dado usado para representar uma certa quantidade de variáveis de valores homogêneos.
	Imagine o seguinte problema: ler  a média final de 5 alunos e calcular a media geral. Você poderia declarar:
main()
{
float nota0, nota1, nota2, nota3, nota4,media=0;
 	printf(“Digite a nota do aluno 0:”);
scanf(“%f”, &nota0);
printf(“Digite a nota do aluno 1: “);
scanf(“%f”,&nota1);
……
printf(“Digite a nota do aluno 4: “);
scanf(“%f”,&nota4);
media=(nota0+nota1+nota2+nota3+nota4)/5;
printf(“A média geral é = %5.2f”,media);
}
	Imagine agora se você  pretendesse encontrar a média aritmética das notas de uma classe de 50 alunos ? Seria uma tarefa bastante volumosa!
	É  evidente que precisamos de uma maneira conveniente para referenciar tais coleções  de dados similares. Matriz é o tipo de dado oferecido para este propósito.
	A declaração 	float notas [5] armazena na memória  5 números reais, isto é,  é uma estrutura do tipo matriz de 5 membros ou elementos.
	Vamos escrever um programa que soluciona o nosso problema usando uma matriz.

main( )
{
	float notas [5],media=0;
	int i;
	for (i=0; i<5; i++)  
{	pritf(“Digite a nota do aluno %d: “,i);	scanf(“%f”, &notas[i]);	media+=notas[i];
}
media=media/5;
printf(“A média Geral= %5.2f”,media);
}

Uma matriz corresponde a um conjunto de informações do mesmo tipo, referenciadas por um nome comum. Para acessar um elemento específico em uma matriz é necessário especificar o seu índice. Em “C” toda matriz tem como seu 1º elemento o índice 0 (zero). Todas as matrizes consistem em posições contíguas na memória. O endereço mais baixo corresponde ao primeiro elemento e o mais alto ao último elemento. A matriz mais comum em “C” é a string, que é um vetor de caracteres terminados por um nulo (\0). As matrizes podem ter de uma a várias dimensões (unidimesional  ou  multidimensional).

Matrizes e ponteiros estão intimamente relacionados em “C” sendo assim o nome de uma matriz sem um índice é um ponteiro para o primeiro elemento da matriz. 

Forma Geral: 
tipo identificador [tamanho];

onde:
tipo: qualquer tipo defino na linguagem “C”.
tamanho :- define quantos elementos a matriz irá armazenar. Também pode estabelecer a dimensão da matriz.

Em “C” toda matriz tem 0 (zero) como o índice do seu primeiro elemento, portanto quando se declara :

	int  x[10];

A representação gráfica da  matriz na memória:-

x
										
0	1	2	3	4	5	6	7	8	9	

Esta estrutura contem uma matriz com 10 elementos que vão do índice x[0] até o índice x[9]. 

“C” suporta matrizes multidimensionais. A forma mais comum é a matriz bidimensional que corresponde a uma matriz de matrizes unidimensionais. O limite para as dimensões de uma matriz é determinado pelo compilador.

Forma geral :-

tipo identificador [dim1] [dim2] .. [dimn];
onde:
tipo: qualquer tipo defino na linguagem “C”.
[dim1][dim2]..[dimn] :- define quantos dimensões a matriz irá conter. 

Exemplo:-

	int  y[2][3];  

A representação gráfica da  matriz na memória:-

y
	0	1	2	
0				
1				

O primeiro índice da matriz se refere ao número de linhas e o segundo ao número de colunas.

Para manipulação das informações armazenadas em uma matriz  devemos utilizar o nome da variável seguida do índice do elemento. Exemplos:-

Em matrizes unidimensionais:-

	Int x[10];
	x[0]=10;
	x[1]=30;
	scanf(“%d”,&x[2]);
scanf(“%d”,&x[3]); 
x[4]=x[2] +x[1];
...

Em matrizes multidimensionais:-

	Int y[2][3];
	y[1][1] = -8
	scanf(“%d”,&y[0][0]);
	y[2][1] = y[1][1] *2;
           ...

Exemplos:-
float lista[100];
int  x[5][2];
char  nome[2][20];
double m[2][3][5];
			float list[ ] = {3,-2,12,4.4,3.5};
			char mensagem[ ] = “ok!!” / já insere automaticamente o \0 
			char cor[4]= {‘V’,’E’,’R’,’\0’};
			int   mat[2][2] = {1,1,2,4}

Exemplo1:- No programa abaixo temos uma matriz numérica de dimensão 3x4.

#include <stdio.h>
#include <conio.h>

void main()
{
  int t,i,num[3] [4];
  clrscr();
  for (t=0;t<3;++t)
	for (i=0;i<4;++i)
	  {
		num[t] [i] = (t*4)+i+1;
		printf(“%d\n”,num[t][i]);
	}
   getchar();
}

Neste exemplo, num[0][0] tem o valor 1, num[0][1], o valor 2, num[0][2] o valor 3 e assim por diante. O valor num[2][3] será 12. 

A estrutura que se forma na memória é:

	0	1	2	3	
0	1	2	3	4	
1	5	6	7	8	
2	9	10	11	12	

Quando temos uma matriz de strings o índice esquerdo indica o número de strings e o índice direito especifica o comprimento  máximo de cada string. Em “C” para para acessar uma string individual é necessário apenas indicar o índice esquerdo. 

Exemplo2: 

char n[5][10];

A representação gráfica da  matriz na memória:-

n
	0	1	2	3	4	5	6	7	8	9	
0											
1											
2											
3											
4											

Os elementos da matriz podem ser acessados de várias formas como por exemplo se desejarmos trabalhar com a string inteira:

	     gets(n[0]); 
	     gets(n[1]);
	     scanf(“%s”,n[2]); // não leva & pois já aponta para o endereço de memória
	     scanf(“%s”,n[3]);
	     .....

Se desejarmos acessar os elementos da matriz como caracteres poder ter:

	     scanf(“%c”,&n[0][0]);
	     scanf(“%c”,&n[0][1]); 
	     ....

OBS:-	Em “C” o nome da matriz sem um índice é um ponteiro para  o 1º elemento da matriz por este motivo não é necessária a utilização do &. Posteriormente este assunto (ponteiros) será estudado com mais detalhes.

char teste[10];

&teste[0] ou teste, produzem os mesmos resultados. &teste[0] é menos usado. 

Por este motivo usamos:
 	
gets(teste)  ou scanf(“%s”,teste);

Exemplo1:-
Dados: o modelo do produto e o preço em três diferentes lojas desenvolver   um programa para calcular e exibir a m‚dia dos preços.
  
#include <stdio.h>
#include <conio.h>

void main()
{	char modelo[20];
	float preco[3],media=0;
	int i;
	clrscr();
	printf("\t\t Modelo....: ");
	gets(modelo);
	for (i=0;i<3;i++)
	{	printf("\t\t Preco %i ª loja: ",i+1);
		scanf("%f",&preco[i]);
		media+=preco[i];
	}
	media=media/3;
	printf("\t\t Produto: %s\t Tem Preco medio:%8.2f\n",modelo,media);
	getchar();getchar();
}

Exemplo 2:
Desenvolver um programa que prepare um levantamento de preços de 5 produtos dados: o modelo do produto e o preço em três diferentes lojas. Calcular e exibir  a média dos preços encontrados.

#include <stdio.h>
#include <conio.h>

void main()
{	char modelo[5][15];
	float preco[5][3],media=0;
	int i,j,c,l=4;
	clrscr();
	gotoxy(10,2);printf("MODELO");
	gotoxy(30,2);printf("1ª LOJA");
	gotoxy(40,2);printf("2ª LOJA");
	gotoxy(50,2);printf("3ª LOJA");
	gotoxy(66,2);printf("MEDIA");
	for (i=0;i<5;i++,l+=2)
	 {
	   gotoxy(05,l);scanf("%s",modelo[i]);
	   c=30;
	   for (j=0;j<3;j++,c+=10)
	     {
		gotoxy(c,l);scanf("%f",&preco[i][j]);
		media+=preco[i][j];
	     }
	    media=media/3;
	    gotoxy(c+5,l);
	    printf("%6.2f",media);
	   }
	getchar();
	getchar();
}

Exemplo 3:-
Desenvolver um programa que leia uma matriz unidimensional de 5   números inteiros  exiba a matriz na ordem inversa.

#include <stdio.h>
#include <conio.h>

void main ()
{ 	int x[5],l=4;
	clrscr();
	gotoxy(5,3);printf("MATRIZ NORMAL");
	for (int i=0; i<5; i++){
	  gotoxy(10,i+4);scanf("%d",&x[i]);}
	gotoxy(35,3);printf("MATRIZ INVERTIDA");
	for (i=4;i>=0;i--,l++){
	gotoxy(40,l);
	printf("%d",x[i]);}
	getchar();getchar();
}

Exemplo 4:-
Desenvolver um programa que leia dois vetores a e b de 7 elementos cada   contendo números inteiros e calcule e exiba uma matriz que dever  conter   na primeira coluna os elementos do vetor a, na segunda coluna os elementos do vetor b e na terceira coluna soma da coluna  a mais a coluna b.

  #include <stdio.h>
  #include <conio.h>

  void main()
  {
	int a[7],b[7],c[7][3],i;

	textbackground(15);
	textcolor(1);
	 clrscr();
	 printf("\t\t EXERCICIO COM M A T R I Z E S\n");
	 for (i=1;i<=80;i++)
	 { gotoxy(i,3);printf("%c",'²');
	   gotoxy(i,5);printf("%c",'²');
	 }
	 textcolor(5);
	 gotoxy(5,4);cprintf("VETOR A: ");
	 gotoxy(30,4);cprintf("VETOR B: ");
	 gotoxy(55,4);cprintf("MATRIZ C: ");
	 for (i=0;i<7;i++)
	 {
	   gotoxy(8,i+6);scanf("%d",&a[i]);
	   gotoxy(33,i+6);scanf("%d",&b[i]);
	   c[i][0]=a[i];
	   c[i][1]=b[i];
	   c[i][2]=a[i] + b[i];
	   gotoxy(55,i+6);
	   printf("%d   %d   %d",c[i][0],c[i][1],c[i][2]);
	 }
	  gotoxy(30,20);textcolor(5);cprintf("TECLE ALGO !!");
	  getchar();getchar();
  }

9- BIBLIOTECAS PADRÃO DA LINGUAGEM C

	Essas bibliotecas são fornecidas com o compilador C e são chamadas de Arquivos de Cabeçalho e geralmente possuem a extensão .h. Abaixo estão relacionados alguns desses arquivos sendo que informações mais completas podem ser encontradas no livro de “C” Completo e Total (Shildt):

Arquivo de Cabeçalho	Descrição	
conio.h	define diversas funções usadas para chamar as rotinas de E/S do console no DOS.	
dos.h	contém diversas constantes e fornece as declarações necessárias para as chamadas ao DOS .	
ctype.h	contém informações usadas para conversão de caracteres.	
graphics.h	define protótipos para as funções gráficas.	
math.h	define protótipos  das funções matemáticas.	
stdlib.h	define protótipos para funções de conversão numérica e outras.	
string.h	define protótipos de funções para manipulação de strings.	
stdio.h	declara tipos e macros para  o pacote de E/S padrão e declara arquivos pré-definidos de E/S.