Академический Документы
Профессиональный Документы
Культура Документы
Vetores
Em geral sabemos antecipadamente qual ser o nmero mximo de elementos no vetor. Ento, em C ou C++, basta fazer:
TIPO vetor[MAX_TAM];
Onde MAX_TAM uma constante que indica o nmero mximo de elementos que o vetor vai guardar. Se no soubermos o tamanho do vetor em tempo de compilao e o compilador utilizado for o gcc, podemos fazer:
TIPO vetor[n];
Onde n uma varivel que indica quantos elementos deve caber no vetor. O gcc gera cdigo para a alocao dinmica automaticamente. Um caso difcil de acontecer, mas que pode aparecer, quando temos que guardar dados em vetores antes de saber qual ser seu tamanho final. Isso pode acontecer, por exemplo, em um problema de grafos em que temos que usar listas de adjacncia e o grafo descrito por suas arestas. Nesse caso podemos utilizar o tipo vector de C++. Declaramos ele assim:
#include<vector> using namespace std; vector<TIPO> vetor;
Podemos ordenar vetores em C utilizando a funo qsort da stdlib.h. Para isso necessria uma funo de comparao que recebe dois elementos e retorna um valor negativo, 0 ou positivo se o primeiro elemento menor, igual ou maior que o segundo, respectivamente. Para a ordenao de um vetor de inteiros, usamos:
#include<stdlib.h> ... int comp(void *a, void *b) { return *((int*)a)-*((int*)b); }
Onde n o nmero de elementos no vetor. Mas para qu fazer isso se temos C++? muito mais simples:
#include<algorithm> using namespace std; int main() { int vetor[MAX_TAM]; ... sort(&vetor[0],&vetor[n]); ... }
Strings
C++ e Java do um bom suporte para o trabalho com strings. C uma pssima opo para trabalhar com esse tipo de dados. Cabealho:
C: C++ Java: #include<strings.h> #include<string> (nenhum)
Declarao:
C: C++: Java: char s[MAX_TAM]; string s; String s; ou StringBuffer s;
Consulta:
C: C++: Java: s[i] s[i]; s.charAt(i);
Alterao:
C: C++: Java: s[i] = c; s[i] = c; s.setCharAt(i,c); (somente para StringBuffer)
Cpia:
C: C++: Java: strcpy(dest, orig); dest = orig; dest = orig;
Concatenao:
C: C++: Java: strcpy(dest,s1); strcat(dest, s2); dest = s1+s2; dest = s1+s2;
Tamanho:
C, O(n): C++, O(1): Java, O(1): strlen(s); s.size(); s.length();
As strings em C++ possuem o mtodo c_str() que retorna um ponteiro para a string no formato de C (vetor de char terminado em '\0'). As strings em C++ e Java ainda possuem mtodos para encontrar uma string em outra, extrair substrings, inserir strings no meio de outras, inverter a cadeia, alm de outros.
Pilha
Um pilha em C ou C++ ou Java de no mximo MAX_TAM elementos do tipo TIPO pode ser definida simplesmente como:
TIPO pilha[MAX_TAM]; // Vetor onde sero guardados os elementos int tp=0; // Inteiro que diz o tamanho da pilha
importante ter em mente que o valor tp indica a posio onde o prximo elemento deve ser inserido, ou seja, uma posio frente do elemento no topo da pilha. Nmero de elementos:
tp
elem = pilha[--tp];
Com isso temos toda a funcionalidade de uma pilha de forma bem simples e eficiente e sem precisar definir explicitamente um novo tipo.
Fila
Um fila em C ou C++ ou Java em que se insira no mximo MAX_TAM elementos do tipo TIPO pode ser definida simplesmente como:
TIPO fila[MAX_TAM]; // Vetor onde sero guardados os elementos int fi=0; // Inteiro que aponta para o incio da fila int ff=0; // Inteiro que aponta para o fim da fila
importante ter em mente que a todo momento o valor fi indica a posio do elemento na frente da fila e o valor ff indica a posio onde ser inserido o prximo elemento. Nmero de elementos:
ff - fi
Com isso temos toda a funcionalidade de uma fila de forma bem simples e eficiente e sem precisar definir explicitamente um novo tipo. Note que o tamanho do vetor poderia ser apenas o nmero mximo de elementos simultaneamente na fila, realizando incrementos nos ponteiros com aritmtica modular. No entanto normalmente a memria mais do que suficiente para abrigar todos os elementos que sero inseridos, o que simplifica ao mximo nossa estrutura.
Mapas
Mapas so estruturas pouco utilizadas em competies, mas s vezes so necessrias. Quando eles aparecem normalmente so para mapear strings em inteiros. A linguagem C no oferece um suporte especial para mapas. Em geral pode-se criar dois vetores. Um que guarda as chaves e outro que guarda os valores. Faz-se uma busca
seqencial no vetor das chaves para encontrar o ndice e depois obtm-se o valor no outro vetor. O mais prtico usar C++:
#include <map> #include <string> using namespace std; ... map<string,int> mapa; mapa["teste"] = 10; string key = "teste"; int val = mapa[s]; // val recebe 10
bom lembrar que esse mapa implementado utilizando rvores, o que deixa a complexidade de consulta e alterao como O(log.n).
Estruturas em C++
Pilha #include <stack> stack <string> pilha; Mtodos: pilha.empty();//retorna true se a pilha estiver vazia pilha.pop();//remove o topo da pilha pilha.push(eu);//insere o argumento no topo da pilha pilha.size();//retorna o tamanho da pilha Fila #include <queue> queue <string> fila; Mtodos: fila.push("EU"); //adiciona no final da fila o argumento fila.empty();//retorna true se a fila estiver vazia fila.front();//retorna o primeiro elemento da fila fila.pop();//remove o primeiro elemento da fila Vector #include <vector> vector<int> vetor; vetor.empty();//retorna true se estiver vazio vetor.size();//retorna o tamanho do vetor vetor[0] vetor.front(); //retorna o primeiro elemento do vetor vetor.back(); //retorna o ultimo elemento do vetor vetor.push_back (eu);//insere um novo elemento ao final do vetor vetor.pop_back(); //remove o ultimo elemento vetor.clear();//limpa o vetor String #include <string> string a; a.c_str();//retorna um vetor de char a.clear();//limpa a string a[2]='a';// deque - manipulao de lista duplamente ligada list - manipulao de lista simplesmente ligada map - manipulao de conjunto associativo ordenado (associao: chave -> valor) set - manipulao de conjunto
Manipulao de Strings Segundo o dicionrio, o verbo manipular significa compor, misturar, manobrar ou operar sobre alguma coisa. String um tipo de dados que faz parte da linguagem C++ especificamente projetado para operar com seqncias de caracteres. Diferente da linguagem C++, a linguagem C no possui o tipo de dados string. A linguagem C utiliza o tipo de dados char para armazenar informaes de texto, que nada mais do que um conjunto de caracteres em uma matriz na memria. O tipo de dados string o tipo de dados mais familiar aos seres humanos. Ele pertence a uma classe com muitos recursos embutidos para operar de forma mais intuitiva e com algumas caractersticas adicionais comuns a linguagem C. Dessa forma, manipular uma string alterar, ou obter informaes sobre o que est armazenado nesse tipo de dados. Iterators: Iterators so as estruturas usadas para percorrer e/ou acessar os elementos contidos em um continer de maneira unificada. Estas estruturas escondem os detalhes da implementao. Dessa maneira, alm da programao ser facilitada fica menos propensa a erros. Um iterator deve permitir percorrer sobre o continer (++i, --i) e acesso (*i). So quatros os iterators: a) begin Retorna um iterator referindo-se ao primeiro caractere na string. b) end Retorna um iterator referindo-se ao elemento seguinte aps o ltimo caractere na string. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Teste de string"); string::iterator it; for ( it=str.begin() ; it < str.end() ; it++ ) cout << *it; cout << "\n"; }
c) rbegin
Retorna um iterator inverso, ou seja, o ltimo caractere na seqncia.
d) rend
Retorna um iterator inverso, ou seja, o primeiro caractere na seqncia. Exemplo: #include <iostream> #include <string> using namespace std;
main () { string str ("Maratona de programao"); string::reverse_iterator rit; for ( rit=str.rbegin() ; rit < str.rend(); rit++ ) cout << *rit; cout << "\n"; }
c) max_size Retorna o nmero mximo de caracteres que o objeto string pode conter. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Manipulao de Strings"); cout << "max_size: " << str.max_size() << "\n"; }
d) resize Redimensiona o contedo da string de n caracteres. Se n for menor que o comprimento atual da seqncia, o contedo reduzido aos seus primeiros n caracteres, sendo o resto descartado.
Se n for maior do que o comprimento atual da seqncia, o contedo ampliado para atingir um tamanho de n caracteres. Exemplo:
#include <iostream> #include <string> using namespace std; main () { size_t sz; string str ("Teste de string"); cout << str << endl; sz=str.size(); str.resize (sz+2,'!!'); //Resultado: Teste de string cout << str << endl << "\n"; str.resize (5); cout << str << endl << "\n"; //Resultado: Teste }
e) clear O contedo da string definido como uma seqncia vazia, apagando qualquer contedo anterior e deixando o seu tamanho em zero caractere. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Contedo da string"); cout << str << "\n"; str.clear(); cout << "Contedo aps clear(): " << str << "\n"; }
f)
empty Retorna se a string est vazia, ou seja, se seu tamanho zero. Esta funo no modifica o contedo da string. Exemplo:
#include <iostream> #include <string> using namespace std; int main () { string str ("Texto da String"); if (!str.empty()) cout << "A string no est vazia.\n"; else cout << "A string est vazia\n"; }
b) at Retorna o valor da string na posio informada. Esta funo se comporta como o operador [], exceto que a tambm executa uma verificao do intervalo, gerando uma exceo no caso da posio no existir na cadeia. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Teste de String"); cout << "Primeiro caractere: " << str.at(0) << "\n"; //Resultado: T cout << "Segundo caractere: " << str.at(1) << "\n"; //Resultado: e }
b) append O contedo da string atual estendido pela adio de uma seqncia de caracteres. Sintaxe: str.append(string, posio_inicial,
numero_de_caracteres_a_incluir);
Exemplo:
#include <iostream> #include <string> using namespace std;
main () { string str; string str2="Maratona "; string str3="de Preparao"; str.append(str2); //Resultado: str = "Maratona " str.append(str3,0,3); //"de " str.append("Programao", 11); //Resultado: "Programao" str.append(1,'.'); //Resultado: "." cout << str << "\n"; system("pause"); }
c) push_back Acrescenta um carter nico para o contedo da string, aumentando seu tamanho por um. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Maratona"); cout << "Antes: " << str << "\n"; str.push_back('x'); cout << "Depois: " << str << "\n"; //Resultado: Maratonax system("pause"); }
d) insert Insere uma string em outra a partir de uma determinada posio. Sintaxe: Sintaxe: str.insert(posicao, string_inserir, pos_inicial_str,
pos_final_str);
Exemplo:
#include <iostream.h> using namespace std; main () { string str1="nossa"; string str2="uri"; str1.insert(2,str2); //Resultado = nourissa str1.insert(2,"123456789",3,4); //Resultado = no4567urissa cout << str1 << "\n"; system("pause"); }
e) erase Apaga uma cadeia de caracteres a partir de uma posio inicial por uma determinada quantidade de caracteres. Sintaxe: Sintaxe: str.insert(posicao_inicial, quantidade_caracteres);
Exemplo:
#include <iostream.h> using namespace std; main () { string str1="nossa"; str1.erase(3,1); //nosa cout << str1; system("pause"); }
f)
replace Substitui uma string por outra. Sintaxe: str.replace(posio_inicial, quantidade_posicoes, str_substituir); Exemplo:
#include <string> #include <iostream> using namespace std; main() { string str = "Gosto de Java"; // vamos substituir Java por C str.replace(9, 4, "C"); cout << str << "\n\n"; }
Operadores sobre Strings a) copy Copia parte de uma string. Sintaxe: str.copy(string_destino, quantidade_caracteres, posio_inicial); Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str1 ("Testando strings...."); char str2[10]; str1.copy(str2, 7, 9); cout << str2 << "\n"; //Resultado: strings system("pause"); }
using namespace std; main() { string frase = "Maratona de Programao em C"; int pos = frase.find("Programao"); if(pos == string::npos) cout << "A substring nao foi encontrada.\n\n"; else cout << "A substring foi encontrada" << " na posicao " << pos << ".\n\n"; system("pause"); // pausa o programa }
c) rfind Localiza a ltima ocorrncia de uma string dentro de outra string. Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str ("Teste de string teste para maratona"); string key ("teste"); int found; found=str.rfind(key); cout << found << "\n"; //Resultado: 16 system("pause"); }
d) substr Retorna uma seqncia de caracteres que comea em uma determinada posio e tem um comprimento de n caracteres. Sintaxe: resultado = str.substr(posicao_inicial, quantidade_caracteres); Exemplo:
#include <iostream> #include <string> using namespace std; main () { string str="Ns estamos trabalhando com strings"; string str2; str2 = str.substr (12,11); //Resultado: trabalhando cout << str2 << "\n"; system("pause"); }
e) compare Compara duas strings. Retorna 0 se as strings comparadas so iguais, caso contrrio um nmero diferente de 0 retornado.
Para realizar a converso para minsculo basta alterar o parmetro ::toupper para ::tolower.
c) atoi Converte uma string para um valor inteiro. A parte fracionria ser desconsiderada. Exemplo:
#include <iostream.h> main() { int valor; char caractere[] = "123455.233"; valor = atoi (caractere); cout << valor; cout << "\n"; system("pause"); }
d) atol Converte uma string para um valor inteiro longo. A parte fracionria ser desconsiderada. Exemplo:
#include <iostream.h> main() { long int valor; char caractere[] = "123455.233"; valor = atol (caractere); cout << valor; cout << "\n"; system("pause"); }
f)
strtod
Converte uma string para um valor numrico real. A varivel erro receber um valor diferente de null se algum erro ocorrer na converso. A varivel erro dever ser do tipo char. Exemplo:
#include <iostream.h>
main() { char caracteres[] = "365.25 abc"; char * erro; double valor; valor = strtod(caracteres, &erro); cout << valor << "\n"; cout << erro << "\n"; system("pause"); }
g) strtol Converte a cadeia str para um valor numrico inteiro. A parte fracionria ser desprezada. A varivel erro receber um valor diferente de null se algum erro ocorrer na converso. A varivel erro dever ser do tipo char. O parmetro base significa em qual base o valor ser convertido (base = 10 decimal, base = 16 - hexadecimal). Sintaxe: strtol(str, &erro, base); Exemplo:
#include <iostream.h> main() { char caracteres[] = "365.25 abc"; char * erro; long int valor; valor = strtol(caracteres, &erro, 10); cout << valor << "\n"; cout << erro << "\n"; system("pause"); }
Inteiros a e b.
Sada:
Teste de Primalidade
Entrada:
Inteiro n.
Sada:
EXEMPLOS DE PROGRAMAS
Exemplo de programa que l 2 nmeros a e b e escreve a soma dos mesmos. Exemplo arquivo entrada 10 5 38 20 30 #include <iostream> using namespace std; int main() { int a, b; while (cin >> a >> b) { cout << a << " + " << b << " = " << a+b << endl; } return(0); } Exemplo arquivo sada 10 + 5 = 15 3 + 8 = 11 20 + 30 = 50
1) WERTYU
#include #include #include #include <iostream> <map.h> <string.h> <fstream.h>
using namespace std; map<char, char> m; main() { //Primeira Linha m['=']='-'; m['-']='0'; m['0']='9'; m['9']='8'; m['8']='7'; m['7']='6'; m['6']='5'; m['5']='4'; m['4']='3'; m['3']='2'; m['2']='1'; m['1']='`'; //Valores padro m['Q']='Q'; m['A']='A'; m['Z']='Z'; string linha, resultado; ifstream fin("entrada.txt"); // Abre arquivo de entrada para leitura ofstream fout("saida.txt"); //Cria um arquivo de sada getline(fin, linha); //Busca o valor da primeira linha while( fin ) { // Enquanto no for fim de arquivo //Segunda Linha m['W']='Q'; m['E']='W'; m['R']='E'; m['T']='R'; m['Y']='T'; m['U']='Y'; m['I']='U'; m['O']='I'; m['P']='O'; m['[']='P'; m[']']='['; m['\\']=']'; //Terceira linha m['\'']=';'; m[';']='L'; m['L']='K'; m['K']='J'; m['J']='H'; m['H']='G'; m['G']='F'; m['F']='D'; m['D']='S'; m['S']='A'; //Quarta linha m['/']='.'; m['.']=','; m[',']='M'; m['M']='N'; m['N']='B'; m['B']='V'; m['V']='C'; m['C']='X'; m['X']='Z';
resultado.clear(); for(int i=0;i<linha.length();i++) { resultado.push_back(m[linha[i]]); } fout << resultado << endl; //Escreve o resultado no arquivo de sada getline(fin, linha); //Busca o valor da prxima linha } fin.close(); fout.close(); system("pause"); }
2) Common Permutation
#include <iostream> #include <string> #include <fstream> using namespace std; string A, B; ifstream fin("entrada.txt"); // Abre arquivo de entrada para leitura ofstream fout("saida.txt"); //Cria um arquivo de sada void calcula() { int i, m, j, posicao; string caractere; string resultado (""); //Ordena as strings sort(A.begin(),A.end()); sort(B.begin(),B.end()); //Remove os espaos em branco remove(A.begin(), A.end(), ' '); remove(B.begin(), B.end(), ' '); for(i = 0; i< A.length(); i++) { for(j=0; j< B.length(); j++) { caractere = B[j]; if (A.compare(i, 1, caractere) == 0) { //verifica se o caractere no est no resultado posicao = resultado.rfind(caractere); if( posicao < 0 ) { resultado.push_back(B.at(j)); } } } } fout << resultado << endl; } main() { getline(fin, A); //Busca o valor da primeira linha getline(fin, B); //Busca o valor da segunda linha while( fin ) { calcula(); getline(fin, A); //Busca o valor da prxima linha getline(fin, B); //Busca o valor da prxima linha } fin.close(); fout.close(); system("pause"); } // Enquanto no for fim de arquivo
3) Primo #include <iostream> using namespace std; bool primo(int x) { int i; if (x<2) return(false); if (x==2) return(true); if (x%2==0) return(false); for(i=3;i*i<=x;i=i+2) { if (x%i==0) return(false); } return(true); } int main() { int a; while(cin >> a) { if (primo(a)) cout << "primo" << endl; else cout << "nao primo" << endl; } return(0); }
4) FatDiv escreve o fatorial se o nmero for impar ou a quantidade de divisores e os divisores se for par #include <iostream> #include <queue> using namespace std; queue <int> fila; long int fat(int x) { if (x<=1) return(1); else return(x * fat(x-1)); } int divisores(int x) { int i, cont; cont=2; fila.push(1); for(i=2;i*2<=x;i++) { if(x%i==0) { fila.push(i); cont++; } } fila.push(x); return(cont); } int main() { int a, cont; while(cin >> a) { if (a%2==0) { cout << a <<" possui " << divisores(a) << " divisores: "; cont = 0; while(!fila.empty()) { if (cont>0) cout << ","; cout << fila.front(); fila.pop(); cont++; } } else cout << a << "!=" << fat(a); cout << endl; } return(0); }
5) Campo Minado #include<iostream> #include<string> using namespace std; int main() { int n; int m; int campo = 0; while(cin >> n >> m) { string s[100]; cin.ignore(); if (n==0 || m==0) return 0; for(int p=0; p<n; p++) { s[p] == ""; for(int q = 0; q<m; q++) { char tempIn; cin >> tempIn; s[p] += tempIn; } } if(campo>0) cout << endl; campo++; cout << "campo #" << campo << ":"<< endl; // Calcula s for(int p=0; p<n; p++) // Checa os 8 quadrados ao redor { bool cima = false; bool baixo = false; if(p < 1) cima = true; if(p == n-1) baixo = true; for(int i=0; i<s[p].length(); i++) { if(s[p][i] != '*') { int count = 0; bool esquerda = false; bool direita = false; if(i < 1) esquerda = true; if(i == m-1) direita = true; if(!cima && !esquerda) if(s[p-1][i-1] == '*') count++; if(!cima)
if(s[p-1][i] == '*') count++; if(!cima && !direita) if(s[p-1][i+1] == '*') count++; if(!esquerda) if(s[p][i-1] == '*') count++; if(!direita) if(s[p][i+1] == '*') count++; if(!baixo && !esquerda) if(s[p+1][i-1] == '*') count++; if(!baixo) if(s[p+1][i] == '*') count++; if(!baixo && !direita) if(s[p+1][i+1] == '*') count++; cout << count; }else{ cout << "*"; } } cout << endl; } } return 0; }
6) Caminho mais curto simples #include <iostream> using namespace std; #define MAXNODES 50 // Verificar se o tamanho est adequado
#define INFINITY 32768 #define MEMBER 1 #define NONMEMBER 0 struct arc { int adj; // se adj=1 ento ADJACENTE; se adj=0 ento NO ADJACENTE int weight; // peso da aresta }; struct graph { struct arc arcs[MAXNODES][MAXNODES]; }g; // matriz de adjacncias
void init_graph () { // inicializa matriz de adjacncia que representa o grafo for (int i = 0; i < MAXNODES; i++) { for (int j = 0; j < MAXNODES; j ++) { g.arcs[i][j].adj = 0; g.arcs[i][j].weight = INFINITY; } } } // cria uma aresta que "liga" (incide) em dois ns e atribui o respectivo peso; // recebe dois ns (node1 e node2) e o peso (wt) da aresta void joinwt (int node1, int node2, int wt) { g.arcs[node1][node2].adj = 1; g.arcs[node1][node2].weight = wt; } // remove uma aresta do grafo; // recebe o grafo e os dois ns (node1 e node2); void remove (int node1, int node2) { g.arcs[node1][node2].adj = 0; g.arcs[node1][node2].weight = INFINITY; } void dijkstra (int s, int t) // s=origem e t=destino { int dist[MAXNODES], perm[MAXNODES], path[MAXNODES]; int current, i, k, dc; int smalldist, newdist; /* Inicializa INFINITY */ for (i = 0; i perm[i] = dist[i] = todos os ndices de 'perm' como 0 e de 'dist' como < MAXNODES; i++) { NONMEMBER; INFINITY;
} /* Inclui 's' em perm (perm[s]=1) e configura(armazena) sua distancia como sendo zero */ perm[s] = MEMBER; dist[s] = 0; /* define 's' como origem (fonte) da busca */ current = s; k = current; while (current != t) { smalldist = INFINITY; dc = dist[current]; for (i = 0; i < MAXNODES; i++) { //se o elemento NO est em perm if (perm[i] == NONMEMBER) { //calcula distncia a partir do vrtice corrente ao vrtice adjacente i newdist = dc + g.arcs[current][i].weight; //se a distncia partindo do vrtice corrente for menor, atualiza o vetor //de distncias e de precedncia if (newdist < dist[i]) { dist[i] = newdist; path[i] = current; } //determina o vrtice (entre todos os no pertencentes a perm) com menor distncia if (dist[i] < smalldist) { smalldist = dist[i]; k = i; } } } /* fim for */ /* embora estamos assumindo grafos ponderados e conexos, este if garante que em caso de no existncia de um caminho o programa no entre em loop infinito */ if (current == k) { printf("\n\nCAMINHO NAO EXISTE\n\n"); return; } current = k; perm[current] = MEMBER; } /* fim while */ /* impressao do resultado ****************/ cout << s << " a " << t <<": "; int caminho = t; cout << t; while (caminho != s) {
cout << path[caminho]; caminho = path[caminho]; if (caminho != s) cout << ", "; } printf("\n\ncusto: %d\n\n", dist[t]); /****************************************/ } /* fim dijkstra */ int main() { int a, b, c; init_graph (); while (cin >> a >> b >> c) { if (a==0 && b==0 && c==0) break; joinwt (a, b, c); joinwt (b, a, c); } while (cin >> a >> b) { dijkstra (b, a); } return 0; }
7) Rota mais curta com nomes de cidades e uso de pilha #include <iostream> #include <string> #include <stack> using namespace std; #define MAXNODES 50 // Verificar se o tamanho est adequado
#define INFINITY 32768 #define MEMBER 1 #define NONMEMBER 0 string nome[50]; int cont; stack<string> pilha; struct arc { int adj; // se adj=1 ento ADJACENTE; se adj=0 ento NO ADJACENTE int weight; // peso da aresta }; struct graph { struct arc arcs[MAXNODES][MAXNODES]; }g; // matriz de adjacncias
void init_graph () { // inicializa matriz de adjacncia que representa o grafo for (int i = 0; i < MAXNODES; i++) { for (int j = 0; j < MAXNODES; j ++) { g.arcs[i][j].adj = 0; g.arcs[i][j].weight = INFINITY; } } } // cria uma aresta que "liga" (incide) em dois ns e atribui o respectivo peso; // recebe dois ns (node1 e node2) e o peso (wt) da aresta void joinwt (int node1, int node2, int wt) { g.arcs[node1][node2].adj = 1; g.arcs[node1][node2].weight = wt; } // remove uma aresta do grafo; // recebe o grafo e os dois ns (node1 e node2); void remove (int node1, int node2) { g.arcs[node1][node2].adj = 0; g.arcs[node1][node2].weight = INFINITY; } void dijkstra (int s, int t) // s=origem e t=destino { int dist[MAXNODES], perm[MAXNODES], path[MAXNODES];
int current, i, k, dc; int smalldist, newdist; /* Inicializa INFINITY */ for (i = 0; i perm[i] = dist[i] = } todos os ndices de 'perm' como 0 e de 'dist' como < MAXNODES; i++) { NONMEMBER; INFINITY;
/* Inclui 's' em perm (perm[s]=1) e configura(armazena) sua distancia como sendo zero */ perm[s] = MEMBER; dist[s] = 0; /* define 's' como origem (fonte) da busca */ current = s; k = current; while (current != t) { smalldist = INFINITY; dc = dist[current]; for (i = 0; i < MAXNODES; i++) { //se o elemento NO est em perm if (perm[i] == NONMEMBER) { //calcula distncia a partir do vrtice corrente ao vrtice adjacente i newdist = dc + g.arcs[current][i].weight; //se a distncia partindo do vrtice corrente for menor, atualiza o vetor //de distncias e de precedncia if (newdist < dist[i]) { dist[i] = newdist; path[i] = current; } //determina o vrtice (entre todos os no pertencentes a perm) com menor distncia if (dist[i] < smalldist) { smalldist = dist[i]; k = i; } } } /* fim for */ /* embora estamos assumindo grafos ponderados e conexos, este if garante que em caso de no existncia de um caminho o programa no entre em loop infinito */ if (current == k) { printf("\n\nCAMINHO NAO EXISTE\n\n"); return; }
current = k; perm[current] = MEMBER; } /* fim while */ /* impressao do resultado ****************/ // cout << dist[t] << ": "; cout << nome[s] << " a " << nome[t] <<": "; int caminho = t; pilha.push(nome[t]); while (caminho != s) { pilha.push(nome[path[caminho]]); caminho = path[caminho]; } //printf("\n\ncusto: %d\n\n", dist[t]); /****************************************/ cont =0; while(!pilha.empty()) { if (cont>0) cout << ", "; cout << pilha.top(); pilha.pop() ; cont++; } cout << endl; } /* fim dijkstra */ int main() { char s[100]; int qcidades, a, b, c; init_graph (); cin >> qcidades; gets(s); for (int i=1;i<=qcidades;i++) { gets(s); nome[i]=s; } while (cin >> a >> b >> c) { if (a==0 && b==0 && c==0) break; joinwt (a, b, c); joinwt (b, a, c); } while (cin >> a >> b) { dijkstra (a, b); } return 0; }
8) Rota mais rpida com nomes de cidades e uso de pilha #include <iostream> #include <string> #include <stack> using namespace std; #define MAXNODES 50 // Verificar se o tamanho est adequado
#define INFINITY 32768 #define MEMBER 1 #define NONMEMBER 0 string nome[50]; int cont; stack<string> pilha; struct arc { int adj; // se adj=1 ento ADJACENTE; se adj=0 ento NO ADJACENTE int weight; // peso da aresta }; struct graph { struct arc arcs[MAXNODES][MAXNODES]; }g; // matriz de adjacncias
void init_graph () { // inicializa matriz de adjacncia que representa o grafo for (int i = 0; i < MAXNODES; i++) { for (int j = 0; j < MAXNODES; j ++) { g.arcs[i][j].adj = 0; g.arcs[i][j].weight = INFINITY; } } } // cria uma aresta que "liga" (incide) em dois ns e atribui o respectivo peso; // recebe dois ns (node1 e node2) e o peso (wt) da aresta void joinwt (int node1, int node2, int wt) { g.arcs[node1][node2].adj = 1; g.arcs[node1][node2].weight = wt; } // remove uma aresta do grafo; // recebe o grafo e os dois ns (node1 e node2); void remove (int node1, int node2) { g.arcs[node1][node2].adj = 0; g.arcs[node1][node2].weight = INFINITY; } void dijkstra (int s, int t) // s=origem e t=destino { int dist[MAXNODES], perm[MAXNODES], path[MAXNODES];
int current, i, k, dc; int smalldist, newdist; /* Inicializa INFINITY */ for (i = 0; i perm[i] = dist[i] = } todos os ndices de 'perm' como 0 e de 'dist' como < MAXNODES; i++) { NONMEMBER; INFINITY;
/* Inclui 's' em perm (perm[s]=1) e configura(armazena) sua distancia como sendo zero */ perm[s] = MEMBER; dist[s] = 0; /* define 's' como origem (fonte) da busca */ current = s; k = current; while (current != t) { smalldist = INFINITY; dc = dist[current]; for (i = 0; i < MAXNODES; i++) { //se o elemento NO est em perm if (perm[i] == NONMEMBER) { //calcula distncia a partir do vrtice corrente ao vrtice adjacente i newdist = dc + g.arcs[current][i].weight; //se a distncia partindo do vrtice corrente for menor, atualiza o vetor //de distncias e de precedncia if (newdist < dist[i]) { dist[i] = newdist; path[i] = current; } //determina o vrtice (entre todos os no pertencentes a perm) com menor distncia if (dist[i] < smalldist) { smalldist = dist[i]; k = i; } } } /* fim for */ /* embora estamos assumindo grafos ponderados e conexos, este if garante que em caso de no existncia de um caminho o programa no entre em loop infinito */ if (current == k) { printf("\n\nCAMINHO NAO EXISTE\n\n"); return; }
current = k; perm[current] = MEMBER; } /* fim while */ /* impressao do resultado ****************/ // cout << dist[t] << ": "; cout << nome[s] << " a " << nome[t] <<": "; int caminho = t; pilha.push(nome[t]); while (caminho != s) { pilha.push(nome[path[caminho]]); caminho = path[caminho]; } //printf("\n\ncusto: %d\n\n", dist[t]); /****************************************/ cont =0; while(!pilha.empty()) { if (cont>0) cout << ", "; cout << pilha.top(); pilha.pop() ; cont++; } cout << endl; } /* fim dijkstra */ int main() { char s[100]; int qcidades, a, b, c, d, tempo; init_graph (); cin >> qcidades; gets(s); for (int i=1;i<=qcidades;i++) { gets(s); nome[i]=s; } while (cin >> a >> b >> c >> d) { if (a==0 && b==0 && c==0) break; tempo = (int)(((float)c / d)*60); joinwt (a, b, tempo); joinwt (b, a, tempo); } while (cin >> a >> b) { dijkstra (a, b); } return 0; }
int main(){ int s; string n; while(1){ cin >> s >> n; //if ((s == 0) && (n == '0')) break; for (int linha = 0; linha < 5; linha++){ //vare as linhas int p = 1; if ((linha == 1) || (linha == 3)) p = s; for (int y = 0; y < p; y++){ for (int j = 0; j < n.size(); j++){ //percore o valor a ser impresso int num = (n[j]-48); for (int coluna = 0; coluna < 3; coluna++){ //varre as colunas int q = 1; if (coluna == 1) q = s; for (int x = 0; x < q; x++) cout << a[num][linha][coluna]; } cout << ' '; } cout << endl; } } } return 0; }
10) Outros Exemplos #include<iostream> using namespace std; int main() { int n,t,p,soma,totais; string s; while (cin >> t >> n) { if (t == 0) break; soma = 0; totais = t * n; for (int i = 0; i < n; i++){ cin >> s >> p; soma += p; } cout << totais - soma << endl; } return 0; }
#include <map> #include <string> #include <iostream> using namespace std; int main() { map<int, string> digitos; int s; digitos[0] = "zero"; digitos[1] = "um"; while (cin >> s) { cout << digitos[s] << endl; } return 0; }