Ir para conteúdo
Fórum Script Brasil

CPP

Membros
  • Total de itens

    117
  • Registro em

  • Última visita

Tudo que CPP postou

  1. CPP

    [AJUDA] Controle de fluxo

    Se o problema é portabilidade então usa getchar(). Pra quais SOs você pretende desenvolver e quais os compiladores que você usa atualmente? Abs
  2. CPP

    [AJUDA] Controle de fluxo

    Sei como é cara, também aprendi por conta. Se precisar pode falar. Abs
  3. CPP

    [AJUDA] Controle de fluxo

    Olá Vandal. Sua primeira tentativa estava perto da solução. No mesmo if onde você identifica o caracter a ser contado já pode proceder com a troca desejada. Vê ai no código o que eu to falando e se tiver duvida é só falar. Abs #include <stdio.h> #include <stdlib.h> int main () { char string[100]; /* String, ate' 99 caracteres */ int i, cont; printf("\n\nDigite uma frase: "); gets(string); /* Le a string */ printf("\n\nFrase digitada:\n%s", string); cont = 0; for (i=0; string[i] != 0; i=i+1) { if ( string[i] == 'c' ) /* Se for a letra 'c' */ { cont = cont +1; /* Incrementa o contador de caracteres */ string[i] = 'b'; // FAZ A TROCA DA LETRA 'c' PELA LETRA 'b' DIRETAMENTE NA POSIÇÃO DE MEMÓRIA ENCONTRADA } } printf("\nNumero de caracteres c = %d", cont); printf("\nString modificada: %s\n", string); //system("pause"); PRA PARAR O PROCESSAMENTO USA getch() AO INVÉS DE system("pause"); getch(); return(0); }
  4. Olá Fabin, Quantas dúvidas heim (rs)??? Como disse, eu usei coisas que talvez você ainda não conhecesse pra ter contato com elas e passar a usa-las. Vamos ver se eu consigo esclarecer suas dúvidas. o #define faz parte de um recurso chamado "pré-processamento", ele (e outras) são tratados pelo compilador antes de tratar o código. No caso do define funciona assim: #define LINHAS 20 #define COLUNAS 10 void preencheMatriz() { int l, c; for(l=0;l<LINHAS;l++) { for(c=0;c<COLUNAS;c++) Em tempo de compilação o código é interpretado como: void preencheMatriz() { int l, c; for(l=0;l<20;l++) { for(c=0;c<10;c++) Ou seja, o compilador substitui as referencias pelo conteúdo definido em todo o código. if(imprime) e if(kbhit()) podem ser traduzidas da seguinte forma: if(imprime == 1) e if(kbhit() == true) ou if(kbhit() == 1) A questão é que em C o conceito de verdadeiro e falso é: 0 (zero) é falso Diferente de 0 (zero) é verdadeiro. Então, quando faço if (imprime), se o conteudo de imprime for 0 (zero) o if não vai ser executado, mas se eu mudar o conteudo de imprime pra 1 o if passa a ser verdadeiro e é executado. No caso do if(kbhit()) funciona da mesma forma só que eu não mudo o valor da função, mas eu testo o retorno que ela me dá. Ou seja, se o usuário não digitar nenhuma tecla kbhit() vai me retorna 0 (zero) e o if interpreta como falso e não executa, mas quando o usuario digitar alguma coisa a funcao kbhit() me devolve 1 e o if passa a ser verdadeiro. Cara, você fez muitas perguntas. Não vou responder todas agora beleza? Vê se essas duas partes ficaram claras e ai a gente passa pras outras questões. Abs
  5. Olá Ricardo, Se você colocar uma expressão numa variável string e passar pra um if em C , ele sempre vai te retornar verdadeiro independente do conteúdo. Além do mais, no exemplo que você postou uma matriz, um for e um if resolve o teste de todas as possibilidades mencionadas. Uma coisa interessante é você trabalhar com funções que tratam um numero variável de parâmetros. Abs
  6. Olá Fabin, O programa que você fez tá certo e funcionando e isso é o que importa, mas, como você me perguntou, estou postando uma versão do seu programa com algumas modificações. Usei algumas funções e conceitos que talvez você AINDA não conheca justamente pra te dar a oportunidade de ver que elas existem. Tenta observar principalmente a utilização dos ifs e vê que dá pra otimizar o código usando a lógica a seu favor. Só modifiquei o seu programa porque é algo que você já conhece e agora pode observar algumas idéias novas. Ah, vê como uma identação ordenada ajuda a entender melhor o código. Essa é a identação que eu uso, tenta desenvolver seu padrão de escrita. Se precisar de ajuda pode perguntar a vontade. Bons estudos. Abraços /*Exercício 4. 4. Escreva um programa que crie uma matriz de 22 x 70 elementos, todos eles preenchidos por espaços, à exceção da borda da matriz (as colunas laterais e as linhas superior e inferior), cujos elementos devem ser preenchidos por “O” (letra o maiúscula). 5. A partir do exercício acima, crie: a. uma rotina (função) que coloque um sinal “+” em um ponto qualquer, segundo requisitado pelo usuário. b. Faça um laço na função acima, que permita ao usuário reescrever o sinal em qualquer posição quantas vezes quiser. c. Baseado nas rotinas acima, reescreva o programa de modo que o sinal “+” seja inicialmente escrito no centro da matriz, mas que permita ao usuário movimentá-lo, com o uso das teclas 4 (esquerda), 6 (direita), 8 (cima), 2 (baixo).*/ //----------------------------------------------------------------------------------------- // Comentarios: // - getch() tem a mesma funcao de parar o processamento que um system("pause"), só que getch() não depende de uma funcao do SO // - clrscr() limpa a tela // - kbhit() verifica se foi pressionada alguma tecla sem parar o processamento //----------------------------------------------------------------------------------------- #include <stdlib.h> #include <stdio.h> #include <conio.h> char brinq[20][10]; // MATRIZ DECLARADA COMO GLOBAL E VISIVEL POR TODAS AS FUNÇÕES DO MÓDULO //Declarações das funçoes usadas void preencheMatriz(); void movimentando_sinal_matriz(); #define LINHAS 20 #define COLUNAS 10 //------------------------------------------------------------------------------------------ void main() //função principal para execução do programa { preencheMatriz(); movimentando_sinal_matriz(); printf("\nEncerrado!\n"); } //------------------------------------------------------------------------------------------ //abaixo declarações e escopos das funções //------------------------------------------------------------------------------------------ void preencheMatriz() { int l, c; for(l=0;l<LINHAS;l++) { for(c=0;c<COLUNAS;c++) { // a principio todas as celulas comecam com ' ' brinq[l][c]=' '; if(l==0 || l==19) { brinq[l][c]='O';//preenche coluna superior com O } if(l>=0 && (c==0 || c==9)) { brinq[l][c]='O'; //preenche primeira coluna lateral com O } } } } //------------------------------------------------------------------------------------------ void movimentando_sinal_matriz() //ultima parte do exercicio movimentando sinal pela matriz { int l, c, opcao, hor, vert, hAnt,vAnt; unsigned char escolha; brinq[9][4] = '+'; //coloca o + no centro da matriz clrscr(); for(l=0;l<LINHAS;l++) { // imprime a matriz na tela com o + no centro for(c=0;c<COLUNAS;c++) { printf("%c\t",brinq[l][c]); } } hor = 4; //variavel declarada para manipulação na horizontal do + na matriz recebendo 4 q é a coluna que representa o centro da matriz vert = 9;// variavel declarada para manipulação na vertical do + na matriz recebendo 9 que é a linha que representa o centro da matriz hAnt = hor; vAnt = vert; int imprime = 1; do { // do para movimentar o + na matriz quando for igual a 1 sai do programa if (imprime) { imprime = 0; clrscr(); for(l=0;l<LINHAS;l++) { //printf("\n"); for(c=0;c<COLUNAS;c++) { printf("%c\t",brinq[l][c]); } } printf("\n"); printf("Digite um dos numeros para movimentar o + na matriz:\n4(esquerda)\t6(direita)\t8(cima)\t2(baixo)\t1(para sair)\n"); printf("\n"); } opcao = 0; if (kbhit()) { escolha = getch(); opcao = escolha - '0'; // converte texto em int if (opcao==2 || opcao==4 || opcao==6 || opcao==8) { // habilita o if que controla a impressao da matriz imprime = 1; // limpa a posição anterior do + brinq[vAnt][hAnt] = ' '; } } if(opcao == 4) { // opçao para movimentar o + para esquerda if(hor == 1) hor++; brinq[vert][--hor] = '+'; //matriz recebe o + já com hor subtraido para mostralo na posição antecessora } if(opcao == 6) {//mesmo esquema da opção 4 porem invertido if(hor == 8) hor--; brinq[vert][++hor] = '+'; } if(opcao == 8) { if(vert == 1) vert++; brinq[--vert][hor] = '+'; //matriz vai receber o mais na coluna anteriror graçaas variavel vert que está sendo decremnetada } if(opcao == 2) {// mesmo esquema da posição 8 porem invertido if(vert == 18) vert--; brinq[++vert][hor] = '+'; } // salva a posicao atual do + vAnt = vert; hAnt = hor; } while(opcao != 1); }
  7. Olá Fabin, Tem algumas coisas erradas na sua solução usando funções. Quando você fez tudo no main() as variáveis declaradas faziam parte do escopo da função, mas quando você dividiu tudo em funções e declarou variáveis em vários pontos elas passaram a ser distintas uma das outras. A solução para o seu problema é você declarar a matriz brinq de forma global e não usar passagem de parâmetros para a função sinal_indicado_matriz() #include <stdlib.h> #include <stdio.h> char imprime_matriz_borda(){ int linha=20, coluna=10, l, c; char brinq[linha][coluna]; for(l=0;l<linha;l++){//for para imprimir linhas e colunas com O maisculo de acor com exercicio for(c=0;c<coluna;c++){ if(l==0){ brinq[l][c]='O';//preenche coluna superior com O }else{ if(l>=1 && c==0){ brinq[l][c]='O'; //preenche primeira coluna lateral com O }else{ if(l>=0 && c==9){ brinq[l][c]='O';//preenche ultima coluna lateral com O }else{ if(l==19){ brinq[l][c]='O';//preenche ultima linha com O }else{ brinq[l][c]=' '; } } } } printf("%c\t",brinq[l][c]); // imprime matriz completa na tela } } return brinq[linha][coluna]; } void sinal_indicado_matriz(char mat[20][10]){ int linha=20, coluna=10, l, c, posicao_um, posicao_dois; char brinq[linha][coluna]; do{ //primeiro do para certificar que usuário não ira digita um aposição maior ou menor que a ultima linha e coluna da matriz do{ //os quatros do's contando com este é para certificar que usuário não ira digitar uma posição que é da borda da matriz do{ // já explicado do{ // já explicado do{ // já explicado do{ // este do é caso o usuário queira sair ele aperta a letra f que sai da repetição e termina programa printf("Digite um posiçao onde deseja colocar o sinal +:\t"); scanf("%d",&posicao_um); scanf("%d",&posicao_dois); if(posicao_um == 'f' || posicao_dois == 'f'){ system("pause"); //return 0; } if(posicao_um==0){ //ifs para emitir mensagem quando usuário digitar posiçao pertencente a borda da matriz printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um>=1 && posicao_dois==0){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um>=0 && posicao_dois==9){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um==19){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); } } } } brinq[posicao_um][posicao_dois] = '+'; printf("\n"); for(l=0;l<linha;l++){ //for's para imprimir matriz com sinal de + na posição escolhida pelo usuário for(c=0;c<coluna;c++){ printf("%c\t",brinq[l][c]); } } printf("\n"); }while(posicao_um != 'f' || posicao_dois != 'f'); }while(posicao_um == 19); }while(posicao_um >=0 && c ==9); }while(posicao_um >=1 && posicao_dois == 0); }while(posicao_um == 0); }while((posicao_um > 19 && posicao_dois > 9) || (posicao_um < 0 && posicao_dois > 0) ); } int main() { char x[20][10]; imprime_matriz_borda(); sinal_indicado_matriz(x); printf("\n"); system("pause"); return 0; } Olá Fabin, Tem algumas coisas erradas na sua solução usando funções. Quando você fez tudo no main() as variáveis declaradas faziam parte do escopo da função, mas quando você dividiu tudo em funções e declarou variáveis em vários pontos elas passaram a ser distintas uma das outras. A solução para o seu problema é você declarar a matriz brinq de forma global e não usar passagem de parâmetros para a função sinal_indicado_matriz(). Ver modificações no código. Resolvido o problema, tenta otimizar os if do seu programa, você usar 3 printf pra dar a mesma mensagem, dá pra fazer isso uma vez só usando || (ou) no if. Agora um comentário pessoal. Você usa uma identação padrão, mas que eu acho muito confusa de entender. Se você não se ofender, eu usaria as chaves da seguinte forma: void Funcao(parametros) { } ao invés de: void Funcao(parametros){ } Qualquer coisa posta ai no forum. Abs #include <stdlib.h> #include <stdio.h> char brinq[20][10]; // MATRIZ DECLARADA COMO GLOBAL E VISIVEL POR TODAS AS FUNÇÕES DO MÓDULO char imprime_matriz_borda(){ int linha=20, coluna=10, l, c; for(l=0;l<linha;l++){//for para imprimir linhas e colunas com O maisculo de acor com exercicio for(c=0;c<coluna;c++){ if(l==0){ brinq[l][c]='O';//preenche coluna superior com O }else{ if(l>=1 && c==0){ brinq[l][c]='O'; //preenche primeira coluna lateral com O }else{ if(l>=0 && c==9){ brinq[l][c]='O';//preenche ultima coluna lateral com O }else{ if(l==19){ brinq[l][c]='O';//preenche ultima linha com O }else{ brinq[l][c]=' '; } } } } printf("%c\t",brinq[l][c]); // imprime matriz completa na tela } } return brinq[linha][coluna]; } void sinal_indicado_matriz(void){ int linha=20, coluna=10, l, c, posicao_um, posicao_dois; do{ //primeiro do para certificar que usuário não ira digita um aposição maior ou menor que a ultima linha e coluna da matriz do{ //os quatros do's contando com este é para certificar que usuário não ira digitar uma posição que é da borda da matriz do{ // já explicado do{ // já explicado do{ // já explicado do{ // este do é caso o usuário queira sair ele aperta a letra f que sai da repetição e termina programa printf("Digite um posiçao onde deseja colocar o sinal +:\t"); scanf("%d",&posicao_um); scanf("%d",&posicao_dois); if(posicao_um == 'f' || posicao_dois == 'f'){ system("pause"); //return 0; } if(posicao_um==0){ //ifs para emitir mensagem quando usuário digitar posiçao pertencente a borda da matriz printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um>=1 && posicao_dois==0){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um>=0 && posicao_dois==9){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um==19){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); } } } } brinq[posicao_um][posicao_dois] = '+'; printf("\n"); for(l=0;l<linha;l++){ //for's para imprimir matriz com sinal de + na posição escolhida pelo usuário for(c=0;c<coluna;c++){ printf("%c\t",brinq[l][c]); } } printf("\n"); }while(posicao_um != 'f' || posicao_dois != 'f'); }while(posicao_um == 19); }while(posicao_um >=0 && c ==9); }while(posicao_um >=1 && posicao_dois == 0); }while(posicao_um == 0); }while((posicao_um > 19 && posicao_dois > 9) || (posicao_um < 0 && posicao_dois > 0) ); } int main() { imprime_matriz_borda(); sinal_indicado_matriz(); printf("\n"); system("pause"); return 0; }
  8. Olá Fabin, Tem algumas coisas erradas na sua solução usando funções. Quando você fez tudo no main() as variáveis declaradas faziam parte do escopo da função, mas quando você dividiu tudo em funções e declarou variáveis em vários pontos elas passaram a ser distintas uma das outras. A solução para o seu problema é você declarar a matriz brinq de forma global e não usar passagem de parâmetros para a função sinal_indicado_matriz() #include <stdlib.h> #include <stdio.h> char imprime_matriz_borda(){ int linha=20, coluna=10, l, c; char brinq[linha][coluna]; for(l=0;l<linha;l++){//for para imprimir linhas e colunas com O maisculo de acor com exercicio for(c=0;c<coluna;c++){ if(l==0){ brinq[l][c]='O';//preenche coluna superior com O }else{ if(l>=1 && c==0){ brinq[l][c]='O'; //preenche primeira coluna lateral com O }else{ if(l>=0 && c==9){ brinq[l][c]='O';//preenche ultima coluna lateral com O }else{ if(l==19){ brinq[l][c]='O';//preenche ultima linha com O }else{ brinq[l][c]=' '; } } } } printf("%c\t",brinq[l][c]); // imprime matriz completa na tela } } return brinq[linha][coluna]; } void sinal_indicado_matriz(char mat[20][10]){ int linha=20, coluna=10, l, c, posicao_um, posicao_dois; char brinq[linha][coluna]; do{ //primeiro do para certificar que usuário não ira digita um aposição maior ou menor que a ultima linha e coluna da matriz do{ //os quatros do's contando com este é para certificar que usuário não ira digitar uma posição que é da borda da matriz do{ // já explicado do{ // já explicado do{ // já explicado do{ // este do é caso o usuário queira sair ele aperta a letra f que sai da repetição e termina programa printf("Digite um posiçao onde deseja colocar o sinal +:\t"); scanf("%d",&posicao_um); scanf("%d",&posicao_dois); if(posicao_um == 'f' || posicao_dois == 'f'){ system("pause"); //return 0; } if(posicao_um==0){ //ifs para emitir mensagem quando usuário digitar posiçao pertencente a borda da matriz printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um>=1 && posicao_dois==0){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um>=0 && posicao_dois==9){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); }else{ if(posicao_um==19){ printf("Essa posição faz parte da borda. Digite outra diferente.\n"); } } } } brinq[posicao_um][posicao_dois] = '+'; printf("\n"); for(l=0;l<linha;l++){ //for's para imprimir matriz com sinal de + na posição escolhida pelo usuário for(c=0;c<coluna;c++){ printf("%c\t",brinq[l][c]); } } printf("\n"); }while(posicao_um != 'f' || posicao_dois != 'f'); }while(posicao_um == 19); }while(posicao_um >=0 && c ==9); }while(posicao_um >=1 && posicao_dois == 0); }while(posicao_um == 0); }while((posicao_um > 19 && posicao_dois > 9) || (posicao_um < 0 && posicao_dois > 0) ); } int main() { char x[20][10]; imprime_matriz_borda(); sinal_indicado_matriz(x); printf("\n"); system("pause"); return 0; }
  9. CPP

    Leitura e Escrita de arquivos

    Fala ai Loco, Agora você complicou as coisas heim. Mas, vamos lá. Primeiro, você tem que entender e tomar cuidado quando usa sizeof() envolvendo ponteiros. Por exemplo: int numeroA; int numeroB[10]; int *numeroC; numeroC = (int)malloc(400); (valores considerando compiladores que geram código para 32bits) sizeof(numeroA); --> retorna o valor 4 sizeof(numeroB); --> retorna o valor 40 (4 * 10) sizeof(numeroC); --> retorna o valor 4 independente de ter feito malloc(400) porque sizeof(numeroC) retorna o tamanho de um ponteiro (4 bytes) e não da memória alocada. Então seu fwrite(&pessoa, (sizeof(pess)*3), 1, arq); não funciona mais como você esperava. Além disso, se você gravar a estrutura não vai levar os dados alocados dinamicamente. Isso porque quando você usa &pessoa está informando a posição de memória onde sua estrutura foi alocada, mas, o malloc realizado para alocar espaço para os telefones estão numa posição de memória diferente. Resumindo, o fwrite vai gravar no arquivo o endereço apontado por telefone (ou seja, 4 bytes), mas não 'os numero de telefones informados'. Outra dica, quando você usa w+b você cria o arquivo, quero dizer, você apaga o conteudo dele, então, sua rotina de leitura deve usar r+b pra manter os dados gravados anteriormente e ainda permitir atualizações. Dá uma olhada nas funções: fopen(), fread(), fwrite(), fprintf(), fscanf(), fseek(), ftell() Fiz algumas modificações no seu código pra facilitar as explicações. Vê se tá fácil de entender. Se precisar pode falar. Abs void main(void) { FILE *arq; struct pess{ int idade; char nome[30]; int quantostel; int *telefone; }pessoa[3]; arq=fopen("Agenda.bin", "w+b"); pessoa[0].idade=20; strcpy(pessoa[0].nome,"PESSOA 1"); pessoa[0].telefone=(int *) malloc(sizeof(int)*3); pessoa[0].telefone[0]=101; pessoa[0].telefone[1]=102; pessoa[0].telefone[2]=103; pessoa[0].quantostel=3; pessoa[1].idade=26; strcpy(pessoa[1].nome,"PESSOA 2"); pessoa[1].telefone=(int *) malloc(sizeof(int)*1); pessoa[1].telefone[0]=201; pessoa[1].quantostel=1; pessoa[2].idade=70; strcpy(pessoa[2].nome,"PESSOA 3"); pessoa[2].telefone=(int *) malloc(sizeof(int)*1); pessoa[2].telefone[0]=301; pessoa[2].quantostel=1; // grava um registro de cada vez for (int n = 0; n < 3; n++) { // grava a primeira parte da estrutura (idade, nome e qtd de telefones) fwrite(&pessoa[n], (sizeof(pess)-sizeof(int *)), 1, arq); // grava os telefones desse registro usando o ponteiro alocado e a quantidade de telefones informada fwrite(pessoa[n].telefone, sizeof(int) * pessoa[n].quantostel, 1, arq); } fclose(arq); } Programa que lê os dados e exibe na tela void main(void) { FILE *arq; struct pess { int idade; char nome[30]; int quantostel; int *telefone; }; arq=fopen("Agenda.bin", "r+b"); struct pess alguém[3]; //Carregando os dados do arquivo txt na estrutura alguém // le um registro por vez int t; for (int n = 0; n < 3; n++) { // le a primeira parte do registro (idade, nome e qtd de telefones) fread(&alguém[n],(sizeof(pess) - sizeof(int *)), 1,arq); // aloca a memoria necessaria para os registros de telefone desse cliente usando a quantidade de telefones lida do arquivo alguém[n].telefone = (int *)malloc(sizeof(int) * alguém[n].quantostel); // le os telefone do arquivo fread(alguém[n].telefone, sizeof(int) * alguém[n].quantostel, 1, arq); puts("--------------------------------------------------"); printf("alguém.idade %d\n", alguém[n].idade); printf("alguém.quantostel %d\n", alguém[n].quantostel); puts(alguém[n].nome); for (t = 0; t < alguém[n].quantostel; t++) printf("alguém.telefone %d\n", alguém[n].telefone[t]); } fclose(arq); system("pause"); }
  10. CPP

    Porta paralela C++

    você ta parando sempre pra esperar uma tecla, mas deve fazer isso só se tiver alguma coisa no buffer do teclado. pra verificar o buffer usa a função kbhit(). Abs. outportB(0x378,128); break; } teclado = 0; if (kbhit()) teclado=getch(); } outportB(0x378,0); }
  11. CPP

    Erro em algoritmo

    Se ainda interessar faz o seguinte: if (presentes[0] == 's'){ totalParticipantes = totalParticipantes + 1; } Abs
  12. Olá, Você pode postar o link pro seu tutorial ou o codigo que está testando? Abs
  13. CPP

    Leitura e Escrita de arquivos

    olá Loco, O problema está na hora de informar o tamanho para gravação. O sizeof de pess retorna o tamanho referente a pessoa[0], então os registros 1 e 2 não são gravados. o correto seria: fwrite(&pessoa, sizeof(pess) * 3, 1, arq); Assim os registros 0, 1 e 2 serão gravados no seu arquivo. O mesmo deve ser observado na leitura, ou seja, usar fread(&alguém,sizeof(pess) * 3, 1,arq); Claro que você pode ler um registro de cada vez com em um laço como: for (int n = 0; n < 3; n++) { fread(&alguém,sizeof(pess), 1,arq); printf("\nalguem.idade %d\n", alguém[n].idade); puts(alguém[n].nome); printf("alguém.telefone %d\n\n", alguém[n].telefone); } Mais uma coisa, você abriu o arquivo como texto ("w+") e está gravando em formato binário, isso pode dificultar um pouco a sua vida. Se quer ler suas informações num editor de texto, como o notepad por exemplo, escreve no arquivo usando o fprintf. Porem, se quer mesmo tratar o arquivo como binário, usa ("w+b"). Espero ter ajudado. Abs
  14. O uso do operador ternário é ideal, mas tem que considerar que são três variáveis, então o código fica assim. menor = (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c) Abraços
  15. Olá David, Sua função ir() não estava retornando um valor valido para a pilha. Eu inclui a saída do IR Devido e do Salário liquido dentro da função pra você ver os resultados já que as variáveis foram declaradas locais dentro da função. Você entende o conceito de escopo de variaveis? Qualquer duvida posta ai. Abs #include <iostream> #include <stdio.h> using namespace std; double ir (double sal, double taxa) //funçao que calcula o imposto devido { float desc, salarioliq; desc = (sal * (taxa))/100.0; salarioliq = sal - desc; cout << "IR devido: " << desc <<" \n"; cout << "Salario liquido:" << salarioliq <<" \n"; return 0.00; } void main(void) { int op; int p; float sal, desc, salarioliq, taxa; desc = 0.0; salarioliq = 2000.0; cout<< "Digite a opcao: \n"; cin >> op; cout<< "Digite o valor do salario. \n"; cin >> sal; switch (op) { case 1: //Salario menor ou igual a 500,00 cout<< "Funcionario isento \n"; break; case 2: //Salario entre 500,00 e 1500,00 taxa = 5; desc = ir (sal, taxa); //Aplicando a funçao IR //cout<< "IR devido:" << desc <<" \n"; //cout<< "Salario líquido:" << salarioliq <<" \n"; break; case 3: //Salario entre 1500,00 e 2500,00 taxa=15; ir (sal, taxa); //cout << "IR devido: " << desc <<" \n"; //cout << "Salario liquido:" << salarioliq <<" \n"; break; case 4: //Salario maior que 2500,00 taxa=20; ir (sal, taxa); // cout<< "IR devido:" << desc <<" \n"; // cout<< "Salario liquido:" << salarioliq <<" \n"; break; } cin >> p; }
  16. CPP

    Ajudem por favor

    Olá Marcos, No scanf onde você pergunta se deseja elevar a 2 novamente tá faltando o %. Deveria ser scanf ("%i", &sqr2enter); Aproveitando, a linguagem C/C++ tem estruturas melhores que "goto". Tenta refazer seu programa usando switch/case dentro de um laço while ou do/while. Bom estudo. qualquer coisa avisa. Abraços
  17. Olá galera, Tive que criar uma conexão ODBC de forma automática pra facilitar a vida dos usuários e sofri bastante pra entender alguns códigos em outras linguagens. Depois que migrei tudo pro C/C++ resolvi postar a solução aqui. Espero que ajude. (Testado no CBUILDER 5) Documentação da Microsoft: http://support.microsoft.com/kb/142216/pt-br void CreateODBCDriver(void) { typedef int WINAPI (*TSQLConfigDataSource)(HINSTANCE HWND, unsigned int fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes); #define ODBC_ADD_DSN 1 // Adiciona uma fonte de dados (data source) #define ODBC_CONFIG_DSN 2 // Configura a fonte de dados (data source) #define ODBC_REMOVE_DSN 3 // Remove a fonte de dados (data source) #define ODBC_ADD_SYS_DSN 4 // Adiciona um DSN no sistema #define ODBC_CONFIG_SYS_DSN 5 // Configura o DSN do sistema #define ODBC_REMOVE_SYS_DSN 6 // Remove o DSN do sistema TSQLConfigDataSource sqlConfigDataSource; HANDLE hLib; bool fResult; TSearchRec srInfo; hLib = LoadLibrary("ODBCCP32"); // carregando a DLL if(hLib != NULL) { sqlConfigDataSource = (TSQLConfigDataSource) GetProcAddress(hLib, "SQLConfigDataSource"); // selecionando a função que gerencia as entradas ODBC if (sqlConfigDataSource != NULL) { // cada argumento passado em lpszAttributes deve terminar com \x0 // se hoyver necessidade ou interesse o caminho do banco pode ser informado junto com o nome em DBQ e CREATE_DBQ. // Exemplo: DBQ=c:\\app\\db\\Database.mdb\x0 fResult = sqlConfigDataSource(NULL, ODBC_ADD_DSN ,"Microsoft Access Driver (*.mdb)", "DSN=NOME_FONTE\x0 DBQ=Database.mdb\x0 Exclusive=1\x0 Description=Criacao fonte ODBC\x0"); if( fResult == false ) { // se não conseguir criar o registro por ausencia do banco, tentar registrar ao mesmo tempo que cria o .mdb if(FindFirst("DataBase.mdb", 0, srInfo ) != 0) { fResult = sqlConfigDataSource(NULL, ODBC_ADD_DSN ,"Microsoft Access Driver (*.mdb)", "DSN=NOME_FONTE\x0 DBQ=Database.mdb\x0 Exclusive=1\x0 Description=Criacao fonte ODBC\x0 CREATE_DB=Database.mdb\x0"); if (fResult == false) ShowMessage( "Falha ao tentar criar o banco de dados"); } FindClose( srInfo ); } } FreeLibrary( hLib ); if (fResult) ShowMessage( "Banco de dados criado." ); } else ShowMessage( "o sistema não pode carregar a biblioteca ODBCCP32.DLL" ); }
×
×
  • Criar Novo...