Pesquisar na Comunidade
Mostrando resultados para as tags ''c', 'c++', 'palavra', 'string', 'caractere', 'contagem', 'programa', 'tutorial', 'ajuda', 'dicas', 'contar' ou 'contador''.
Encontrado 1.162 registros
-
pessoal, estou com problemas na gml, linguagem utilizada na engine Game Maker. Estou fazendo um script para fazer um jogo de plataforma e toda vez que abro chaves {} aparece como se aquilo fosse um erro. aqui estão as variáveis: grav = 0.2; hsp = 0; vsp = 0; VelocidadeDePulo = 7; VelocidadeDeMovimento = 4; e aqui o código no qual da erro: key_direita = keyboard_check (vk_right); key_esquerda = -keyboard_check (vk_left); key_pulo = keyboard_check_pressed (vk_space); move = key_direita + key_esquerda; hsp = move * VelocidadeDeMovimento; // incremento da gravidade ao vspeed if (vsp < 10) vsp += grav; //verifico se há um chão abaixo do player if (place_meeting(x,y+1,obj_Wall)); { vsp = key_pulo * -VelocidadeDePulo; } //horizontal colission if (place_meeting(x + hsp,y,obj_Wall)); { while(!place_meeting(x+sign(hsp),y,obj_Wall)); { x += sign(hsp); } hsp = 0; } x += hsp; //vertical colission if (place_meeting(x,y+vsp,obj_Wall)); { while(!place_meeting(x,y+sign(vsp),obj_Wall)); { y += sign(vsp); } vsp = 0; } quem puder me ajudar, por favor agradeço :D
-
/ /VARIAVEL TIPO TEXTO "CARACTERE" string nome = ""; //VARIAVEL TIPO TEXTO "CARACTERE" string endereço = ""; //VARIAVEL TIPO TEXTO //VARIAVEL TIPO TEXTO string telefone = ""; //VARIAVEL TIPO TEXTO "CARACTERE" string email = ""; //VARIAVEL TIPO TEXTO "CARACTERE" string titulo = ""; //VARIAVEL TIPO TEXTO "CARACTERE" string resp = ""; //VARIAVEL TIPO NUMERO int livros_emprestados = 0; //ESCREVENDO UMA LINHA NO SISTEMA Console.WriteLine(" CADASTRO DE PESSOAS"); //O COMANDO WHILE ELE TEM A SEGUINTE FUNCAO ELE OBEDECE A QUANTIDADE DE VZ QUE você MANDOU ELE VERIFICAR //NESSE CASO ENQUANTO OS LIVROS EMPRESTADO FOR MENOR OU IGUAL 5 PERMITE SOLICITAR UM LIVRO EMPRESTADO DEIXANDO DIGITAR while (livros_emprestados < 5) { Console.Write("Digite o nome do aluno...:"); nome = Console.ReadLine(); Console.Write("Digite o endereço do aluno...:"); endereço = Console.ReadLine(); Console.Write("Digite o telefone do aluno...:"); telefone = Console.ReadLine(); Console.Write("Digite o email do aluno...:"); email = Console.ReadLine(); Console.Write("Digite o título do livro...:"); titulo = Console.ReadLine(); //AQUI CALCULA A QUANTIDADE DE LIVRO QUE já PEGOU EMPRESTADO SOMANDO MAIS UM SEMPRE QUE ACABA DE DIGITAR livros_emprestados += 1; // AQUI PERGUNTA SE O USUARIO DESEJA CONTINUAR PEGANDO LIVRO -- Console.Write("Deseja continuar ? <S> = Sim, <N> =Não..:>"); //ESSE COMANDO CONFERE VE SE FOI DIGITADO S OU N resp = Console.ReadLine(); // SE FOI O S não FAZ E CONTINUA DEIXANDO DIGITAR if (resp == "s") { } //SENAO PARA DE DEIXAR DIGITAR E MOSTRA QUANTOS LIVROS ELE DIGITOU, NOS GUArDAMOS ISSO NA VARIAVEL -- livros_emprestados else { Console.WriteLine("Total de livros emprestados..:" + livros_emprestados); Console.WriteLine("Nome do aluno..:" + nome); }
-
gente, estou com uma duvida muito pertinente e gostaria da ajuda de vocês!!! alguém poderia me explicar a diferença entre as bibliotecas deque, array, list e vector ?
- 3 respostas
-
- bibliotecas
- c++
- (e %d mais)
-
#include <iostream> #include <fstream> using namespace std; int main(){ ofstream output("Myfile.txt"); output << "Stephen Davis is a nice guy" << endl; output.close(); ifstream input("Myfile.txt"); while(input.good()){ cout << input.get(); } cout << endl; input.close(); return 0; } Boa tarde a todos. Estou com dificuldades para fazer meu programa imprimir uma frase gravada em arquivo. Em vez de imprimir a frase o programa está imprimindo os valores ASCII. Estou usando o método get() para ler os caracteres, o S.O. é o Ubuntu e o compilador é g++ versão 6.3.0.
-
Pessoal, estou tento um probleminha com meu código. Estou desenvolvendo uma agenda telefônica como exercício do curso C++. Tudo está indo bem, porém estou com dificuldade de fazer um contador para auxiliar na exibição dos contatos. Ex: 1) Fulano - 00000. A minha ideia é, escanear o ultimo número de contador escrito no arquivo .txt que armazena os dados e depois incrementa-lo e escreve-lo novamente na linha seguinte para o próximo contato. Nos primeiros dois contatos ele escreveu correto, mas depois do segundo começou a repetir o numero 2 para todos os outros. Tentei fazer laços e atribuir o valor para outra variável auxiliar mas não obtive sucesso. Segue parte do código. void CadastroNT(char nome[30], int tel){ FILE *arquivo; char nome1[30]; int tel1 = 0; int contador = 0; arquivo = AbrirA("Lista.txt",'l'); while(!feof(arquivo)){ fscanf(arquivo,"%d %s %d\n",&contador,&nome1,&tel1); if ((strcasecmp(nome1,nome)==1) || (tel1 != tel)){ FechA(arquivo); arquivo = AbrirA("Lista.txt",'a'); contador ++; fprintf(arquivo,"%d %s %d\n", contador, nome,tel); printf("Cadastro efetuado.\n"); FechA(arquivo); break; }else{ FechA(arquivo); printf("Nome ou Telefone já existe. Tente novamente!\n"); break; } } }
-
Oi eu Queria saber se tem como eu instalar algo no fórum ou no gerenciador de arquivos para ter a certeza que se o cliente não pagar eu consiga deixar o fórum off sem ter acesso ao gerenciador de arquivos ou no CPadmin do fórum.
-
Estou em duvida na função insereAVN que está sempre dando erro de segmetação quando chaves ordenadas, não passando do valor de 7939. /* * File: main.cpp * Author: bruno * * Created on 27 de Outubro de 2017, 11:58 */ #include <cstdlib> #include <stdlib.h> #include <iostream> #include <fstream> #include <time.h> #include <sstream> #include <string> #include <cstring> #include <string.h> using namespace std; // Cria-se as structs responsáeis por armazenar os dados, ligar uma struct ? // outra e por fim uma a qual aponta para o primeiro e último termo typedef long int tipoChave; struct dados { tipoChave chave; long int dado1; char dado2[1000]; }; struct Elemento { dados info; Elemento *anterior, *proximo; }; typedef struct { Elemento *primeiro, *ultimo; } ListaEncadeada; typedef struct TipoNo *aponta; typedef struct TipoNo { dados registro; int alturaEsq, alturaDir, FB; aponta esq, dir; } TipoNo; // Funções void criarLista(ListaEncadeada &lista); void inserirElemento(ListaEncadeada &lista, dados dado); void exibeLista(ListaEncadeada lista); void gerarchaves(ListaEncadeada &lista, int quant, int op); bool verificar(ListaEncadeada &lista, tipoChave chave); void escrevearquivo(ListaEncadeada &lista, int quant, string tipo); void lerarquivo(ListaEncadeada &lista, string nome); void iniciarArvore(aponta *s); void insereAVL(dados dado, aponta *r); void insereAVN(dados dado, aponta *p); int AVLAltura(aponta *r); void rotacionaEsq(aponta *r); void rotacionaDir(aponta *r); void balancear(aponta *r); void atualizar(aponta * r); void exibirEmOrdem(aponta *p); void menubusca(ListaEncadeada lista, aponta *p); void buscaSeq(ListaEncadeada &lista, dados &dado); bool verifOrd(ListaEncadeada lista); void buscaAVN(dados *dado, aponta *p); void menu(); int main(); // Função para inicializar a lista void criarLista(ListaEncadeada &lista) { // Aloca memóia para a lista e a declara vazia, definindo que ponteiros // de primeiro e último apontam para o mesmo elemento null lista.primeiro = NULL; lista.ultimo = lista.primeiro; } // Função para inserir na lista void inserirElemento(ListaEncadeada &lista, dados dado) { // Aloca memória para o dado a ser inserido Elemento *elemento = (Elemento *) malloc(sizeof (Elemento)); // Insere o elemento ao final da lista, e este mesmo ao final é atualizado // como o último dado inserido elemento->info = dado; elemento->proximo = NULL; elemento->anterior = NULL; // Se a lista estiver vazia, o dado inserido será o primeiro e o último da lista. if (lista.primeiro == NULL) { lista.primeiro = elemento; lista.ultimo = elemento; }// Senão, a inserção é realizada ao final da lista. else { lista.ultimo->proximo = elemento; elemento->anterior = lista.ultimo; lista.ultimo = elemento; } } // Função para exibir dados da lista void exibeLista(ListaEncadeada lista, int escolha) { // Cria uma variável struct dinamica para receber o primeiro elemento da lista Elemento *elemento = lista.primeiro; // Verifica o lista presente armazenada e exibe ao usuário switch (escolha) { case 1: cout << "\nLista Aleatória gerada:\n"; break; case 2: cout << "\nLista Ordenada gerada:\n"; break; case 3: cout << "\nLista contida no arquivo:\n"; break; default: cout << "\nLista Inválida ou vazia!\n"; menu(); break; } // Realiza a exibição dos dados na tela do usuário enquanto houver dados a ser inseridos while (elemento != NULL) { cout << "\nChave: " << elemento->info.chave; cout << " Dado1: " << elemento->info.dado1; cout << " Dado2: " << elemento->info.dado2; elemento = elemento->proximo; } // Libera espaço alocado na criação da variável dinâmica free(elemento); } // Função para escrever no arquivo os dados gerados void escrevearquivo(ListaEncadeada &lista, int quant, string tipo) { // Cria uma variável struct dinâmica para receber o primeiro elemento da lista Elemento *elemento = lista.primeiro; // Verifica se a lista está vazia. Se sim, retorna ao menu. if (elemento == NULL) { cout << "\nLista Vazia!\nArquivo não escrito!\n"; menu(); } // Declara o arquivo de saida a ser gerado, definindo o nome ofstream arquivo; // Converte inteiro em string stringstream result; result << quant; // Concatena o tipo de chave geradas, com a quantidade e o extensão txt do // arquivo a ser gerado. string nome = (tipo.c_str() + result.str() + ".txt"); arquivo.open(nome.c_str()); // Teste de verificação se o arquivo foi gerado com sucesso if (arquivo.fail()) { cout << "Error ao criar o arquivo."; menu(); } // Realiza a escrita no arquivo enquanto houver dados a ser inseridos while (elemento != NULL) { arquivo << elemento->info.chave << " " << elemento->info.dado1 << " "; arquivo << elemento->info.dado2; // Se o próximo elemento a ser escrito for diferente de NULL, realiza uma quebra de linha if (elemento->proximo != NULL){ arquivo << endl; } elemento = elemento->proximo; } // Fecha o arquivo arquivo.close(); // Libera espaço alocado na criação da variável dinâmica free(elemento); } // Função para ler o arquivo e armazenar os dados na lista void lerarquivo(ListaEncadeada &lista, string nome) { // Declara um arquivo de entrada ifstream arquivo; // Concatena o nome com a extensão txt nome = nome + ".txt"; // Verifica se há repetição do nome da extensão if (nome.substr(nome.length() - 8, nome.length()) == (".txt.txt")) { nome = nome.substr(0, nome.length() - 4); cout << nome; } // Realiza sua abertura arquivo.open(nome.c_str()); // Caso falha ao abrir ou arquivo não exitir if (arquivo.fail()) { cout << "\nArquivo não encontrado!\n"; menu(); } // Declara uma variável struct dados para receber os parametros de dentro // do arquivo dados dado; // Enquanto não encontrar sinal de final de arquivo, realizará a leitura e // a inserção na lista while (!arquivo.eof()) { arquivo >> dado.chave >> dado.dado1 >> dado.dado2; if (lista.ultimo != NULL) { if (dado.chave == lista.ultimo->info.chave) { goto fim; } } // Chama a função de inserção na lista, passando o dado e a lista como parametros inserirElemento(lista, dado); } fim: // Mensagem de leitura completa do arquivo cout << "\nLeitura completa do arquivo " << nome << "!\n"; // Fecha o arquivo arquivo.close(); } // Função para verificar se a chave aleatória gerada já existe na lista bool verificar(ListaEncadeada &lista, tipoChave chave) { // Realiza o laço para verificação de existência de valores iguais. // Caso sim, retorna então verdadeiro(true). // Admite como limite a posição do elemento atualmente sendo inserido. Elemento *elementoP = lista.primeiro, *elementoU = lista.ultimo; // Enquanto elementoP for diferente de elementoU realiza o laço de verificação while (elementoP != elementoU) { // Caso a chave do elemento seja igual a chave gerada retorna verdade if (elementoP->info.chave == chave || elementoU->info.chave == chave) { return true; } elementoP = elementoP->proximo; elementoU = elementoU->anterior; } // Caso ponteiros de apontem para o mesmo endereço e a chave do elemento seja igual a chave gerada if (elementoP == elementoU && elementoP->info.chave == chave) { return true; } // Caso contrário, retorna falso. return false; } // Função para gerar os dados e chaves referentes ao mesmos void gerarchaves(ListaEncadeada &lista, int quant, int op) { // Declaração de variáveis tipoChave chave; long int dado1; int TAM; dados dado; // Toda vez que executar o programa será gerado um aleatória diferente srand(time(NULL)); // Laço para gerar a quantidade informada de estrutura com os dados for (int i = 0; i < quant; i++) { // Define um tamanho aleatório para a sequencia de caracteres TAM = 1 + (rand() % 10); // Aloca dinamicamente um vetor de char dado2 char *dado2 = new char[TAM]; // Verifica qual op?o selecionada: 1.Aleatória ou 2.Ordenada if (op == 1) { // 1 até 10: chave = 1 + (rand() % quant); // Verificação se há uma repetição no laço. Caso sim, gerará um novo // número aleatório e atribuirá a este como sendo o novo valor e então, // a variável j recebe 0 para que possa realizar todas checagens possíveis // e corrigindo caso haja repeti?o. Ao fim, o valor é atribuido às // referentes variáveis while (verificar(lista, chave)) { chave = 1 + (rand() % quant); } } else if (op == 2) { // Crescente a partir do 1: chave = i + 1; } // Gera dado1 sem limite superior: dado1 = 1 + (rand()); // Exibe a sequencia de caracteres alphanúmericos for (int j = 0; j < TAM; j++) { // Converte para char o número inteiro dado2[j] = ('a' + (rand() % 26)); } // Cria-se uma estrutura com os dados gerados dado.chave = chave; dado.dado1 = dado1; for (int j = 0; j < TAM; j++) { dado.dado2[j] = dado2[j]; } // Insere os elementos gerados em uma Lista Encadeada inserirElemento(lista, dado); // Libera espaço alocado na criação da variável dinâmica delete dado2; } // Informa ao final do laço que a lista foi preenchida cout << "\nLista Preenchida!"; } // Função para realizar a pesquisa sequencial void buscaSeq(ListaEncadeada &lista, dados &dado) { // Declaração de variáveis Elemento *elemento = lista.primeiro; // Contador de comparações int i = 0; // Enquanto elemento não for nulo ou vazio while (elemento != NULL) { // Verifica se a chave do elemento corresponde a chave pesquisada i++; if (elemento->info.chave == dado.chave) { // Informa a posição do registro e atribui o restante dos dados ao dados dado cout << "\nPosição encontrada: " << (i + 1) << "? termo\n"; dado = elemento->info; cout << "\nComparações " << i; return; } elemento = elemento->proximo; } // Libera espaço alocado na criação da variável dinâmica free(elemento); // Caso não encontre, exibe a mensagem na tela do usuário. Declara chave como -1. cout << "\nRegistro não encontrado."; cout << "\nComparações " << i++; dado.chave = -1; return; } // Função recursiva para encontra a chave pesquisada na lista Crescente int binariaC(dados *v, int inicio, int final, dados &dado) { int meio; if (inicio < final) { meio = (inicio + final) / 2; if (v[meio].chave == dado.chave) { return meio; } else if (v[meio].chave < dado.chave) { return binariaC(v, meio + 1, final, dado); } else if (v[meio].chave > dado.chave) { return binariaC(v, inicio, meio - 1, dado); } } else { return -1; } } // Função recursiva para encontra a chave pesquisada na lista Decrescente int binariaD(dados *v, int inicio, int final, dados &dado) { int meio; if (inicio < final) { meio = (inicio + final) / 2; if (v[meio].chave == dado.chave) { return meio; } else if (v[meio].chave > dado.chave) { return binariaD(v, meio + 1, final, dado); } else if (v[meio].chave < dado.chave) { return binariaD(v, inicio, meio - 1, dado); } } else { return -1; } } // Função de pesquisa sequencial recursiva void buscaSeqRec(ListaEncadeada &lista, dados &dado) { // Cria variáveis para manipulação na pesquisa sequencial recursiva Elemento *elemento = lista.primeiro; int i = 0, tam, t, op; // Analisa se a lista esta ordenada ou desordenada e declara o tamanho do vetor corretamente if (elemento->info.chave < elemento->proximo->info.chave){ tam = lista.ultimo->info.chave; op = 1; } else if (elemento->info.chave > elemento->proximo->info.chave){ tam = lista.primeiro->info.chave; op = 2; } // Aloca dinamicamente um vetor de dados para armazena a lista e realizar assim, a pesquisa sequencial recursiva dados * v = new dados[tam]; while (elemento != NULL) { v[i] = elemento->info; elemento = elemento->proximo; i++; } // Analisa se a lista esta ordenada ou desordenada e invoca a função certa if (op == 1){ int t = binariaC(v, 0, tam, dado); } else if (op == 2){ int t = binariaD(v, 0, tam, dado); } // Exibe o resultado da pesquisa if (t == -1) { cout << "\nRegistro não encotrado."; } else { cout << "\nChave: " << v[t].chave; cout << " Dado1: " << v[t].dado1; cout << " Dado2: " << v[t].dado2; } // Libera espaço alocado na criação da variável dinâmica delete v; } // Função para incializar a árvore void iniciarArvore(aponta *s) { (*s) = NULL; } // Função que retorna a altura da árvore ou nó int AVLAltura(aponta *r) { if ((*r) == NULL) { return 0; } int esq = AVLAltura(&(*r)->esq); int dir = AVLAltura(&(*r)->dir); if (esq > dir) { return esq + 1; } return dir + 1; } // Função da AVL de rotação para a esquerda void rotacionaEsq(aponta *r) { aponta *aux = (aponta *) malloc(sizeof (TipoNo)); (*aux) = (*r)->dir; (*r)->dir = (*aux)->esq; (*aux)->esq = (*r); (*r) = (*aux); free(aux); } // Função da AVL de rotação para a Direita void rotacionaDir(aponta *r) { aponta *aux = (aponta *) malloc(sizeof (TipoNo)); (*aux) = (*r)->esq; (*r)->esq = (*aux)->dir; (*aux)->dir = (*r); (*r) = (*aux); free(aux); } // Função da AVL para analisar em qual caso encontra-se se o nó estiver desbalanceado void balancear(aponta *r) { if ((*r) == NULL) { return; } balancear(&(*r)->esq); balancear(&(*r)->dir); int pai = (*r)->FB; if (pai == 2) { int filho = (*r)->dir->FB; if (filho == 1 || filho == 0) { rotacionaEsq(&(*r)); } else if (filho == -1) { rotacionaDir(&(*r)->dir); rotacionaEsq(&(*r)); } } if (pai == -2) { int filho = (*r)->esq->FB; if (filho == -1 || filho == 0) { rotacionaDir(&(*r)); } else if (filho == 1) { rotacionaEsq(&(*r)->esq); rotacionaDir(&(*r)); } } } // Função da AVL para atualizar a altura direita,esquerda e Fator de balanceamento de cada nó da árvore. void atualizar(aponta * r) { if ((*r) == NULL) { return; } (*r)->alturaDir = AVLAltura(&(*r)->dir); (*r)->alturaEsq = AVLAltura(&(*r)->esq); (*r)->FB = AVLAltura(&(*r)->dir) - AVLAltura(&(*r)->esq); atualizar(&(*r)->esq); atualizar(&(*r)->dir); } // Função de inserção da AVL void insereAVL(dados dado, aponta * r) { if ((*r) == NULL) { *r = (aponta) malloc(sizeof (TipoNo)); (*r)->registro = dado; (*r)->esq = NULL; (*r)->dir = NULL; (*r)->FB = 0; (*r)->alturaEsq = 0; (*r)->alturaDir = 0; return; } if (dado.chave < (*r)->registro.chave) { insereAVL(dado, &(*r)->esq); (*r)->alturaEsq = AVLAltura(&(*r)->esq); (*r)->alturaDir = AVLAltura (&(*r)->dir); (*r)->FB = (*r)->alturaDir - (*r)->alturaEsq; return; } if (dado.chave > (*r)->registro.chave) { insereAVL(dado, &(*r)->dir); (*r)->alturaEsq = AVLAltura(&(*r)->esq); (*r)->alturaDir = AVLAltura (&(*r)->dir); (*r)->FB = (*r)->alturaDir - (*r)->alturaEsq; } else { cout << "\nError: O registro já existe!\n"; } } //Função de inserção da AVN void insereAVN(dados dado, aponta * p) { if ((*p) == NULL) { *p = (aponta) malloc(sizeof (TipoNo)); (*p)->registro = dado; (*p)->esq = NULL; (*p)->dir = NULL; (*p)->FB = 0; (*p)->alturaEsq = 0; (*p)->alturaDir = 0; return; } if (dado.chave < (*p)->registro.chave) { insereAVN(dado, &(*p)->esq); return; } if (dado.chave > (*p)->registro.chave) { insereAVN(dado, &(*p)->dir); } else { cout << "\nError: O registro já existe!\n"; } } // Função de busca na estrutura de árvore void buscaAV(dados *dado, aponta * p, int i) { if ((*p) == NULL) { i++; cout << "\nError: Registro não está presente na árvore!\n"; cout << "\nComparações " << i; dado->chave = -1; return; } if (dado->chave < (*p)->registro.chave) { i++; buscaAV(dado, &(*p)->esq, i); return; } if (dado->chave > (*p)->registro.chave) { i++; buscaAV(dado, &(*p)->dir, i); } else { i++; cout << "\nComparações " << i; *dado = (*p)->registro; } } // Função para exibir os dados presentes na árvore de maneira ordenada void exibirEmOrdem(aponta * p) { if ((*p) != NULL) { exibirEmOrdem(&(*p)->esq); cout << "\nChave: " << (*p)->registro.chave; cout << " Fator Balanceamento: " << (*p)->FB; cout << " Altura Direita . . ." << (*p)->alturaDir; cout << " Altura Esquerda . . ." << (*p)->alturaEsq; exibirEmOrdem(&(*p)->dir); } } // Função para verificar se a árvore está ordenada (Crescente ou Decrescente) bool verifOrd(ListaEncadeada lista) { Elemento *elemento = lista.primeiro; // Verifica se a lista está ordenada if (elemento->proximo != NULL) { if (elemento->info.chave < elemento->proximo->info.chave) { while (elemento != NULL && elemento->proximo != NULL) { if (elemento->proximo->info.chave < elemento->info.chave) { return true; } elemento = elemento->proximo; } } else if (elemento->info.chave > elemento->proximo->info.chave) { while (elemento != NULL && elemento->proximo != NULL) { if (elemento->proximo->info.chave > elemento->info.chave) { return true; } elemento = elemento->proximo; } } } return false; } // Função menu busca (Exibe ao usuário opções de métodos de busca) do programa void menubusca(ListaEncadeada lista, aponta *p, aponta * r) { // Solicita ao usuário que informe uma chave. Atribui este valor // recebido a variável declarada aqui dados *dado = (dados *) malloc(sizeof (dados)); int metodo, chave = 0; clock_t tempof, tempo; pesquisa: cout << "\n\nInforme a chave a ser pesquisada: "; cin >> chave; dado->chave = chave; metodo: cout << "\nEscolha um metodo de pesquisa:\n "; cout << "\n1. Pesquisa Sequencial"; cout << "\n2. Arvore Não Balanceada"; cout << "\n3. Arvore Balanceada"; cout << "\n4. Pesquisa Binária Recursiva"; cout << "\n\nEscolha: "; cin >> metodo; switch (metodo) { case 1: tempo = clock(); buscaSeq(lista, *dado); tempof = clock() - tempo; break; case 2: tempo = clock(); buscaAV(&(*dado), &(*p), 0); tempof = clock() - tempo; break; case 3: tempo = clock(); buscaAV(&(*dado), &(*r), 0); tempof = clock() - tempo; break; case 4: if (verifOrd(lista)) { cout << "\nA Pesquisa Binária Recursiva funciona somente com lista ordenadas!\n"; cout << "\nSelecione outro metodo de busca:\n"; goto metodo; } tempo = clock(); buscaSeqRec(lista, *dado); tempof = clock() - tempo; break; default: cout << "\nOpção Inválida!\n"; goto metodo; break; } if (metodo >= 1 && metodo <= 3 && dado->chave != -1) { cout << "\nChave: " << dado->chave; cout << " Dado1: " << dado->dado1; cout << " Dado2: " << dado->dado2; } // Exibe ao usuário o tempo gasto no algoritmo de busca cout << "\n\nTempo gasto: " << ((tempof * 1000000) / CLOCKS_PER_SEC) << "ns.\n"; char op; cout << "\nRealizar outra pesquisa? S/N \n"; cin >> op; if (op == 'S' || op == 's') { goto pesquisa; } // Libera espaço alocado na criação da variável dinâmica free(dado); } // Função menu principal do programa void menu() { // Declara uma variável que receberá a opção desejada pelo usuário int op, quant, escolha; string tipo, nome; // Cria e inicializa a variável lista ListaEncadeada lista; criarLista(lista); // Cria variável árvore Não Balanceada e Balanceada, respectivamente aponta p, r; // Cria variável dinâmica elemento para manipulação de dados Elemento *elemento = (Elemento *) malloc(sizeof (Elemento)); inicio: // Exibe um menu com opções e pede para que o usuário informe uma escolha do { cout << "\n\nInforme uma escolha:\n"; cout << "\n1. Gerar chaves de entrada aleat?ias"; cout << "\n2. Gerar chaves de entrada ordenada."; cout << "\n3. Exibir chaves geradas."; cout << "\n4. Escrever um arquivo com as chaves geradas."; cout << "\n5. Ler arquivo de entrada com chaves"; cout << "\n6. Realizar uma pesquisa"; cout << "\n0. Sair do programa."; cout << "\n\nEscolha: "; cin >> op; // Limpar tela ap? selecionar a escolha // Linux: // system("clear"); // Windows system("cls"); switch (op) { // Gerar chaves Aleatórias case 1: // Inicializa-se uma Lista Encadeada criarLista(lista); cout << "\nInforme a quantidade de chaves a ser geradas: "; cin >> quant; if (quant <= 0) { cout << "\nQuantidade informada inv?ida!\n"; goto inicio; } gerarchaves(lista, quant, op); tipo = ("Aleatorio-"); escolha = 1; break; // Gerar chaves Ordenadas case 2: // Inicializa-se uma Lista Encadeada criarLista(lista); cout << "\nInforme a quantidade de chaves a ser geradas: "; cin >> quant; if (quant <= 0) { cout << "\nQuantidade informada inv?ida!\n"; goto inicio; } gerarchaves(lista, quant, op); tipo = ("Ordenado-"); escolha = 2; break; // Exibe ao usuário os dados armazenados case 3: // Exibe ao usu?io a lista atualmente em manuseio exibeLista(lista, escolha); break; // Escrever no arquivo os dados gerados case 4: escrevearquivo(lista, quant, tipo); // Ao final, exibe uma mensagem escrita concluida. E ent?, fecha-se o arquivo. cout << "\nArquivo escrito!"; break; // Ler do arquivo os dados gerados case 5: // Inicializa-se uma Lista Encadeada criarLista(lista); cout << "\nInforme o nome do arquivo: "; cin.ignore(); getline(cin, nome); lerarquivo(lista, nome); escolha = 3; break; // Realizar pesquisa no dados armazenados case 6: elemento = lista.primeiro; if (lista.primeiro == NULL) { cout << "\nLista Inv?ida!\n"; goto inicio; } else { cout << "\nInicializando . . ."; iniciarArvore(&(p)); iniciarArvore(&(r)); // Cria variável Elemento dinâmica cout << "\nArvore Iniciada!"; while (elemento != NULL) { insereAVN(elemento->info, &(p)); insereAVL(elemento->info, &(r)); //atualizar(&(r)); balancear(&(r)); atualizar(&(r)); elemento = elemento->proximo; } cout << "\nRaiz da AVN: " << p->registro.chave; cout << "\nRaiz da AVL: " << r->registro.chave; // Ir?deslocar o usu?io para a fun?o de busca menubusca(lista, &p, &r); // exibirEmOrdem(&(r)); } break; // Sair do programa case 0: // Finaliza?o do programa cout << "\n\n"; break; default: // Caso nenhuma das anteriores, ?informado ao usu?io que houve sele?o de alternativa inv?ida. // Retorna ao menu principal cout << "\nOpçãoo informada inválida!\n"; goto inicio; break; } } while (op != 0); // Libera espaço alocado na criação da variável dinâmica free(elemento); } // Função principal para início do programa int main() { // Invoca a função menu para fornecer ao usuário opções menu(); // Mensagem exibida na tela do usuário quando o programa é finalizado com sucesso cout << "\nSaída com sucesso!\n\n\n"; return 0; }
-
Como armazenar valores diferentes de uma mesma variável em C++?
uma questão postou RodrigoAraIF C, C++
Estou criando um sistema bancário em c++ (é um trabalho do meu curso, que exige que eu use essa linguagem) na última etapa, preciso que o programa mostre um extrato com todas as movimentações da conta, mas quando eu faço os depósitos na conta, ocorre um erro. por exemplo, o saldo inicial era 0 depositei 10 em seguida mais 20 no extrato aparece: depósitos feitos: 2 Valor dos depósitos: 20 20 ou seja, preciso de alguma forma imprimir o primeiro e segundo valor, e ele só está reconhecendo o segundo. alguém pode me ajudar? -
2) Escreva funções em C que realizem cada uma das tarefas seguintes: A) Calcule a parte inteira do quociente quando um inteiro a é dividido por um inteiro b B) Calcule o resto inteiro quando um inteiro a é dividido por um inteiro b C) Use as funções desenvolvidas em A e B para escrever uma função que receba um inteiro entre 1 e 32767 e o imprima com uma série de dígitos, separados por dois espaços. Por exemplo, o inteiro 4562 deve ser impresso como: 4 5 6 2 Cada função deve ser obrigatoriamente implementada em um arquivo diferente. Um arquivo deve conter a função main e incluir os cabeçalhos das funções utilizadas. Faça um Makefile para compilar os arquivos gerar o executável. O uso de variáveis globais é proibido. OBS: Estou com duvida na questão C pensei em fazer como string mais na hora de imprimir não sei como, pensei em fazer com vetor de inteiros mais não sei como pagar assim que o usuário escrever o numero, nem como imprimir quando o numero for por exemplo 100.
-
Tenho conhecimento básico em C++ e preciso entregar um programa na escola de cadastro de um petshop com conexão ao banco de dados, com cadastro de novos clientes, estoque, estoque de remédios, consultas, aplicações e roupas e acessórios meu professor me ajuda com uma parte do programa mas n estou conseguindo finalizar alguém pode me ajudar ? pf entrem em contato 13 974014395
-
Olá gente, gostava que ajudassem com isto... o meu professor meteu este código... e ele perguntou quem é que sabe o que isto faz e nós não sabemos, nós somos alunos de 10 ano e ainda não percebemos bem isto, agradecia a vossa ajuda. (Digam-me o que faz e expliquem os passos) #include <stdio.h> #include <string.h> int main(void) { char *Codifica(char *strOut, char *strIn) { strcpy(strOut, strIn); char *strAux = strOut; while(*strAux){ *strAux = (*strAux)+1; *strAux++; } return strOut; } }
-
n votefavorite Estou usando o sdk dahua para conectar-me a um DVR. Até então. Estou tendo problemas para obter os bytes retornados de uma câmera. e exportar em formato de imagem. Sou iniciante e não tenho ideia. como. // real-time monitoring method g_lRealHandle = CLIENT_RealPlayEx(g_lLoginHandle, command_options.dvr_channel, NULL, emRealPlayType); //set-callback CLIENT_SetRealDataCallBackEx(g_lRealHandle, &RealDataCallBackEx, NULL, dwFlag) //bytes de retorno da camera void CALLBACK RealDataCallBackEx(LLONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, LONG param, LDWORD dwUser) { // if more than one real-time monitoring use same data callback, we can judge by parameter lRealHandle. //NESTA PARTE RECEBO OS BYTES QUERIA SABER COMO SALVAR EM FORTAMO DE IMAGEM OS FRAMES DESSE BYTE fwrite (pBuffer, 1, dwBufSize, file); fflush(file); //original A/V hybrid data //printf("receive real data, param: lRealHandle[%ld], dwDataType[%u], pBuffer[%p], dwBufSize[%u], param[%d], dwUser[%ld] - [%d]\n", lRealHandle, dwDataType, pBuffer, dwBufSize, param, dwUser, bInput); }
-
Boa tarde e feliz natal a todos. Estou tentando fazer um programa utilizando o conhecimento que aprendi sobre POO. Meu programa consiste em um cadastro de alunos onde posso cadastrar seu nome, identidade e as notas de quatro bimestres. Alguns erros consegui sanar, mas o erro citado no título deste tópico não. Segue o código e a mensagem de erro: main.cpp: #include <iostream> #include "estudante.h" using namespace std; int main(int argc, char *argv[]){ Estudante e; e.cadastrarEstudante(); e.cadastrarNotas(); return 0; } estudante.h #ifndef ESTUDANTE_H_INCLUDED #define ETUDANTE_H_INCLUDED class Estudante{ friend void cadastrar_notas_bimestrais(short bimestre); protected: char *nome; int identidade; //Notas das provas. float matematica[4]; float portugues[4]; float historia[4]; public: const char* getNome(); int getId(); void cadastrarNotas(); void cadastrarEstudante(); ~Estudante(); }; #endif estudante.cpp: #include "estudante.h" #include <cstdlib> #include <cstring> #include <iostream> using namespace std; void cadastrar_notas_bimestrais(short bimestre){ cout << "Nota de matemática: "; cin >> matematica[bimestre - 1]; cout << "Nota de português: "; cin >> portugues[bimestre - 1]; cout << "Nota história: "; cin >> historia[bimestre - 1]; } Estudante::~Estudante(){ delete[] nome; nome = 0; } const char* Estudante::getNome(){ return nome; } int Estudante::getId(){ return identidade; } void Estudante::cadastrarNotas(){ short bimestre; system("clear"); cout << "Cadastro de notas\n\n\n"; cout << "Informe o bimestre:"; cin >> bimestre; switch(bimestre){ case 1: cadastrar_notas_bimestrais(bimestre); break; case 2: cadastrar_notas_bimestrais(bimestre); break; case 3: cadastrar_notas_bimestrais(bimestre); break; case 4: cadastrar_notas_bimestrais(bimestre); break; } cout << "\n\n\nNotas cadastradas com sucesso!"; } void Estudante::cadastrarEstudante(){ char nome[41]; system("clear"); cout << "Cadastro de Aluno\n\n\n"; cout << "Nome completo: "; cin.getline(nome, 41); this->nome = new char[strlen(nome) + 1]; strcpy(this->nome, nome); cout << "Identidade: "; cin >> identidade; cout << "\n\ncadastro realizado com sucesso!"; } Mensagem de erro: pai@demas:~/Projetos/C++/projeto03$ g++ -o prog estudante.cpp main.cpp estudante.cpp: In function ‘void cadastrar_notas_bimestrais(short int)’: estudante.cpp:10:9: error: ‘matematica’ was not declared in this scope cin >> matematica[bimestre - 1]; ^~~~~~~~~~ estudante.cpp:12:9: error: ‘portugues’ was not declared in this scope cin >> portugues[bimestre - 1]; ^~~~~~~~~ estudante.cpp:14:9: error: ‘historia’ was not declared in this scope cin >> historia[bimestre - 1]; ^~~~~~~~ Desde já agradeço.
-
Aprenda a programar o mais rápido possível !
um tópico no fórum postou MexorEmpresa Classificados & Serviços
Vocês já perceberam o quanto uma pessoa com conhecimentos de programação tem valor em meio a sociedade ?! Hoje em dia, os comércios e as empresas estão desesperadamente atrás de pessoas com conhecimentos de programação para contratar. O futuro da informática depende de pessoas com conhecimentos para programar. Sabia que agora você pode adquirir um livro ensinando a ter uma breve lógica de programação ?! Isso mesmo, não precisa sair de casa e até mesmo após ter baixado, não precisa nem ter internet para aprender a programar, é apenas necessário um computador ou celular. Muitas pessoas estão adorando essa técnica, vai ficar de fora ? Link: http://bit.ly/2CeVaHt-
- programar
- pragramação
- (e %d mais)
-
#include <stdio.h> #include <stdlib.h> int main (void) { int quant_sal=0,salario_1000=0,soma=0,maior=0; float salario=1; printf("Insira o salario: "); scanf("%f",&salario); maior=salario; while(salario>=1){ soma=soma+salario; if(salario<=0){ printf("Salario invalido"); } if(salario>1000){ salario_1000++; } if(salario>maior){ maior=salario; } printf("Insira o salario: "); scanf("%f",&salario); } printf("A media de salario e: %.1f\n",soma/salario); printf("O maior salario e: %d\n",maior); printf("Salario acima de 1000 e: %d\n",salario_1000); system("pause"); return 0; } A dúvida é a seguinte: se o usuário digitar um valor negativo ele não entrar no cálculo para resultado.
-
GALERA, FIZ O CÓDIGO TODO E ESTÁ FUNCIONANDO. PORÉM, NA HORA DE USAR A FUNÇÃO FREE(), APARECE EXITED WITH NON ZERO STATUS E DÁ ERRO NO CODIGO, alguém PODE ME AJUDAR #include <stdio.h> #include <stdlib.h> char Alocar(char *p, int c){ p=(char*) malloc(c*sizeof(char)); } int main(){ int i, j, x; printf("Digite o tamanho da string: "); scanf("%d", &x); char *ptr, vogais[10]= "aeiouAEIOU", nada[1]=""; Alocar(ptr, x); if(ptr==NULL){ printf("FAIL"); exit(1); } printf("Digite sua string com %d caracteres (espaço conta como caractere): \n", x); scanf(" %[^\n]s", ptr); printf("\n"); printf("\n"); printf("*****String sem vogais*****\n"); printf("\n"); for(i=0; i<x; i++){ for(j=0; j<10; j++){ if(ptr==vogais[j]){ ptr=nada[0]; } } printf("%c", ptr); } free(ptr); ptr=NULL; return 0; }
- 4 respostas
-
- c
- funçãofree
- (e %d mais)
-
Quando tento verificar se uma conta já existe no meu sistema de login, encontro o seguinte erro ** [MySQL]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''GH_CEO'' at line 1 Código responsável pela verificação: function:Player_Init(playerid) { static const empty_player[playerData]; PlayerData[playerid] = empty_player; GetPlayerName(playerid, PlayerData[playerid][pUsername], MAX_PLAYER_NAME); new query[103]; mysql_format(g_iHandle, query, sizeof query, "SELECT * FROM `characters` WHERE `AcountName` = '%s' LIMIT 1", PlayerData[playerid][pUsername]); mysql_tquery(g_iHandle, query, "r@Player_Init", "d", playerid); return true; }
-
Qual programa você usa para programar?
-
Pessoal,estou criando uma Calculadora de decimo terceiro salário no Slackware,só que ela não instala em Office(Categoria)do menu iniciar do Linux. Tem um site que pode nos ajudar: https://mexapi.macpress.com.br/criando-pacotes-slackware Download do pacote.tar.gz: http://www.mediafire.com/file/ftccaviecdx0c6h/Calculadora.tar.gz Alguém pode me ajudar? Observação:Uso o Slackware 14.2 64 bits.
-
Boa noite! alguém pode me ajudar? Não roda e não sei o motivo! #include <iostream> using namespace std; class bar { protected: string nomeItem[9]; int itens[9]; public: bar() { int i; for(i=0;i<9;i++) { this->itens[i]=0; } this->nomeItem[0]="cerveja"; this->nomeItem[1]="pinga 51"; this->nomeItem[2]="caipirinha"; this->nomeItem[3]="agua"; this->nomeItem[4]="coca"; this->nomeItem[5]="salgado"; this->nomeItem[6]="cigarro"; this->nomeItem[7]="amendoim"; this->nomeItem[8]="aperitivo"; this->nomeItem[9]="agua com gas"; } void setItem(int op, int quantidade) { this->itens[op]=this->itens[op]+quantidade; } string getNomeitem(int op) { return this->nomeItem[op]; } }; class comanda:public bar { private: string nomeCliente; public: comanda() { nomeCliente=""; } void setNomecliente(string nomeCliente) { if(this->nomeCliente!="") this->nomeCliente=nomeCliente; else cout<<"não pode nome em branco"<<endl; } string getNomecliente() { return this->nomeCliente; } void compraItem(int op, int quantidade) { op--; if((op>=0)&&(op<=9)&&(quantidade>0)) { setItem(op,quantidade); } } void imprimenu() { cout<<"|***********************************|"<<endl; cout<<"|***** Bem vindo ao bar do Wilson *****|"<<endl; for(int i=0;i<=9;i++) { cout<<"|* "<<getNomeitem(i)<<" *|"<<endl; } cout<<"|***********************************|"<<endl; } void imprimeComanda() { int i; for(i=0;i<10;i++) { if(this->itens[i]!=0) { cout<<getNomeitem(i)<<endl; cout<<this->itens[i]; } } for(i=0;i<9;i++) { this->itens[i]=0; } this->nomeCliente=""; } }; void menu() { int i,op,quantidade; string nome; comanda cliente[200]; i=0; do { cout<<"1 - Para emitir nova comanda"<<endl; cout<<"2 - Para comprar alguma coisa do menu"<<endl; cout<<"3 - Fechar comanda"<<endl; cout<<"4 - Sair do programa"<<endl; cin>>op; if((op==1)&&(i<200)) { cout<<"Digite o nome do cliente (comanda)"<<endl; cin>>nome; cliente[i].setNomecliente(nome); cout<<"Codigo da comanda: "<<(i+1)<<endl; } else if(op==2) { cout<<"Digite o codigo da comanda"<<endl; if(cliente[i].getNomecliente()!="") { cliente[i].imprimenu(); cout<<"Digite a opcao desejada: "<<endl; cin>>op; cout<<"Digite a quantidade desejada: "<<endl; cin>>quantidade; cliente[i].compraItem(op,quantidade); op=1; } else { cout<<"Comanda invalida ou não cadastrada por favor cadastrar comanda"<<endl; } } else if(op==3) { cliente[i].imprimeComanda(); cout<<"Agradecemos a sua preferencia! \nObrigado"<<endl; } else if(op==4) { cout<<"Sistema sera fechado!"<<endl; } }while(op!=4); } int main() { menu(); return 0; } Obrigado ! :)
-
Boa noite! alguém pode me ajudar? Não roda e não sei o motivo! #include <iostream> using namespace std; class bar { protected: string nomeItem[9]; int itens[9]; public: bar() { int i; for(i=0;i<9;i++) { this->itens[i]=0; } this->nomeItem[0]="cerveja"; this->nomeItem[1]="pinga 51"; this->nomeItem[2]="caipirinha"; this->nomeItem[3]="agua"; this->nomeItem[4]="coca"; this->nomeItem[5]="salgado"; this->nomeItem[6]="cigarro"; this->nomeItem[7]="amendoim"; this->nomeItem[8]="aperitivo"; this->nomeItem[9]="agua com gas"; } void setItem(int op, int quantidade) { this->itens[op]=this->itens[op]+quantidade; } string getNomeitem(int op) { return this->nomeItem[op]; } }; class comanda:public bar { private: string nomeCliente; public: comanda() { nomeCliente=""; } void setNomecliente(string nomeCliente) { if(this->nomeCliente!="") this->nomeCliente=nomeCliente; else cout<<"não pode nome em branco"<<endl; } string getNomecliente() { return this->nomeCliente; } void compraItem(int op, int quantidade) { op--; if((op>=0)&&(op<=9)&&(quantidade>0)) { setItem(op,quantidade); } } void imprimenu() { cout<<"|***********************************|"<<endl; cout<<"|***** Bem vindo ao bar do Wilson *****|"<<endl; for(int i=0;i<=9;i++) { cout<<"|* "<<getNomeitem(i)<<" *|"<<endl; } cout<<"|***********************************|"<<endl; } void imprimeComanda() { int i; for(i=0;i<10;i++) { if(this->itens[i]!=0) { cout<<getNomeitem(i)<<endl; cout<<this->itens[i]; } } for(i=0;i<9;i++) { this->itens[i]=0; } this->nomeCliente=""; } }; void menu() { int i,op,quantidade; string nome; comanda cliente[200]; i=0; do { cout<<"1 - Para emitir nova comanda"<<endl; cout<<"2 - Para comprar alguma coisa do menu"<<endl; cout<<"3 - Fechar comanda"<<endl; cout<<"4 - Sair do programa"<<endl; cin>>op; if((op==1)&&(i<200)) { cout<<"Digite o nome do cliente (comanda)"<<endl; cin>>nome; cliente[i].setNomecliente(nome); cout<<"Codigo da comanda: "<<(i+1)<<endl; } else if(op==2) { cout<<"Digite o codigo da comanda"<<endl; if(cliente[i].getNomecliente()!="") { cliente[i].imprimenu(); cout<<"Digite a opcao desejada: "<<endl; cin>>op; cout<<"Digite a quantidade desejada: "<<endl; cin>>quantidade; cliente[i].compraItem(op,quantidade); op=1; } else { cout<<"Comanda invalida ou não cadastrada por favor cadastrar comanda"<<endl; } } else if(op==3) { cliente[i].imprimeComanda(); cout<<"Agradecemos a sua preferencia! \nObrigado"<<endl; } else if(op==4) { cout<<"Sistema sera fechado!"<<endl; } }while(op!=4); } int main() { menu(); return 0; } Obrigado ! :)
-
#include <stdio.h> #include <stdlib.h> typedef struct Pessoa { int cc; char nome[51]; char partida[11]; char chegada[11]; short int dia; } PESSOA; int main() { int i; FILE* fps = fopen("okb","rb"); PESSOA passageiro; if (fps == NULL) { printf("Problemas na abertura do arquivo\n"); exit(1); } else { fread (&passageiro.cc, 4, 1, fps); fread (passageiro.nome, 1, 51, fps); fread (passageiro.partida, 1, 11, fps); fread (passageiro.chegada, 1, 11, fps); fread (&passageiro.dia, 2, 1, fps); printf("%d ", passageiro.cc); for(i = 0; i < 51; i++) { printf("%c", passageiro.nome[i]); } for(i = 0; i < 11; i++) { printf("%c", passageiro.partida[i]); } for(i = 0; i < 11; i++) { printf("%c", passageiro.chegada[i]); } printf("%hd\n", passageiro.dia); } fclose(fps); } Boa noite, estava aqui a fazer um trabalho e deparei-me com isto e não consigo perceber o porquê da função não ler o que eu pretendo. Acho que deve ser algo bem simples mas como sou novo nisto não estou a conseguir detetar o que falha. É suposto esta função ler umas informações que estão num ficheiro em binário, o número do cc, nome da pessoa, local de partida e chegada do avião e dia do mês. Mas ao detetar o dia do mês a função em vez de escrever um número entre 1 - 30 escreve 256. Alguém percebe porquê?
-
Como armazenar a hora e o minuto do sistema em variáveis em C.
uma questão postou Matheus Marques C, C++
Eae pessoal, sou novo na programação. Queria uma ajudinha. To com um trabalho de fazer um programa que receba pedidos de um restaurante, só que é necessário que o pedido receba as horas e minutos do sistema, e armazenem em uma struct: ex: struct tempo { int horas; // a hora atual do sistema. int minutos; // o minuto atual do sistema. }; -
Boa noite, comecei a fazer um programa em C, mais no entanto ele ficou muito comprido com funções que se repetem. Tentei fazer bibliotecas e funções para diminuir a quantidade de linhas, mais no entanto não consegui (não sei fazer). Se alguém poder me passar algum site ou arquivo para fazer bibliotecas e funções agradeço. (De preferência em português).
- 1 resposta
-
- funçao
- linguagemc
-
(e %d mais)
Tags: