Ir para conteúdo
Fórum Script Brasil

== Douplus ==

Membros
  • Total de itens

    203
  • Registro em

  • Última visita

Tudo que == Douplus == postou

  1. == Douplus ==

    Código - OBI 2015

    Primeiro você está definindo um array de tamanho imprevisível, porque está usando size antes de inicializá-lo: int size, nm[size]; cin >> size; Segundo você não pode fazer isto se a condição do loop for i<n: if (v[i]==1&&v[i+1]==0&&v[i+2]==0){ Pois quando i = n-1 o teu programa tentará acessar v[n-1+2] que é fora dos limites do array, o que pode resultar em um valor indefinido (provavelmente zero) ou em uma falha de segmentação. Por causa dos erros no gerenciamento de memória, a saída do seu programa é imprevisível, foi inclusive sorte não ter crashado quando você enviou a solução.
  2. Provavelmente você não fez nada de errado, somente uma sua função executa em menos de um segundo para este caso.
  3. == Douplus ==

    Vetores char

    #include <stdlib.h> #include <stdio.h> int main(void) { char entrada[1000]; char *ptr; ptr = entrada; do { *ptr = getchar(); if (*ptr >= 'a' && *ptr <= 'z') { *ptr = *ptr - 'a' + 'A'; } } while (*(ptr++) != '$'); *(--ptr) = '\0'; printf("%s", entrada); return 0; }
  4. #include <iostream> using std::cout; using std::endl; #include <vector> #include <algorithm> #include <cstdlib> #include <ctime> template<class T> class Ordenador { protected: virtual bool temQueTrocar(T &alvo, T &outro)=0; public: virtual void ordenarVetor(std::vector<T> &v) { for(typename std::vector<T>::iterator it1 = v.begin(); it1 != v.end(); ++it1) { for(typename std::vector<T>::iterator it2 = it1; it2 != v.end(); ++it2) { if (temQueTrocar(*it1, *it2)) { iter_swap(it1, it2); } } } } }; template<class T> class OrdenadorCrescente : public Ordenador<T> { protected: virtual bool temQueTrocar(T &alvo, T &outro) { return (alvo > outro); } }; template<class T> class OrdenadorDecrescente : public Ordenador<T> { protected: virtual bool temQueTrocar(T &alvo, T &outro) { return (alvo < outro); } }; std::vector<int> *criarVetor(int qtde, int maior) { std::vector<int> *v = new std::vector<int>(); srand(time(0)); for (int i = 0; i < qtde; i++) { v->push_back((rand() % maior) + 1); } return v; } void mostrarVetor(std::vector<int> &v) { for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout<<(*it)<<' '; } cout<<endl; } int main(void) { std::vector<int> *v = criarVetor(50, 100); cout<<"Vetor original: \n"; mostrarVetor(*v); cout<<endl; OrdenadorCrescente<int> ordCresc; ordCresc.ordenarVetor(*v); cout<<"Vetor em ordem crescente: \n"; mostrarVetor(*v); cout<<endl; OrdenadorDecrescente<int> ordDec; ordDec.ordenarVetor(*v); cout<<"Vetor em ordem crescente: \n"; mostrarVetor(*v); cout<<endl; return 0; }
  5. Fala pro teu professor que não precisa de vetor, se ele quiser que você use vetor ele que passe outro exercício porque vetor só vai te complicar. Ele quer o menor peso, o maior peso e a média, certo? Pense assim: uma variavel (float) pra armazenar o menor peso, uma variavel (float) para armazenar o maior peso, uma variável (float) para ir somando os pesos e por fim uma variável (int) para contar quantos pesos foram entrados. Depois pra pegar a média usa a sua variável que guardou a soma de tudo e divide pela variável que contou quantas pessoas foram pesadas. Assim: #include <iostream> #include <string> using namespace std; int main(void) { float menor = 0; float maior = 0; float soma = 0; float peso; int qtde = 0; int pessoas; string placa; string fim("FIM"); do { cout<<"Digite a placa do carro: "; cin>>placa; if (placa.compare(fim)) { cout<<"Quantas pessoas? "; cin>>pessoas; for (int i = 0; i < pessoas; i++) { cout<<"Digite o peso da pessoa %d: ", i; cin>>peso; if ((menor == 0) || (peso < menor)) { menor = peso; } if (peso > maior) { maior = peso; } soma = soma + peso; } } qtde++; } while (placa.compare(fim) != 0); cout<<"Menor peso: "<<menor<<endl; cout<<"Maior peso: "<<maior<<endl; cout<<"Media: "<<(soma / qtde)<<endl; return 0; }
  6. Rapaz, não entendí a necessidade desse rolê todo... Já ouviu falar sobre um programa chamado make? Outra coisa: se quer fazer algo portável, use a ncurses direto... Tem versão pra Windows e pra Linux e a API é a mesma, não fica dando esses conflitos como o do cprintf() Até mais!
  7. Atente às linhas: P1 = SAL - (5/100); P3 = SAL - (25/100);... Você quer 5% de quê? 25% de quê? Os ifs não estão errados, mas com essas contas P1 e P3 vão sempre ser pequenos.
  8. Para que você quer uma interface gráfica?
  9. A representação na memória é diferente. Basicamente é a mesma diferença entre você fazer: char var[] = "64"; e int var = 64;
  10. Poder você pode, mas aí você estaria jogando o número como string no arquivo, enquanto fwrite() faz saída binária.
  11. Você quase chegou lá! Dá uma olhada, qualquer coisa pergunta: Lista* inverter(Lista* l){ Lista* aux, *ant, *prox; if(l == NULL) return NULL; while(l != NULL){ ant = l; aux = l->prox; l->prox = l->ant; l->ant = aux; l=aux; } return ant; }
  12. Você tava tentando mandar um inteiro para uma função que recebe um ponteiro. Para resolver, use a referência (%num) e converta-a explicitamente para const char * usando reintepret_cast. Não use fwrite(), é uma função da cstdlib e você está usando as classes de manipulação de arquivos do C++, portanto fique com a ofstream::write(). #include <fstream> using std::ofstream; #include <iostream> using std::cout; using std::cin; int main(void) { ofstream myfile; myfile.open ("alunos.dat"); short num; cout<<"Digite numero:"; cin>>num; myfile.write(reinterpret_cast<const char *>(&num),sizeof(short)); return 0; }
  13. Isso depende de como esse byte precisa ser interpretado Tem vários jeitos de fazer, implementei duas maneiras: a primeira usando uma variável char para a leitura e a segunda uma variável int. Mas, repito, há outros modos de se fazer isso. Ler sobre o complemento de dois é útil, porque é desse modo que números negativos são armazenados. Essa técnica faz os números negativos terem uma coleção de um ou mais bits setados (1) na parte mais significativa de sua representação binária. Exemplo: -10 com 1 byte (char): 11110110 -10 com 4 bytes (int): 11111111111111111111111111110110 Ler um -10 de um byte em uma variável int resultaria em: 00000000000000000000000011110110 (246d) por isso a conversão: 37 info2 = (char)info2; é necessária. Código: #include <stdlib.h> #include <stdio.h> #define FPATH "1dat" int main(void) { char info1; int info2 = 0; FILE *fptr = fopen(FPATH, "rb"); if (!fptr) { signed char outbyte = -37; fprintf(stderr, "Imposivel abrir arquivo.\nTentando criar arquivo...\n"); fptr = fopen(FPATH, "wb"); if (!fptr) { fprintf(stderr, "Impossivel criar o arquivo. Terminando\n"); exit(0); } fwrite(&outbyte, 1, 1, fptr); fclose(fptr); fprintf(stderr, "Arquivo criado.\n"); fptr = fopen(FPATH, "rb"); fprintf(stderr, "\n"); } printf("Lendo para variavel tipo char:\n\t"); if (fread(&info1, 1, 1, fptr)) printf("Inteiro lido: %d\n", info1); else fprintf(stderr, "Arquivo vazio.\n"); fseek(fptr, 0, 0); printf("Lendo para variavel tipo int:\n\t"); if (fread(&info2, 1, 1, fptr)) { info2 = (char)info2; printf("Inteiro lido: %d\n", info2); } else fprintf(stderr, "Arquivo vazio.\n"); fclose(fptr); getchar(); return 0; }
  14. então, não (heheh....). é assim, stdin le a entrada padrão, a principio o teclado. Essa linha le o que o usuario digita. A linha que grava é a linha"fprintf(arq, "%s", pessoa.nome); Tem que usar a fopen com o parametro "wb" ao invés do "w" usando fwrite() (<--- nesse link tem um exemplo).
  15. Olha... Mudei teu programinha, tenta entender e qualquer coisa pergunta. #include <stdio.h> #include <stdlib.h> struct nomeSobrenome{ char nome[50]; }; int main() { FILE *arq; int i; struct nomeSobrenome pessoa; arq = fopen("teste.txt", "w"); for(i=0;i<30;i++){ printf(" Nome completo : "); fgets(pessoa.nome, 50, stdin); fprintf(arq, "%s", pessoa.nome); } fclose(arq); return 0; } Outro detalhe, nesse caso estamos salvando a string num arquivo texto. Quando voce quiser salver uma struct use entrada e saida binaria para arquivos ao invés de texto. fwrite() e fread() fazem E/S binarias. Ateh!
  16. Tipo assim: #include <iostream> using std::cout; using std::endl; void printArr(int arr[], int pos, int qtde) { int fim = pos + qtde; for (int i = pos; i < fim; i++) cout<<arr[i]<<' '; } int main(void) { int lista[10] = {1,3,5,2,7,1,3,4,6,0}; int soma, ant = lista[0], novaSoma = ant, tam, novoTam = 1, pos = 0, novaPos = 0; bool none = true; cout<<"Lista: "; printArr(lista, 0, 10); cout<<endl; for (int i = 1; i < 10; i++) { if (lista[i] > ant) { novaSoma += lista[i]; novoTam++; } else { if (none) { soma = novaSoma; tam = novoTam; pos = novaPos; none = false; } // Se for o 2o caso, é só mudar a condicao para (tam < novoTam) else if (soma < novaSoma) { soma = novaSoma; tam = novoTam; pos = novaPos; } novaSoma = lista[i]; novoTam = 1; novaPos = i; } ant = lista[i]; } cout<<"Sequencia com maior soma: "; printArr(lista, pos, tam); cout<<"\n Soma: "<<soma<<endl; return 0; }
  17. Oi! não te entendi... Voce quer a sequencia que resulte na maior soma ou a soma da sequencia com mais elementos? No primeiro caso, crie duas variaveis: uma para a maior soma e outra para uma soma qualquer. Faca um loop, e enquanto aparecerem numeros em sequencia vai somando e colocando na variavel de soma qualquer. Se ao fim da sequencia (isto é, aparece um numero que quebre a sequencia ou chega no fim da lista) a soma qualquer for maior que a soma na variavel que guarda a maior soma atualize-a. No segundo caso, faca parecido mas crie tambem variaveis que contam o numero de elementos da maior sequencia e da atual.
  18. Boa tarde, Sergio Fiz um programa que cria e mostra uma árvore, ele quebra certinho os níveis mais não identa as linhas para parecer uma árvore. O '~' representa um ponteiro nulo, um terra em outros termos. Fica assim: 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Deveria ficar asssim: -- 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Seria interessante se alguém aqui do fórum tivesse uma idéia brilhante pra colocar os espaços em branco nos seus devidos lugares. Segue o código: #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct BTNode { int info; struct BTNode *lPtr, *rPtr; } BTNode; typedef BTNode *BTree; BTNode *createBTNode(int info) { BTNode *nnode = (BTNode *)malloc(sizeof(BTNode)); nnode->info = info; nnode->lPtr = NULL; nnode->rPtr = nnode->lPtr; return nnode; } void insert(int info, BTree btree) { if (info < btree->info) if (btree->lPtr == NULL) btree->lPtr = createBTNode(info); else insert(info, btree->lPtr); else if (info > btree->info) if (btree->rPtr == NULL) btree->rPtr = createBTNode(info); else insert(info, btree->rPtr); } typedef struct QNode { BTNode *info; struct QNode *next; } QNode; typedef struct Queue { QNode *head, *tail; int count; } Queue; QNode *createQNode(BTNode *info) { QNode *nqn = (QNode *)malloc(sizeof(QNode)); nqn->info = info; nqn->next = NULL; return nqn; } Queue *createQueue(void) { Queue *nq = (Queue *)malloc(sizeof(Queue)); nq->head = NULL; nq->tail = nq->head; nq->count = 0; return nq; } #define count(q) q->count void push(BTNode *info, Queue *q) { if (q->head == NULL) { q->head = createQNode(info); q->tail = q->head; } else { q->tail->next = createQNode(info); q->tail = q->tail->next; } q->count++; } BTNode *pop(Queue *q) { BTNode *ret = q->head->info; q->head = q->head->next; q->count--; return ret; } void printBTree(BTree btree) { Queue *q = createQueue(); int tmp; BTNode *node; push(btree, q); tmp = count(q); while (tmp > 0) { int i = 0; for (;i < tmp;i++) { node = pop(q); if (node != NULL) { printf("%d ", node->info); push(node->lPtr, q); push(node->rPtr, q); } else printf ("~ "); } printf("\n"); tmp = count(q); } } int main(void) { BTree btree = createBTNode(8); insert(4, btree); insert(12, btree); insert(2, btree); insert(6, btree); insert(10, btree); insert(14, btree); insert(1, btree); insert(3, btree); insert(5, btree); insert(7, btree); insert(9, btree); insert(11, btree); insert(13, btree); insert(15, btree); printBTree(btree); return 0; }
  19. Daria certo fazer o que eu falei se a função ExecuteFile() recebesse um ponteiro para FILE ou um descritor de arquivo ao invés de receber uma string com o caminho do arquivo. Isso não é uma má idéia, desse modo você pode usar esse código que você criou para interpretar mensagens vindas de sockets, por exemplo, ou então da stdin.
  20. Bom dia e bom trabalho! Ideia dwe expansao: use o interpretador para interpretar os parametros do argv =) Tou sem tempo agora, depois dou uma brincada. Abraco!
  21. Pois é, Douplus... Sempre foi assim, nunca foi descoberto o por quê. Parece ser uma limitação do IPB, uma pena, já me atrapalhou diversas vezes também. Abraços! Sou membro do fórum a mais de sete anos e nunca tinha reparado nisso!
  22. Que engraçado... o caractere nulo não aparece no post! Algum admin pode ver por que não é possível colocar <barra invertida + 0> ?
  23. #include <stdlib.h> #include <stdio.h> #include <string.h> #define BUFSZ 256 char *str2bin(char *str) { int chLen = sizeof(char)*8, strLen = strlen(str), binLen = chLen*strlen(str) + 1; char *bin = (char *)malloc(binLen), *binPtr, *strEnd = str+strLen, *chBase = bin; for (; str < strEnd; str++) { char ch = *str; binPtr = chBase + chLen - 1; for (; binPtr >= chBase; binPtr--) { *binPtr = (ch & 1) + '0'; ch = ch >> 1; } chBase += chLen; } binPtr[9] = ''; return bin; } char *bin2str(char *bin) { int chLen = sizeof(char)*8, binLen = strlen(bin), strLen = sizeof(char)*binLen/8; char *str = (char *)malloc(strLen+1), *strPtr = str, *binPtr, *strEnd = str+strLen, *chBase = bin; for (; strPtr < strEnd; strPtr++) { char p = 1; *strPtr = 0; binPtr = chBase + chLen - 1; for (; binPtr >= chBase; binPtr--) { *strPtr += p*(*binPtr-'0'); p = p << 1; } chBase += chLen; } strPtr[8] = ''; return str; } int main(void) { char input[BUFSZ]; printf("String? "); fgets(input, BUFSZ, stdin); printf("BIN= %s\n", str2bin(input)); printf("STR= %s\n", bin2str(str2bin(input))); return 0; }01000001011101001100001110101001001000000110110101100001011010010111001100100001
  24. Só cuidado com o possível overflow...
  25. Ah.... Exemplos? Existe aquela coisinha divertida de trocar valores de variáveis sem precisar de uma auxiliar: #include <stdio.h> int main(void) { int v1 = 13, v2 = 25; printf("v1 = %d\nv2 = %d\n\n", v1, v2); v2 ^= v1; v1 ^= v2; v2 ^= v1; printf("v1 = %d\nv2 = %d\n", v1, v2); return 0; }
×
×
  • Criar Novo...