Documente Academic
Documente Profesional
Documente Cultură
Introduo
A linguagem C++ foi desenvolvida nos Laboratrios da BELL. Ela baseada na linguagem
C, mas acrescenta caractersticas de uma linguagem orientada a objetos.
Nosso estudo no far meno a orientao a objetos.
A linguagem C++ "Case Sensitive", isto , maisculas e minsculas fazem diferena.
1.2
BIBLIOTECA math.h
Calcula o valor absoluto real d
fabs(double d)
sin(double arco)
cos(double arco)
tan(double arco)
asin(double arco)
acos(double arco)
atan(double arco)
BIBLIOTECA string.h
3
2. Sada
O objeto cout permite que enviemos dados/mensagens para a tela.
No usando namespace
Controle/Caracter
nulo (null)
campainha (bell)
retrocesso (backspace)
tabulacao horizontal
nova linha (new line)
tabulacao vertical
alimentacao de folha (form feed)
retorno de carro (carriage return)
aspas (")
apostrofo (')
interrogacao (?)
barra invertida (\)
cout<< ;
cout<<variavel<<endl;
cout<< ;
cout<<variavel<<endl;
std::cout<< ;
std::cout<<variavel<<endl;
Seqncia de escape
\0
\a
\b
\t
\n
\v
\f
\r
\"
\'
\?
\\
3. Constantes e variveis
3.1 Constantes
O C++ possui quatro tipos bsicos de constantes: inteiras, de ponto flutuante,
caracteres e strings. Constantes inteiras e de ponto flutuante representam nmeros de um
modo geral.
3.1.1 Constantes inteiras
As constantes inteiras na linguagem C++ podem ser escritas no formato decimal (base
10), hexadecimal (base 16) ou octal (base 8).
Exemplos:
Decimal: 12
Octal : 033 ( em decimal vale 27. O zero antes do nmero caracteriza a constante
octal)
Hexadecimal: 0xff ( em decimal vale 255. O zero e o x antes do nmero caracterizam
a constante hexadecimal)
3.1.2 Constantes de ponto flutuante
So nmeros reais com um ponto decimal e (opcionalmente) um expoente.
Exemplos:
5
char nome_da_string[tamanho];
Como precisamos reservar uma posio para o terminador, sempre iremos declarar o
tamanho necessrio mais um.
Vamos supor que declaremos uma varivel de nome palavra de 11 posies(char
palavra[11]; ) e armazenemos a palavra PROGRAMAS nela.
bom ressaltar que a linguagem C++ no inicializa as variveis e toda clula no usada
tm valor indeterminado.
No se esquea de inicializar as variveis de seus programas, pois coisas incrveis
podem acontecer!
As strings so consideradas vetores de caracteres( matriz linha). Como na Matemtica,
para se acessar um determinado caracter de uma string, basta "indexarmos".
3.2 Variveis
A varivel um lugar(endereo) na memria principal que armazena um dado e tem um
nome associado para facilitar a programao .
Em C++, as variveis podem ser declaradas no inicio do programa, mas poderemos
tambm declarar dentro de algumas estruturas, diferentemente de outras linguagens. Estas
variveis podem ser de vrios tipos: int (inteiro), float (real de simples preciso) , char
(caracter nico), double (real de dupla preciso).
A classe String ser vista em outro momneto.
Tamanho
1 byte
4 bytes
4 bytes
8 bytes
Intervalo
-128 a 127
-2147483648 a 2147483647
3.4e-38 a 3.4e38
1.7e-308 a 1.7e308
Uso
nmero muito pequeno e caracter ASCII
contador, controle de lao
real (preciso de 6dgitos)
cientfico (preciso de 10 dgitos)
4. Atribuio
Consiste em atribuir um valor a uma varivel. Em C ++, o comando de atribuio tem a
seguinte sintaxe:
< nome_da_varivel > = <contedo> ;
Exemplos:
a = 12 ;
peso = 65.2; sexo ='f'; idade1 = 21; idade2 = 34;
Observao 1: Em C++, possvel declarar e inicializar uma varivel: int a = 12;
Observao 2: Em C++, possvel inicializar vrias variveis: x =t =s = 0;
9
5. Entrada de dados
scanf
5.1 cin
cin>>nomedavarivel;
cin>>nomedavarivel1>> nomedavarivel2;
O objeto cin permite que o usurio digite dados atravs do dispositivo padro de
entrada: teclado. O operador >> chamado de extrao.
#include <iostream>
using namespace std;
int main()
{ int idade; float altura;
cout<<"\nDigite idade: " ; cin>>idade;
cout<<"\nDigite altura: " ; cin>>altura;
cout<<"\n\n\nIdade: "<<idade;
cout<<"\nAltura: "<<altura<<endl;
system("pause");
#include <iostream>
using namespace std;
int main()
10
5.2 cin.getline
Este mtodo permite a leitura de um vetor de char inclusive com espaos e no
deixando nada no buffer.
Sintaxe:
cin.getline( <nome do vetor de caracteres>, <tamanho-1> );
#include <iostream>
using namespace std;
int main()
{ char sexo; char nome[30];
cout<<"\nDigite nome: " ; cin.getline(nome,29);
cout<<"\nDigite sexo(m/f): " ; cin>>sexo;
cout<<"\n\n\nNome: "<<nome;
cout<<"\nSexo: "<<sexo<<endl;;
system("pause");
}
5.3 cin.get
Este mtodo permite a leitura de um char.
11
#include <iostream>
using namespace std;
int main()
{ char sexo1,sexo2;
cout<<"\nDigite sexo(m/f) " ;
cin>>sexo1;
cout<<"\nDigite sexo(m/f): " ;
cin>>sexo2;
cout<<"\n\n\nSexo: "<<sexo1;
cout<<"\nSexo: "<<sexo2<<endl;;
system("pause");
}
12
6. Operadores Aritmticos
Existem cinco operadores aritmticos em C ++. Cada operador aritmtico est
relacionado a uma operao aritmtica elementar: adio, subtrao, multiplicao e diviso.
Existe ainda um operador (%) chamado operador de mdulo cujo significado o resto da
diviso inteira.
Operador
+
*
/
%
Operao
adio
subtrao
multiplicao
diviso
mdulo (resto da diviso inteira)
Sintaxe:
operando1 operador operando2
onde operador um dos smbolos mostrados acima e operando uma constante ou um
identificador de varivel.
Exemplos:
12 + 5 -> 17
12 * 5 -> 60
12 / 5 -> 2 quando se divide dois inteiros, o resultado um inteiro
12 % 5 -> 2 resto da diviso inteira
Observao: Se voc precisar dividir dois nmeros inteiros e quiser a resposta em
real, existe duas sadas:
1- Coloque um ponto em um dos operandos caso, pelo menos um, seja uma
constante: 12 / 5. .
2- Caso os dois operandos sejam variveis, faa: (float) a/b .
No existe em C++, como existe em outras linguagens, um operador especfico para a
operao de potenciao (ab). Existe, porm, uma funo de biblioteca (pow(...,...)) que
realiza esta operao, ou voc poder criar quando aprender a usar as funes log e exp..
6.1
Operadores
Prioridade
parnteses
()
interno externo
funo
nome()
ED
incremental, lgico
++ -- !
ED
aritmtico
*/%
ED
aritmtico
+-
ED
relacional
ED
relacional
== !=
ED
lgico
&&
ED
lgico
||
ED
condicional
?:
ED
atribuio
= += -= *= /= %=
ED
6.2
Muitas vezes queremos alterar o valor de uma varivel realizando alguma operao
aritmtica com ela.
A linguagem C++ apresenta instrues otimizadas com o uso de operadores ditos
operadores de atribuio aritmtica. Os smbolos usado so (+=, -=, *=, /= , %=).
Sintaxes:
14
Instruo Equivalente
cont = cont + 1;
j=ji;
num = num * (1 + k);
divide = divide / 5;
resto = resto % 2;
Operadores Incrementais
}
15
6.4
Significado
maior que
menor que
maior ou igual a
menor ou igual a
igual a
diferente de
Sintaxe:
16
Matemtica
e
^
ou
v
no |
C
&&
||
!
17
SADA
0
1
1
1
A estrutura if...else uma estrutura de controle do C++ muito fcil de ser usada.
Aps o teste, o fluxo poder seguir dois caminhos, isto , se o teste resultar em uma
verdade, ser executado o comando ou bloco de comandos que se encontra aps o fecha
parnteses do teste, caso contrrio, se existir, ser executado o comando ou bloco de
comandos que se encontra aps o comando else.
18
19
onde:condio
1,
lgicas ou relacionais.
instrues.
if(condio 1)
{
bloco 1
}
...
else if(condio N)
{
bloco N
}
else
{
bloco P
}
Se a condio 1
for verdadeira o bloco 1
executado. Caso contrario, as condies sero avaliadas, sucessivamente at que seja
verdadeira ou chegue ao ltimo else, onde o bloco P seria executado. Observe que
apenas um dos blocos executado.
7.2
Estrutura switch...case
20
8. Estruturas de repetio
Trs so as estruturas de repetio disponveis na linguagem C ++: for, while e do ...
while. Em todas as estruturas estar presente pelo menos uma expresso para
controlar a repetio.
8.1 Estrutura de repetio: for
A estrutura do for a mais simples estrutura de repetio e usada para repetir
um ou vrios comandos tantas vezes quanto desejarmos. a estrutura mais indicada
quando o nmero de repeties for conhecido embora, as outras duas estruturas
tambm possam ser usadas. O controle do nmero de repeties, na maioria das vezes,
feito por uma varivel chamada de varivel contadora.
A estrutura do for na linguagem C++ um pouco diferente das demais linguagens,
pois a condio pode no se prender somente a uma varivel contadora.
21
Sintaxe
Sintaxe na prtica
while(condio)
{
bloco de comandos
}
22
Esta estrutura parecida com while. Sua diferena que o bloco executado pelo
menos uma vez, pois testa ao final . Esta estrutura repete enquanto a condio for
verdadeira.
Sintaxe:
do
{
bloco de comandos
}
while(condio);
onde: condio uma expresso lgica ou numrica.
bloco de comandos um conjunto de instrues.
9 Estruturas
As estruturas em C++ podem ser homogneas e heterogneas. Inicialmente, vamos
abordar as homogneas, pois so mais familiares uma vez que conhecemos seu conceito
da matemtica quando estudamos matrizes.
9.1 Estruturas homogneas
Em C++, o uso de matrizes de fundamental importncia e existe uma relacionamento
estreito entre matrizes e ponteiros que estudaremos mais adiante.
A grande novidade que estudaremos ser o uso de matrizes com estruturas
heterogneas.
As matrizes so tabelas na MP e podem ter uma ou mais dimenso. Quando tem
somente uma dimenso, tambm chamamos de vetor.
23
Se declararmos pal com tamanho 5, lembre-se de que s podemos usar 4 posies, pois
uma reservada para o finalizador \0 que indica o fim do vetor.
bom voc j ir se acostumando com este conceito de apontamento, pois para se
programar bem em C, precisaremos dominar o conceito de ponteiros.
9.1.1 Declarando uma matriz:
tipo nome do conjunto [ ... ] [ ...] ... ;
Exemplos:
/* declara uma matriz unidimensional de 5 elementos inteiros */
int num[ 5 ];
/* declara uma matriz bidimensional com 100 linhas e 4 colunas do tipo float */
float notas [ 100 ][ 4 ];
/* declara uma matriz bidimensional com 100 linhas e 30 colunas do tipo char */
char nomes [ 100 ][ 30 ];
Toda matriz para guardar nomes, na linguagem C ++, bidimensional, pois o primeiro
ndice indica a quantidade de nomes e o segundo o nmero de caracteres 1 que sero
armazenados em cada nome.
9.1.2 Armazenamento
O armazenamento na matriz poder ser feito atravs de um comando de leitura ou de
atribuio.
24
9.1.2.2 Atribuio
Podemos tambm inicializar as matrizes atravs de atribuies:
Exemplos:
int vet[4]={6,7,8,9};
float nota[3]={8.5,6.2,9.8};
char nome[12]="Joo Renato";
char nomes[4][30]={"JOO", "MARIA", "PEDRO","FILIPE"};
int mat[][3]={1,2,3,4,5,6,7,8,9};
/* na declarao/atribuio acima, assumido 3 como nmero de linhas */
#include <iostream>
using namespace std;
int main()
{int L,c;
int ias_meses[][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,
31,30,31,31,30,31,30,31};
cout<<"\n\nPara anos nao bissextos, primeira linha e para bissextos,
segunda linha\n\n";
for(L=0;L<2;L++)
{ for(c=0;c<12;c++)
cout<<dias_meses[L][c]<<"
";
cout<<"\n\n";
}
system("pause");
}
25
9.1.3 Sada
/*um dimensao MATRIZ COLUNA*/
/*um dimensao MATRIZ LINHA*/
...
...
system(cls);
system(cls);
cout<<\nTitulo\n;
cout<<\nTitulo\n;
for(a=0;a<tamanho;a++)
for(a=0;a<tamanho;a++)
cout<<"\n: "<<nomeVetor;
cout<<nomeVetor <<"\t";
...
...
/*duas dimensoes TODOS OS ELEMENTOS*/
...
system(cls);
cout<<\nTitulo\n;
for(L=0;L<tamanhoLinha;L++)
{ for(c=0;c<tamanhoColuna;c++)
cout<<nomeMatriz[L][c]<<"\t";
cout<<\n;
}
...
/*duas dimensoes ALGUNS ELEMENTOS*/ Condio
...
system(cls);
(L==c)
cout<<\nTitulo\n;
s diagonal Principal
for(L=0;L<tamanhoLinha;L++)
{ for(c=0;c<tamanhoColuna;c++)
(L!=c)
if( condio )
todos
menos
a
diagonal
cout<<nomeMatriz[L][c]<<"\t"; Principal
else
cout<<"\t";
(L<c)
elementos
acima
da
cout<<\n;
diagonal principal
}
...
(L>c) elementos abaixo da
diagonal principal
9.1.5 Operaes
28
9.1.6 Ordenao
Vrios so os mtodos de ordenao. Alguns so mais eficientes e mais complicados e
outros menos eficientes para um grande conjunto de dados, porm mais simples.
Para que possamos ordenar nomes, precisaremos conhecer duas funes que fazem
parte da biblioteca string.h:
Funo strcmp
Esta funo tem dois argumentos do tipo vetor de char(ou cadeia de caracteres).
Os argumentos so comparados e devolvido um dos resultados:
strcmp(arg1,arg2)
0
se os dois argumentos forem iguais.
nmero > 0 - se o primeiro argumento vier na ordem alfabtica depois do segundo.
nmero < 0 - se o primeiro argumento vier na ordem alfabtica antes do segundo.
Observao: Voc deve estar estranhando a necessidade desta funo, mas na
linguagem C++, como j falamos a varivel vetor de char um endereo, e no tem
sentido comparamos endereos. , portanto, expressamente proibido usar operadores
relacionais para comparar este tipo de varivel.
Funo strcpy
Esta funo tem dois argumentos: o primeiro o destino e o segundo, a origem. Copia
a origem no destino.
strcpy(arg1,arg2);
Observao: , portanto, expressamente proibido usar comando de atribuio este
tipo de varivel.
1: Ordenao por Insero
Ordena a matriz somente quando realmente for necessrio.
for( L = 1 ; L < tamanho; L++)
{ tmp= nomeVetor[L];
for (c = L; c >0 && tmp < nomeVetor[c-1]; c--)
nomeVetor[c] = nomeVetor[c-1] ;
nomeVetor[c] = tmp ;
}
29
Bubble Sort
vet[L]=aux;
tam *= 2;
9.1.4 Pesquisa
9.1.4.1 Seqencial
Este mtodo o mais simples, pois comea no primeiro elemento s para quando
encontra ou chega ao final.
cout<<"\nQual ... a ser procurado(a)? ";
cin>>nomeProcura;
achou=0;
for(L=0;L<5 && achou==0;L++)
{ if(n_mat==mat[L])
{
achou=1;
pos=L;
}
31
system("pause");
}
sintaxe 2
struct nome da estrutura
{ tipo da varivel 1 nome da varivel 1;
tipo da varivel 2 nome da varivel 2;
tipo da varivel n nome da varivel n;
};
struct nome da estrutura nome do struct1, nome do struct2;
/* ao fazermos esta declarao, dizemos que os dois structs
so do tipo nome da estrutura*/
Exemplos:
cin>>dados.idade;
cout<<\n<<dados.idade;
nome do struct[posio]. nome do membro -> matriz de struct
Exemplos:
cin>>cad[3].idade;
cout<<\n<<cad[3].idade;
Exemplo 1:
Guardar nome e duas notas de um aluno e imprimir a mdia e o nome.
#include <iostream>
using namespace std;
int main()
{
struct
{ char nome[30];
float nota1,nota2;
}aluno;
cout<<"\nNome : "; cin.getline(aluno.nome,29);
cout<<"\nNota 1: "; cin>>aluno.nota1;
cout<<"\nNota 2: "; cin>>aluno.nota2;
cout<<"\nMedia: "<<(aluno.nota1+aluno.nota2)/2;
cout<<"\t"<<aluno.nome<<"\n";
system("pause");
}
34
Exemplo 2:
Guardar nome e duas notas de trs alunos e imprimir a mdia e o nome.
#include <iostream>
using namespace std;
int main()
{ int a;
struct Cadastro
{ char nome[30];
float nota1,nota2;
}aluno[3];
for(a=0;a<3;a++)
{ cout<<"\nNome : ";cin.getline(aluno[a].nome,29);
cout<<"\nNota 1: "; cin>>aluno[a].nota1;
cout<<"\nNota 2: "; cin>>aluno[a].nota2;
cin.get();
}
system("cls");
cout<<"\n\nMedia\tNome\n\n";
for(a=0;a<3;a++)
{ cout<<"\n"<<(aluno[a].nota1+aluno[a].nota2)/2<<"\t";
cout<<aluno[a].nome<<"\n";
}
system("pause");
}
35
36
37
10.2 Vantagens
As funes atravs da passagem de parmetros e atravs do seu nome permitem que
sejam retornados valores rotina chamadora e desta forma, esses valores podero ser
impressos, atribudos a uma varivel ou podem servir em operaes aritmticas entre
outras.
Os principais objetivos de uma funo so:
Dividir e estruturar um algoritmo em partes logicamente coerentes;
Facilidade em testar os trechos em separados;
O programador poder criar sua prpria biblioteca de funes, tornando sua
programao mais eficiente uma vez que poder fazer uso de funes por ele escritas em
vrios outros programas com a vantagem de j terem sido testadas;
Maior aumentar a legibilidade de um programa;
Evitar que uma certa seqncia de comandos necessria em vrios locais de um
programa tenha que ser escrita repetidamente nestes locais, diminuindo tambm, o cdigo
fonte, ;
Tudo isto justifica o uso de funes em nossos programas
identificador
Nome da funo
(lista de parmetros)
( tipo1 nome1, tipo2 nome2 )
Exemplos:
int quadrado(int l)
char maiuscula(char n[] )
39
Exemplo 3:
41
funcao1( ...)
{...
{ ...
...
< chamada da funo 1 >
...
main()
}
{...
retorna(...);
funcao1( ...)
{ ...
retorna(...);
...
}
...
...
...
}
42
44
}
Exemplo 3:. Multiplica dois nmeros.
int mult(int m1,int m2)
{int m;
46
}
Exemplo 4: Soma os pares em um intervalo de 1 at n-1.
int somaPares(int n)
{
if(n==0)
return(n);
else
if(n%2==0)
return n+somaPares(n-1);
else
return somaPares(n-1);
}
Exemplo 5: Potncia de 10.
int pot10(int pot)
{
if(pot==0)
return(1);
if(pot>0)
return(10*pot10(pot-1));
}
Exemplo 6: Fatorial de um nmero.
int fat(long int m1)
{ if(m1==0)
return 1;
else
return m1*fat(m1-1);
}
Tipo da matriz
int
Endereo
60000
47
60001
60002
60003
60004
60005
60006
60007
60008
60009
60010
60011
60012
60013
60014
60015
60016
60017
60018
60019
for(c=0;c<strlen(n);c++)
n[c]=toupper(n[c]);
}
Exemplo 2: Funo Troca
char troca1(char x[], char y[])
{ char aux[30];
strcpy(aux,x);
strcpy(x,y);
strcpy(y,aux);
}
Exemplo 3: Funo ordena vetor
void ordena(int v[],int t)
{ int c,l,aux;
for(c=0;c<t-1;c++)
for(l=c+1;l<t;l++)
if(v[c]<v[l])
{aux=v[c];v[c]=v[l];v[l]=aux;}
}
48
49
50
51
...
mat[0][1]
lixo
6003
60004
1 linha
...
6007
mat[1][0]
lixo
60008
...
mat[1][1]
lixo
60011
60012
2 linha
...
60015
mat[2][0]
lixo
60016
...
mat[2][1]
lixo
60019
60020
...
60023
3 linha
52
54
Pilhas
1. Conceitos
a ED mais simples e por esta razo muito utilizada.
Estruturas de dados dinmicas onde os elementos podem ser estruturas estticas ou
dinmicas.
No existe buracos.
So conhecidas como estruturas FILO first in, last out (o primeiro elemento que
entra o ltimo a sair. A sigla LIFO last in, first out tem o mesmo significado:
ltimo a entrar, primeiro a sair).
A insero sempre no topo da pilha e a remoo tambm.
Muito usadas pelo SO: um exemplo na chamada de funes onde o endereo de
retorno empilhado.
55
/* Insere */
void empilha(int valor)
{ int x;
if(qtde == 10)
/* se a pilha estiver cheia */
cout<<"\nPILHA CHEIA. O VALOR DIGITADO NAO FOI INSERIDO.";
else
{ for(x=qtde;x>0;x--)
pilha[x]=pilha[x-1];
pilha[0]=valor;
qtde++;
}
}
56
/* Mostra a pilha */
void imprime()
{
int i;
if(qtde==0) cout<<"\nPILHA vazia";
else
{
cout<<"\n\nElementos da PILHA\n\n";
for(i=0;i<qtde;i++)
cout<<"\n"<<pilha[i];
cout<<"\n\nQuantidade de elementos da pilha: " << qtde<<" \n\n";
}
}
/* Limpa a pilha */
void limparPilha()
{
while(qtde != 0)
desempilha();
cout<<"\nPILHA Vazia";
}
int main()
{ int op, v, val;
57
cout<<"Desempilhou: "<<v<<endl;;
case 3: imprime();
break;
case 4: limparPilha();
break;
default: cout<<"\nOPCAO INVALIDA";
}
cout<<"\n\n";system("pause");
} while(op != 4);
}
58
No difcil de fazer uma analogia com estrutura da Fila e as filas que enfrentamos no
nosso dia-a-dia: a fila do banco, a fila para comprar um ingresso no cinema, etc.
Se pensarmos em termos de um SO para gerenciar a impresso de vrios documentos
tambm fica fcil entendermos a filosofia da estrutura da Fila: o primeiro documento a
chegar, o primeiro a ser impresso.
2. Operaes realizadas com a Fila
/* Inserir */
void inserir( int valor)
{
if (qtde == 10)
/* se a fila estiver cheia */
cout<<"\nFILA CHEIA. O VALOR DIGITADO NAO FOI INSERIDO.";
59
*/
}
else
{
fila[qtde]= valor;
qtde++;
}
/* Remover */
void remover()
{ int x;
if (qtde == 0)
cout<<"\nFILA Vazia";
else
{ cout<<"\nValor removido:"<<fila[0]<<endl;
for(x=1;x<qtde;x++)
fila[x-1]= fila[x];
qtde--;
}
}
/* Mostrar a Fila */
void listar()
{ int x;
if(qtde==0) cout<<"\nFILA vazia";
else
{
cout<<"\n\nElementos da fila\n\n";
for(x=0;x<qtde;x++)
cout<< fila[x]<<"\t";
cout<<"\n\nQuantidade de elementos da fila: "<<qtde<<endl;
}
}
/* Limpa a Fila */
void limparFila()
{ int x;
while (qtde != 0)
{ for(x=1;x<qtde;x++)
fila[x-1]= fila[x];
qtde--;
}
60
cout<<"\nFILA Vazia";
int main()
{ int op, val;
do
{system("cls");
cout<<"\n\n\nFILA FIFO - First in - First out\n";
cout<<"\n1- Inserir um valor na fila";
cout<<"\n2- Remover um valor da fila";
cout<<"\n3- Mostrar a fila";
cout<<"\n4- Sair";
cout<<"\nOPCAO: "; cin>>op;
switch(op)
{
case 1: cout<<"\nDigite um valor: ";
cin>>val;
inserir(val);
break;
case 2: remover();
break;
case 3: listar();
break;
case 4: limparFila();
break;
default: cout<<"\nOPCAO INVALIDA";
}
cout<<"\n\n";system("pause");
} while(op != 4);
61
62