Ir para conteúdo
Fórum Script Brasil

Luiz Rodrigo

Membros
  • Total de itens

    22
  • Registro em

  • Última visita

Tudo que Luiz Rodrigo postou

  1. Parece que o erro está nesse trecho de código: par[contPar]=frase[x]+frase[z]; Quando você soma dois caracteres (ex: 'A' + 'A') , você não está concatenando (se estivesse, o resultado seria "AA"), você está somando os valores ASCII dos caracteres. No exemplo, o código ASCII de 'A' é 65, a soma retorna o caractere com código ASCII 130, que provavelmente não é uma letra. Para resolver esse problema, acho que seria bom reescrever a linha, ficando assim: par[contPar] = frase[x] Afinal, se os dois caracteres são iguais, não há necessidade de armazenar duas vezes o mesmo caractere. Na hora de escrevê-los, faria algo assim: for (register int i = 0; i < contPar; i++) cout << par[i] << par[i] << '\n'; /* Parece que todos o professores de programação são iguais, quando o assunto na escola técnica era array, passaram o mesmo exercício, com a diferença de que era em... pascal */
  2. Luiz Rodrigo

    ofstream

    É que você não está especificando o modo como deseja abrir o arquivo. Quando você usa o construtor (ou a função open() ) só com o endereço do arquivo, como abaixo ofstream arquivo( enderecoDoArquivo ); ou ofstream arquivo; arquivo.open ( enderecoDoArquivo ); você paga todo o conteúdo do arquivo, ou cria um novo arquivo, caso não exista. Para que as operações de saída sejam realizadas no final do arquivo, especifique, usando ios::app ou ios::ate (não lembro a diferença dos dois...). ofstream arquivo( enderecoDoArquivo, ios::app ); ou ofstream arquivo; arquivo.open( enderecoDoArquivo, ios::app );
  3. Acho que você se confundiu um pouco, pois o < retorna exatamente o contrário de >=, sendo necessário usar o operador de complemento (não) para obter o resultado desejado. Um dos pontos a favor do >= e <= é legibilidade. É muito mais fácil de ler um código do tipo if ( x >= y ) que um do tipo if ( !(x <y) ) Sobre ser mais ou menos lento, é irrelevante, pois a maioria dos processadores atuais consegue fazer milhões de operações de comparação entre tipos primitivos por segundo (uma operação de escrita no console leva muito mais tempo). Também não faz muito sentido dizer que o >= faz duas comparações, porque não sabemos (eu pelo menos não sei) como a ULA do processador realiza a comparação.
  4. Luiz Rodrigo

    Vetores

    Uma instrução scanf ("%*c") serve para ler um caractere e ignorá-lo. Quando você usa uma instrução como essa, você lê o caractere do teclado, mas o valor lido não passa para nenhuma variável. Do jeito como o Miranda disse, serviria para segurar a tela, até que alguma tecla tenha sido lida.
  5. Eu realmente estava incluindo read.h numa outra biblioteca e no arquivo principal, ocasionando o erro. Incluí somente na biblioteca e funcionou. Valeu Mnemonic!
  6. Estou criando um pequeno programa, que usa as duas funções da biblioteca read.h, abaixo: #include <new> #include <string> #include <cstdio> #include <fstream> using namespace std; using std::string; void readstr (string &str, int max = 128) //lê uma string com espaços do teclado { char *p; p = new char[max]; gets (p); str = p; delete p; } void freadstr (ifstream &file, string &str, int max = 128) //lê uma string com espaços de um arquivo { char *p; p = new char[max]; file.getline (p, max); str = p; delete p; } Mas ocorre que quando compilo o projeto, o compilador que utilizo (Visual C++), gera as seguintes mensagens de erro: Aí eu pesquisei no site do Visual Studio sobre o tal erro C2084, que diz que é quando você redefine a mesma função, como no exemplo: void Func(int); void Func(int) // define specialization { } void Func(int) // C2084 second definition { } Mas aí que eu não entendi: se eu só coloquei uma vez cada função no arquivo (sequer sobrecarreguei-as), como pode acusar esse erro? Agradeço, desde já, pela ajuda.
  7. Luiz Rodrigo

    fatoração

    Como assim fatoração? Para (1) mostrar os divisores para (2) decompor o número? No primeiro caso é mais fácil: #include <iostream> using namespace std; int main() { unsigned num; cout << "Digite um numero "; cin >> num; cout << "\nDivisores de " << num << ": "; for (register int i = 1; i <= num; i++) //de 1 até o número, verifica se é um divisor, se for, escreve o divisor. if (!(num%i)) cout << i << ' '; return 0; } No segundo é um pouco mais complicado, pois para decompor temos que ir dividindo por números primos: #include <iostream> using namespace std; int main() { int num, div, i; cout << "Digite um numero: "; cin >> num; cout << "Numero " << num << " decomposto: "; div = 2; //primeiro numero primo while (num != 1) { if (!(num%div)) { cout << div << ' '; num /= div; } else div++; } return 0; } Espero ter ajudado!
  8. Pelo que deu para entender, a dívida e calculada com a fórmula do juros composto: Onde m = montante, c = capital, i = taxa e n = número de períodos. Para calcular a potência, é só multiplicar o capital c pela taxa i + 1, n vezes. Por exemplo, se anos é igual a 3, então o montante final é igual a c*(1+i)*(1+i)*(1+i). É importante notar que a taxa deve estar em decimal (12% é igual a 0,12). double divida total (int ano, double montante, double taxa) { for (; ano; ano--) montante *= (1 + taxa); return montante; }
  9. Luiz Rodrigo

    Funções

    Normalmente, da mesma forma que você chamaria um função em main(), afinal, main() também é uma função. Só o que não pode é você criar uma função dentro de outra, mas chamar, tudo bem.
  10. Não é só deixar de imprimir as cartas do jogador?
  11. Você poderia armazenar o AuxCartas[] como static, assim, quando você quisesse os valores de volta, os valores do AuxCartas[] não seriam perdidas. Mas aí tem um problema: o AuxCartas[] é local da função ocultaCartas(), daí você não poderia criar uma função para desocultar as cartas, ou seja: a mesma função que oculta desocultaria. Para isso, você poderia criar um novo parâmetro que especificaria se deseja ocultar ou desocultar o vetor. O que ficaria meio com cara de gambiarra. Mas ocultar o vetor é realmente necessário, ou você poderia somente escrever os '#' e '*'? Ps: Você não pode declarar funções como void?
  12. Em vez de "remover" as cartas do baralho, você poderia criar uma função que retornasse o valor da carta mais "no topo", ou mais "no fundo", tanto faz, e, depois de puxada, colocasse o número da carta como um 0 (ou qualquer outro valor à sua escolha). Daí, da próxima vez que você fosse pegar uma carta, deveria pegar a carta mais no topo que não fosse 0. Na hora de puxar uma carta ou comprar, você não fica com 6 cartas na mão. Você primeiro vê se quer a carta, descarta uma da sua mão e puxa a carta desejada. Você poderia perguntar a cada rodada se o jogador deseja puxar uma carta do baralho ou pegar a ultima carta descartada. Dai ele selecionava a carta que queria descartar e você trocava a carta (do baralho) pela carta que quer descartar.
  13. O programa está gerando as cartas corretamente, sem repetição, mas parece que o problema está na hora de embaralhar. Testei aqui e repetiu três vezes o 9c...vou dar uma olhada para ver se consigo resolver esse problema. edit: Na verdade, o "erro" estava em colocar o printf() dentro do loop que embaralha. É que usando esse método, eu não necessariamente troco cada carta uma vez, eu troco cada posição uma vez. Daí ele poderia escrever a carta agora, só que a carta poderia mudar de posição e mais a frente ele a escreveria de novo. Por exemplo, imagine a seqüência de números abaixo: 1 2 3 4 5 6 Na segunda iteração, ele imprimiria 2. Mas imagine que trocássemos o dois pelo cinco: 1 5 3 4 2 6 Quando iterasse pela quinta vez, imprimiria o 2 de novo, e era isso que estava acontecendo. Se você criar um outro loop para escrever as cartas, fora do bloco para embaralhar, você pode perceber que está funcionando normalmente. Qualquer coisa, estamos aí! B)
  14. #include <stdio.h> int main() { int x, y, aux; scanf("%d %d",&x,&y); //vou ler os dois números do teclado while (x != y) { aux = (x > y) ? x : y; //pega o maior dos dois x = (x < y) ? x : y; //o primeiro é o menor dos dois y = aux - x; //o segundo é a diferença entre o maior e o menor printf("%d %d\n",x,y); } return 0; }
  15. Você pode a cada rodada limpar a tela atual e imprimir de novo, criando uma função para isso. Não dá muito trabalho não. Na verdade, foi assim que eu fiz meu primeiro joguinho, uma versão tosca do pac-man com um só adversário. Você pode também usar uma função de posicionamento de cursor (a.k.a gotoxy() ) e escrever sempre numa mesma posição, daí toda vez que você atualizar, sobreescreve o que estava escrito anteriormente. Só que a função gotoxy() não faz parte da biblioteca padrão, e as versões que eu encontrei na internet usavam a biblioteca <windows.h>
  16. É mais ou menos assim: quando você faz uma divisão inteira de um número x por um número y, se você analisar bem, ficam sempre y números repetidos, por exemplo: f(x) = x/3: se você começar a tabelar a partir de zero, fica assim: 0 -> 0 1 -> 0 2 -> 0 3 -> 1 4 -> 1 5 -> 1 6 -> 2 7 -> 2 8 -> 2 9 -> 3... Nesse caso, ficam sempre 3 números iguais, porque estou dividindo por três Aí eu me aproveitei disso para inicializar várias variáveis com o mesmo valor. num[i] = i / 4 +1; A parte de somar 1 serve para não inicializar cartas com o valor 0, pois como você viu no exemplo, as três primeiras começam com 0. for (i = 0; i < 52; i++) { //embaralhar; do { j = rand()%52; } while (i == j); ai = num[i]; num[i] = num[j]; num[j] = ai; ac = naipe[i]; naipe[i] = naipe[j]; naipe[j] = ac; } A função rand gera um valor aleatório entre 0 e (algum número grande). Só que eu quero números aleatórios entre 0 e 51, para isso eu peguei o resto de rand() por 52, pois os valores que essa conta pode dar estão entre 0 e 51. Eu ponho o loop controlado por i que vai de 0 a 51, ou seja, passando por todas as cartas do baralho. Eu pego um valor aleatório j entre 0 e 51, usando a função rand(), e troco os valores das variáveis que estão na posição i e j. Repetindo isso 52 vezes, o baralho fica bem embaralhado. do { j = rand()%52; } while (i == j); Sobre o trecho acima, existe a possibilidade de o valor aleatório j que eu pegar ser igual ao indíce i. Nesse caso, eu trocaria variáveis que estão na mesma posição, seria trocar 6 por meia dúzia. Aí essa repetição garante que eu vá pegar valores aleatórios distintos e efetivamente trocar 52 vezes. Ah, não pode dar divisão por zero, pois isso só é um erro quando o 0 está na parte de baixo, mas o que está na parte de baixo é o 4.
  17. Você poderia criar dois vetores: um para o numero e outro para o naipe. #include <stdlib.h> int main(){ int num [52], i, j, ai; char naipe [52], ac; for (i = 0; i < 52; i++) { //inicialização num[i] = i / 4 +1; switch (i%4) { case 0: naipe[i] = 'c'; break; //copas case 1: naipe[i] = 'e'; break; //espada case 2: naipe[i] = 'o'; break; //ouros case 3: naipe[i] = 'p'; break; //paus } } for (i = 0; i < 52; i++) { //embaralhar; do { j = rand()%52; } while (i == j); ai = num[i]; num[i] = num[j]; num[j] = ai; ac = naipe[i]; naipe[i] = naipe[j]; naipe[j] = ac; } } Na inicialização, ele pega as quatro primeiras cartas e pões numero 1, da quinta a oitava, 2, da nona até a 12, 3... até todas terem um número. No final, cada número terá quatro cartas (Haverá 4 cartas 13, 4 cartas 12...). Para cada uma dessas quatro cartas, ele põe um naipe. Se você colocar printf dentro desse loop, dá para ver como as cartas são "criadas". Para embaralhar, usei a função rand. Ele pega cada poisção do vetor e troca por outra aleatória. Observe que o do..while, que garante que haverá exatamente 52 trocas. Na verdade, o programa ficaria bem mais elegante se usasse struct, mas não sei podia usar...
  18. É simples, basta usar um loop que repete 13 vezes, e que tenha uma variável que armazene a soma. Só que tem um detalhe: uma hora soma, outra diminui. Para isso você pode usar a variável de controle do loop para determinar quando soma e quando diminui, como abaixo: #include <stdio.h> int main() { double soma; long fat = 1; //O fatorial de 12 é maior que 32767. Bem maior int x, i; scanf ("%d",&x); soma = x; for (i = 1; i < 13; i++) {//começa como 2 porque x já é um termo fat *= i; //calcular o fatorial if (i%2) soma -= (double) x/fat; //quanto o número do termo for ímpar, diminui else soma += (double) x/fat; //quando for par, soma } printf ("%.10f",soma); return 0; }
  19. Luiz Rodrigo

    Dúvida em C

    Eu acho que você deveria criar uma variável que contasse quantos termos já foram escritos, como no código a seguir: #include <stdio.h> int main() { int anterior = 0, atual = 1, fib, i; for (i = 1; i <= 20; i++) { fib = anterior + atual; printf ("%d termo: %d\n", i, atual); anterior = atual; atual = fib; } return 0; }
  20. #include <stdio.h> #include <ctype.h> #include <conio.h> int main() { char str [21]; int i; printf ("Digite uma string: "); gets (str); printf ("String original: %s\n",str); for (i = 0; str[i]; i++) if (islower(str[i])) str[i] = toupper (str[i]); else if (isupper(str[i])) str[i] = tolower (str[i]); printf("String com caixa invertida: %s",str); getch(); return 0; } Basicamente é isso: lê uma string, vai vendo caractere por caractere se é minúscula, se for, troca para maiúscula, senão, se for maiúscula, troca para minúscula.
  21. Primeiramente, as variáveis tel, pulso e inter deveriam ser declarados como seu respectivo tipo, var tel: t_vettel; pulso: t_vetpulso; inter: t_vetinter; pois o compilador poderia acusar que os argumentos são incompatíveis (type mismatch), pois para o compilador, array [1..2] of real e t_velpulso são tecnicamente diferentes, embora sejam a mesma coisa. Todos os argumentos da procedure cont deveriam ser passados por referência, como abaixo: procedure cont (var tel: t_vettel; var pulso: t_vetpulso; var inter: t_vetinter); Porque todos os vetores passados são modificados dentro da procedure. Na hora de chamar, basta usar os nomes das variáveis: cont (tel, pulso, inter) o programa deveria ficar assim: program conta_telefonica; uses crt; type t_vettel=array[1..2]of string[12]; t_vetpulso=array[1..2]of real; t_vetinter=array[1..2]of real; procedure cont(var tel: t_vettel; var pulso: t_vetpulso; var inter: t_vetinter); var i:integer; begin for i:=1 to 2 do begin writeln('Digite seu numero de telefone:'); readln(tel[i]); writeln('Digite quantos pulsos gastos para chamadas locais:'); readln(pulso[i]); writeln('Digite o valor de todas as chamadas interurbanas:'); readln(inter[i]); end; end; var calc: real; i: integer; tel: t_vettel; pulso: t_vetpulso; inter: t_vetinter; begin clrscr; Cont(tel, pulso, inter); for i:=1 to 2 do begin writeln('Telefone:',tel[i]); calc:=(pulso[i]*0.127)+inter[i]; writeln('O Calculo e: R$',calc:0:2); end; readln; end. Só uma dica: seria bom criar uma constante max que tivesse o valor de 2, pois facilitaria a manutenção do código!
×
×
  • Criar Novo...