Ir para conteúdo
Fórum Script Brasil

Marcelo Utikawa da Fonseca

Membros
  • Total de itens

    297
  • Registro em

  • Última visita

Tudo que Marcelo Utikawa da Fonseca postou

  1. Tente isso: #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) Use como se fosse uma função: tamanho = ARRAY_SIZE(A1); Abraços, Marcelo Utikawa da Fonseca
  2. Olá! Sei código parece estar correto. O único problema é com a declaração da matriz. Você declarou a matriz como sendo 2x2 mas os seus loops consideram 10x10. Corrija isso que deve resolver seu problema! Abraços, Marcelo Utikawa da Fonseca
  3. Olá! Existem algumas coisas no seu programa que são o motivo de não funcionar: 1- Ao invés de declarar frase como ponteiro e usar o strdup, declare frase como vetor. char frase[100], letra; 2- para comparar um char, use aspas simples. Aspas dupla indicam uma sequência de caracteres. if(letra == 'A') Edit: Remova a linha com o strdup Abraços, Marcelo Utikawa da Fonseca
  4. Bom dia! Não é besteira sua não! É muito bom isso, realmente ajuda a entende melhor... E não é exploração, fique tranquilo! Quem responde está disposto a ajudar, ninguém faz nada obrigado... :) Sobre a sua dúvida: eu não entendi exatamente o que você quis dizer. Você diz sobre como exibir o tabuleiro em só ou como calcular o número de bombas em inq determinada posição? Eu pensei um pouco agora e imaginei o seguinte: Para desenhar o tabuleiro é necessário saber duas coisas: 1- Se o usuário já escolheu o campo ou não (para saber se o campo está oculto) 2- Número de bombas adjacentes Assim precisaríamos de duas matrizes em um primeiro momento. Mas podemos fazer da seguinte forma: iniciar toda a matriz com -2. Esse é o valor que indica que está posição não foi escolhida ainda e não deve ser exibida. As bombas serão os campos que estiverem com -1 e as posições com valores a partir de zero são as que o usuário já abriu. Desta forma você exibe o tabuleiro conforme o valor em cada posição. E quando o usuário escolher uma posição, calcula-se o número de bombas adjacentes e carrega na matriz. Abraços, Marcelo Utikawa da Fonseca
  5. Boa tarde! O que você diz é que criou a estrutura de dados e as funções para manipulá-las e quer saber se pode acessar os dados diretamente, correto? Como o conceito da TAD é a abstração e independência do seu código da implementação, o uso do array diretamente quebra esse paradigma... Veja que quebra o conceito da TAD, não o conceito da Lista! Talvez possam haver opiniões diferentes mas este é o meu ponto de vista. :) Abraços, Marcelo Utikawa da Fonseca
  6. Boa tarde! O problema é que você precisa declarar a variável antes de usá-la. Você apenas copiou o código e não declarou a variável bombas. Outro problema é que, mesmo que tivesse declarado a variável, já existe uma definição que define bombas para 1. Esse é o motivo de, por convenção, sempre criar os defines em letras maiúsculas. Além disso é útil colocar no nome da variável algo que indique seu tipo para que, ao utilizá-la, não se confunda. Assim o que você precisa mudar no seu código é trocar, no trecho de código que passei, a variável chamada "bombas" por "iBombas", por exemplo. Lembre-se de declarar a variável também: int iBombas; Outra coisa: no código que eu tinha passado, a inicialização do vetor é o carregamento com zero. Na sua lógica você colocou também uma atribuição de um valor lido com a função rand(). Essa linha é incorreta pois assim o vetor conterá qualquer valor, o que não é o que se espera após a inicialização. Assim apenas remova a linha que atribui o valor recebido de rand como abaixo: for (i=0; i<TAMCampo; i++){ for (j=0; j<TAMCampo; j++){ matrizCampo [i][j]=0; //iniciando a matriz com zero } } Abraços, Marcelo Utikawa da Fonseca
  7. De nada! A intenção é ajudar. Portanto objetivo cumprido! B) Sobre o novo erro, deve-se ao fato de que in_addr_t não foi definido. Inclua no seu programa a seguinte linha: #include <winsock2.h> Isso indica que você ainda não estava usando o winsock. Antes de utilizá-lo, ele deve ser inicializado. No main adicione isso: int iResult; WSADATA wsaData; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { Error(_("WSAStartup failed: %d\n"), iResult); return 1; } Abraços, Marcelo Utikawa da Fonseca
  8. argc indica o número de parâmetros recebidos, basta jogar ele na tela! Abraços, Marcelo Utikawa da Fonseca
  9. Boa tarde! Na verdade existe um sub-fórum específico para anúncio de vagas, o qual pode ser encontrado na página inicial do fórum. Inclusive acho que este tópico será movido para lá em breve! :D Interessante a sua vaga, só não participo da seleção pois já estou empregado e a contratação seria por tempo integral... Boa sorte na procura! Abraços, Marcelo Utikawa da Fonseca
  10. Ok! Mas mude uma coisa no código pois me esqueci do & no scanf ao ler a placa! O correto é: scanf("%d", &p->pilha[p->itens].placa); Abraços, Marcelo Utikawa da Fonseca
  11. Realmente acabei não citando a DEV-C++, esqueci dela mesmo... :) Mas isso aconteceu pois eu não sou muito fã dela por parecer simples. Sinceramente nunca a utilizei. Eu escolheria ou a eclipse (se for pensar na possibilidade de usar a mesma interface para programar tanto em Linux ou Windows, por exemplo) ou então no Visual Studio C++ Express. A vantagem do último é que é da própria MS e portanto é muito utilizada profissionalmente. Mas escolha de IDE é algo muito pessoal. Acho que o ideal é você testar algumas para ver com qual se adapta melhor! Eu pessoalmente uso o Visual Studio para programa no Windows e o Eclipse para programar no Linux. Abraços, Marcelo Utikawa da Fonseca
  12. Bom dia! Eu não sei porque mas acho que já vi isso em algum lugar! :D Para fazer cópias entre vetores é como uma atribuição. Mas depende da lógica controlar a quantidade de cartas existentes em cada vetor. Por exemplo: int CartasVetor1=0, CartasVetor2=0; int Vetor1[13], Vetor2[13]; Essa é a declaração das variáveis. Depois os vetores foram carregados como abaixo: Vetor1[0] = 1; CartasVetor1++; Vetor1[1] = 5; CartasVetor1++; Vetor2[0] = 8; CartasVetor2++; Agora é só copiar: Vetor2[CartasVetor2] = Vetor1[CartasVetor1-1]; CartasVetor2++; CartasVetor1--; Abraços, Marcelo Utikawa da Fonseca
  13. Bom dia! Antes de qualquer coisa, quero comentar um pouco sobre pilhas. Elas são o que o nome diz: um conjunto de objetos agrupados de forma sequencial, como uma pilha de pratos ou mesmo uma fila de banco. Basicamente existem dois tipos de pilhas, que foram exemplificados nestes exemplos: a FILO (First In, Last Out - Primeiro a entrar, Último a sair - a pilha de pratos) e a FIFO (First In, First Out - Primeiro a entrar, Primeiro a sair - a fila de banco). Para o controle de um estacionamento seria mais normal uma lista e não uma pilha mas já que foi pedido assim, tudo bem... :) Agora sobre o seu código: As estruturas estão ok. Eu só mudaria uma coisa na definição da pilha: ao invés da variável início eu teria outras duas: tamanho e itens. Tamanho armazenaria o total de elementos que podem ser inseridos e itens seria a quantidade de elementos que existem na pilha. Outra coisa: a placa tem letras também então, a não ser que o professor falou para ser feito assim, você precisaria mudar para um char[10] como você fez com as outras variáveis. Sobre o seu "erro" o que acontece é que essa é a função cria a pilha e não a que incrementa. Incrementar a pilha seria adicionar um item a ela. Essa função cria a pilha corretamente, não há erro nenhum... :) Depois, para adicionar, use um código como o abaixo: void incrementa_pilha(tpilha *p) { if(p->itens < p->tamanho) { printf("Marca: "); scanf("%s", p->pilha[p->itens].marca); printf("Modelo: "); scanf("%s", p->pilha[p->itens].modelo); printf("Cor: "); scanf("%s", p->pilha[p->itens].cor); printf("Placa: "); scanf("%d", p->pilha[p->itens].placa); p->itens++; } else { printf("Pilha cheia!\n"); } Este código eu fiz de cabeça, no celular e dentro do tem mas acho que está correto! :D Qualquer coisa avise! Abraços, Marcelo Utikawa da Fonseca
  14. Olá! Pode perguntar à vontade! :) Para programar em C/C++ você precisa de, pelo menos, um compilador. Ele é o responsável por converter o código fonte em um arquivo .exe já que, diferentemente do php, o código não é interpretado. Com o .exe gerado, basta executá-lo como um programa qualquer, não precisa de mais nada. Assim você poderia criar o código até no notepad... :P Mas normalmente se utiliza uma IDE para programar como eclipse, netbeans, codeblocks ou mesmo o visual studio express. Os dois últimos já vem com um compilador então é mais fácil para começar. Já se você está acostumado a programar em php no eclipse, por exemplo, instale um compilador e use ela mesmo. Já que você mencionou o wamp acho que você usa o windows então pode instalar o mingw. Abraços, Marcelo Utikawa da Fonseca
  15. O problema agora é que o tipo uint32_t não é definido. Esse tipo também é um typedef. Tente adicionar o stdint.h: #include <stdint.h> Abraços, Marcelo Utikawa da Fonseca
  16. Olá! Realmente este código está confuso para ser apenas a introdução a classes. E concordo que é muito mais do que seria feito com uma estrutura simples! Porém nesse código já se vê conceitos importantes: 1) Construtores: funções que são chamadas quando se instancia um objeto da classe, dando a oportunidade de se controlar a inicialização como valores iniciais de variáveis, etapas adicionais como carregamento de uma dll, por exemplo 2) Proteção no acesso aos dados: diferentemente do que acontece em uma estrutura, existe a proteção quanto ao acesso dos dados (através do private e protected). Assim você consegue garantir a integridade dos valores carregados nas variáveis, tornando o programa mais seguro quanto a erros de programação, por exemplo. 3) Destrutores: sempre que uma instância for destruída é possível executar uma função sua onde você pode, por exemplo, desalocar áreas de memória, notifica outras partes do programa, etc. Assim não depende do programador a realização de certas tarefas que podem ser eventualmente esquecidas, afetando a qualidade do programa. Além disso ainda existem muitas e muitas outras características na programação orientada a objetos como herança, polimorfismo, etc... Segue abaixo um exemplo mais simples: #include <stdio.h> class Pessoa { private: char nome[100]; int idade; public: void carregar(char *novo_nome, int nova_idade) { strcpy(nome, novo_nome); idade = nova_idade; } void exibir(void) { printf("Eu sou %s e tenho %d anos.\n", nome, idade); } }; int main(void) { Pessoa p; p.carregar("Fulano", 20); p.exibir(); return 0; }
  17. Boa tarde! Nesse caso você precisa apenas abstrair do problema o que deve ser feito. Esquecendo um pouco a historinha, vamos ao que interessa! :) Você precisa carregar 96 valores em cada um dos vetores. Esse vetor armazena temperaturas (valores que podem ter parte decimal, ponto-flutuante) Você precisa calcular a média, ou seja, somar todos os valores em cada vetor e comparar os dois resultados. Exibir o menor valor Vamos ao Código! float TempTelha1[96], TempTelha2[96], soma1, soma2; int i; for(i=0; i<96; i++) { printf("Digite a temperatura de telha 1: "); scanf("%f", &TempTelha1[i]); printf("Digite a temperatura de telha 2: "); scanf("%f", &TempTelha2[i]); } soma1 = soma2 = 0; for(i=0; i<96; i++) { soma1 += TempTelha1[i]; soma2 += TempTelha2[i]; } if(soma1 < soma2) { printf("Telha1 tem menor media: %.02f\n", soma1/96); } else { printf("Telha2 tem menor media: %.02f\n", soma2/96); } Abraços, Marcelo Utikawa da Fonseca
  18. Opa! Desculpe não responder antes, estive um pouco ocupado esses dias... :) Você pode usar qualquer banco. Isso vai depender mais é da aplicação mesmo. Se for algo simples, avalie o SQLite pois já tem API em C/C++ e não depende de servidor: http://www.sqlite.org Como um exemplo, tenho uma aplicação aqui em que tenho um equipamento rodando linux com mysql local. É uma máquina da produção e que carrega as peças que deve produzir do sistema da empresa, que está em SQL Server. Assim o mesmo programa trabalha com os dois bancos ao mesmo tempo! Abraços, Marcelo Utikawa da Fonseca
  19. Se o include referencia rfb/rfb.h, então o rfb.h não deve estar na sua pasta de trabalho mas sim em uma subpasta chamada rfb. Além disso lembre-se de usar aspas se for incluir o arquivo sem adicionar seu caminho nas opções do compilador: Esse código adiciona o arquivo rfb.h diretamente da pasta do projeto, sem exigir subpastas: #include "rfb.h" Qualquer coisa poste um fragmento do código que está dando erro e as configurações do projeto. Abraços, Marcelo Utikawa da Fonseca
  20. Eu não sou admin mas a minha sugestão é criar um tópico na seção de tutoriais pois está escrito que códigos prontos devem ser postados lá... B) http://scriptbrasil.com.br/forum/index.php?showforum=75 Abraços, Marcelo Utikawa da Fonseca
  21. Olá! Está ficando bem interessante. O caminho é por aí mesmo! :) Uma coisa que você deveria mudar é a forma de sorteio de bombas. No código abaixo: for (i=0; i<TAMCampo; i++){ for (j=0; j<TAMCampo; j++){ matrizCampo [i][j]=0; //iniciando a matriz com zero matrizCampo[i][j]=rand()%TAMBombas; } } Você escolhe para cada campo o numero de bombas que tem adjacentes, não é? Mas isso deve ser calculado e você deveria apenas marcar onde existe uma bomba em coordenadas aleatórias. Vamos considerar que se determinada posicao tiver -1 indica que há uma bomba nessa posição. Depois, o número de bombas adjacentes devem ser calculadas pelo código. Por exemplo: // Primeiro inicializa a matriz for (i=0; i<TAMCampo; i++){ for (j=0; j<TAMCampo; j++){ matrizCampo [i][j]=0; //iniciando a matriz com zero } } // Agora carrega as bombas bombas=0; while(bombas < TAMBombas) { // Escolhe uma posicao aleatoriamente i = rand()%TAMCampo; j = rand()%TAMCampo; // Se não existir uma bomba nessa posicao, marca e incrementa bombas if(matrizCampo [i][j] == 0) { matrizCampo [i][j] = -1; bombas++; } } Abraços, Marcelo Utikawa da Fonseca
  22. Bem... acho que não existe nenhuma fórmula mágica quanto a primeiro programa... A não ser o hello world que é obrigação!!! :D Por falar em hello world, segue em C e C++: C #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } C++ #include <iostream> using namespace std; int main(void) { cout << "Hello World!" << endl; return 0; } Mas muitas vezes o primeiro programa que dizem para fazer é um cadastro. Isso porque com ele se usam diversos recursos como loops, vetores, etc. Eu recomendo muito começar por algum tutorial. Procure na net e com certeza encontrará muitos!!! E pergunte à vontade pois sempre vocÊ terá respostas por aqui! :) Abraços, Marcelo Utikawa da Fonseca
  23. Resumidamente: é possível fazer TUDO!!! Desde criar um cadastro de locadora até criar o próprio ASP, PHP ou o Windows!!! :P Claro que existem linguagens mais fáceis de fazer algumas coisas mas se a pergunta é o que é possível fazer, essa é minha resposta... :D Exemplo: o kernel do linux é feito totalmente em linguagem C (nem C++ é). Com ele uma infinidade de dispositivos são controlados. Desde um aparelho DVD até a injeção de um automóvel. Basicamente qualquer área que exiga um software otimizado (como no caso de um jogo, por exemplo) irá utilizar muito C e C++. Se quiser saber mais sobre alguma área é só falar! :) Abraços, Marcelo Utikawa da Fonseca
  24. Boa tarde! Existem alguns problemas na sua lógica. Primeiro, o fseek está incorreto. Ao usar o SEEK_SET, você define o deslocamento em bytes do começo do arquivo. Já no SEEK_CUR, o avanço é relativo à posição atual. Assim, no código abaixo: fseek(registro,1 * sizeof(reg.nome),SEEK_SET); fwrite(& reg.nome,sizeof(reg.nome),1,registro); fseek(registro,2,SEEK_CUR); fwrite(& reg.telefone,sizeof(reg.telefone),1,registro); Primeiro você avança o tamanho do campo nome. Mas como no início do arquivo não tinha nada gravado então ficou um espaço não utilizado. Além disso, você avança 2 bytes para gravar o telefone mas, quando você lê o telefone do arquivo, o avanço é de apenas 1 byte, fazendo com que o telefone seja lido de uma posição diferente daquela em que ele foi gravado. Outra coisa: para usar o scanf com a variável nome, use apenas assim: scanf("%s",reg.nome); ou então assim: scanf("%s",&reg.nome[0]); Aquele & não deve ser usado com o nome do vetor pois, quando ele não tem índice, o seu nome já aponta para seu conteúdo. Apenas use o & se tiver colocado o índice junto ao nome do vetor, como no segundo exemplo. O mesmo serve para o printf! Agora a solução: para gravar os dados de uma estrutura, o mais simples é gravar toda a estrutura. E não se preocupe com o fseek. Sempre que você realiza uma leitura ou escrita, o ponteiro já é deslocado então basta ler ou gravar o próximo dado. E no caso da função para cadastrar, apenas abra o arquivo para adicionar novos dados ao invés de uma gravação apenas. Assim você adiciona novos dados sem perder os que já foram gravados! Veja o seu código abaixo com as minhas modificações. A opção de cadastrar adiciona um novo registro e a função de listar exibe todos os que já foram gravados: #include <stdio.h> #include <stdlib.h> struct regis { char nome[20]; int telefone; }; int main(int argc, char *argv[]) { struct regis reg; int sa=0,cond; FILE *registro; while(sa==0) { printf("digite 1 para cadastrar 2 para visualizar e 3 para sair:\n"); scanf("%d",&cond); system("cls"); switch(cond) { case 1: registro=fopen("registro.txt","a+b"); printf("entre com seu nome:\n"); scanf("%s",reg.nome); printf("entre com o numero de telefone: \n"); scanf("%d", & reg.telefone); fwrite(& reg,sizeof(struct regis),1,registro); fclose(registro); printf("digite 3 para sair ou 0 para voltar ao menu: \n"); scanf("%d",&sa); system("cls"); break; case 2: registro=fopen("registro.txt","rb"); while(fread(& reg,sizeof(struct regis),1,registro) > 0) { printf("%s\n",reg.nome); printf("%d\n",reg.telefone); } fclose(registro); printf("digite 3 para sair ou 0 para voltar ao menu: \n"); scanf("%d",&sa); system("cls"); break; } } return 0; } Qualquer dúvida avise que eu explico! :) Abraços, Marcelo Utikawa da Fonseca
  25. Olá! Pelo que pude ver, sua pilha está correta. A mensagem do compilador (apenas um aviso, não um erro) é por causa da inicialização do for na função de imprimir a lista. Lá está apenas n, mais nada. Você pode tirar esse n, deixando direto o ; O problema do programa está no if dentro do case 1 do switch. Lá você verifica se cont é maior que 1 mas cont foi inicializado com zero então a pilha nunca é criada. O correto seria: if(cont == 0) Abraços, Marcelo Utikawa da Fonseca
×
×
  • Criar Novo...