Ir ao conteúdo
  • Cadastre-se

arfneto

Membro Pleno
  • Posts

    6.252
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. Leu? Se leu sabe que pode só escrever uma função para fazer o que quer no arquivo e colocar lá. Se bem me lembro era só isso o que o exemplo fazia: você passa um diretório e uma função e ele roda a função para cada arquivo na pasta.... Como o map() do javascript. Se vai simplesmente copiar o arquivo todo use as funções do sistema, como CopyFile() ou CopyFileTransacted() Pode usar também FindFirst/FindNext. Cuidado se vai criar arquivos dentro da mesma pasta para não copiar as cópias e as cópias das cópias...
  2. Leu o exemplo no tópico 4, que faz exatamente isso e ainda pode chamar uma função para fazer algo com os arquivos da pasta? O que seria "ler o conteúdo?"
  3. Isso quer dizer que você achou aquilo muito complexo? Qual parte? É o mesmo exercício Preciso perguntar: Se eu te disse isso você também achou muito complicado? só tem 4 linhas. Pensou nisso: Eu acho que você não pode usar #include <stack> e declarar sua pilha. Esse é o exercício afinal. Deve escrever você a sua pilha. A sua classe stack ou como queira chamar. Assim não estará fazendo nada...
  4. É verdade, mas você entrou no loop já testando o valor de uma delas. Esse é o problema. isso foi engraçado Troque seu professor por um livro Seu curso não tem um livro-texto? Em geral as escolas tem um livro-texto para o curso. Ou tinham. O livro sobre C acho que sempre é o livro branco de Kernighan e Ritchie, "A linguagem de programação C". Mas tem muitos livros. Sua escola não tem uma biblioteca virtual? Muitas escolas assinam serviços assim e os alunos podem acessar um grande número de livros. Sei que tem muito material no Youtube mas não sei recomendar. Tem esse site Udemy de educação online, gigante. Lá tem agora 69 cursos sobre C para iniciantes. Na onda da pandemia os cursos estão custando em geral 23,99. Pode ser uma oportunidade. Os que são em lingua estrangeira em geral tem legendas em português. https://www.udemy.com/courses/search/?courseLabel=9174&q=c+language&sort=relevance&src=sac Deve ter alguns grátis também. Pode tentar um trial em oreilly.com, 30 dias grátis e ver o que acha. É a maior biblioteca técnica desse tipo que existe, em https://www.oreilly.com/ Você entende inglês? https://www.classcentral.com/course/c-for-everyone-16909 Esse curso é da universidade da California em santa cruz, UCSC grátis. Insisto no que te falei antes: o programa vai refletir uma ideia que você tem para resolver o problema. Se você não tem uma ideia não tem um programa. Não adianta. Tenha a ideia primeiro. Pense, rabisque, desenhe, simule. essas coisas. ANTES. Algo assim no papel por exemplo não seria surpresa E não pense em escrever tudo de uma vez, mesmo um programa simples. Hoje em dia é muito rápido escrever programas. Veja seu enunciado por exemplo. Você precisa somar os caras mas está começando a programar. Sabe que tem o número, a soma, o loop, sabe até o resultado porque é uma fórmula do ensino fundamental afinal. Soma O primeiro com o último, multiplica pelo número de elementos e divide por dois. Também não seria difícil deduzir a fórmula. 1+2+3+4 = 10 1+4 = 5, 5 x 4 = 20, 20 / 2 = 10 por exemplo Imagine que você escreveu esse programa #include "stdio.h" int main() { int limite = 5; int soma = 0; for (int numero = 1; numero <= limite; numero = numero + 1) { printf("%d ", numero); }; // for() } E rodou e saiu isso 1 2 3 4 5 Dentro do esperado. Mas aí você já tem as variáveis, o loop e tal. Como deu certo você se anima e soma os caras. E no final você imprime porque se não imprimir não vai saber se somou... Cada coisa com um propósito Como você está desconfiado e o programa é curtinho você recorta e cola o lop logo abaixo #include "stdio.h" int main() { int limite = 5; int soma = 0; for (int numero = 1; numero <= limite; numero = numero + 1) { printf("%d ", numero); }; // for() printf("\n"); for (int numero = 1; numero <= limite; numero = numero + 1) { printf("%d ", numero); soma = soma + numero; }; // for() printf("\n"); printf("soma foi de %d ", soma); printf("limite era %d ", limite); } porque não quer digitar em cima do que funcionou E aí sai 1 2 3 4 5 1 2 3 4 5 soma foi de 15 limite era 5 E aí você pensa: se somou até 5 pode somar até qualquer número se o loop está certinho e só preciso da soma não preciso imprimir nada exceto a soma Agora posso apagar o primeiro teste ao menos... #include "stdio.h" int main() { int limite = 5; int soma = 0; for (int numero = 1; numero <= limite; numero = numero + 1) { printf("%d ", numero); soma = soma + numero; }; // for() printf("\n"); printf("soma foi de %d ", soma); printf("limite era %d ", limite); limite = 100; soma = 0; printf("\n"); for (int numero = 1; numero <= limite; numero = numero + 1) { //printf("%d ", numero); // nao precisa mais soma = soma + numero; }; // for() printf("\n"); printf("soma foi de %d ", soma); printf("limite era %d ", limite); } E ver o que dá: 1 2 3 4 5 soma foi de 15 limite era 5 soma foi de 5050 limite era 100 E somou, afinal é o que está no programa. Então podemos ficar só com o último loop e não ficar mostrando os 100 números #include "stdio.h" int main() { int limite = 100; int soma = 0; for (int numero = 1; numero <= limite; numero = numero + 1) soma = soma + numero; printf("soma foi de %d\n", soma); printf("limite era %d\n", limite); } E ver soma foi de 5050 limite era 100 Pense nisso
  5. Não entendi o que quer dizer [1] int num,resultado,cont; [2] printf ("Soma dos cem primeiros numero \n",num); [3] resultado = cont * 50; [4] while (cont <= 100) { ... Em seu programa tem (ou deveria ter) uma razão para cada linha que escreve. em [1] declarou 3 variáveis, num, resultado e cont e não deu qualquer valor para elas. em [2] Tentou imprimir "Soma dos cem primeiros numero \n" mas há um erro de concordância e também passou um parâmetro, num, que declarou na linha anterior e não sabe que valor tem. E não usou o tal num. Bem errado. em [3] você multiplica cont por 50. Mas acabou de declarar cont e não tem nada lá. Então que pretende com o resultado? Não vai ter nada significativo também. E se achava que isso daria 5050 sugiro pensar melhor. Mesmo que cont fosse100 --- o que não é porque você acabou de declarar --- multiplicar 50 por 100 vai dar 5.000 em [4] o loop while() vai rodar enquanto cont for menor ou igual a 100. Mas quanto vale cont? Já pensou nisso? Se queria que o loop varresse os números de 1 a cont você deveria ter escrito isso no programa. Hoje em dia os sistemas iniciam as variáveis todas com zero, como parte de um esforço para evitar hacking através da injeção de código no meio das variáveis. Então cont deve ser zero inicialmente.
  6. if (salbru<=800.00)(salbru<=1600.00); salliq<-(salbru-(salbru*0.13)); printf ("O salario liquido e %2.f:",salliq); { } Como em qualquer coisa, existe uma noção de causa e feito em tudo que escreve num programa. Então você deve procurar uma razão para ter escrito algo. Como essas { } por exemplo. Em geral em C onde você pode colocar um comando você pode trocar por vários comandos dentro dessas chaves. Ou nenhum, como você fez. Mas para não usar nenhum comando para que as chaves afinal? (salbru<=1600.00) Isso que escreveu é uma expressão em C. Avalia para verdadeiro ou falso. "<=" é um operador e significa menor ou igual. Em C 0, zero, é falso. Só zero. Qualquer outra coisa é verdade. Então isso que escreveu equivale a 0 se salbru não for menor ou igual a 1600. Só isso. Não vai mudar nada. salliq<-(salbru-(salbru*0.13)); Esse já não tem sentido nenhum. "<" indica de fato menor. Mas o hífen é o sinal de subtração. Juntos não significam nada. Se queria trocar o valor de salliq pelo resultado da conta, o operador de atribuição é "=". Não entendo como chegou a esse código. O que te fez escrever cada linha. Talvez pudesse explicar. Aí ficaria mais fácil de ajudar, sabendo o que imaginava estar fazendo com coisas como as chaves sem nada dentro adicionado 0 minutos depois sua escola não tem uma biblioteca virtual? Não assina um serviço desses para os alunos?
  7. Seu programa não está nada bom Você tem um livro? Era mesmo pra ser um programa em C? marcou C++ no tópico. Isso por exemplo não significa nada. O ; termina o comando. Que pretende com esse trecho? Isso o que é?
  8. Na verdade você ignorou completamente a existência de clientes. Teve uma discussão neste forum sobre esse exato exercício dias atrás. Pesquise aqui neste forum. Acho que tinha até um programa de exemplo em C Use um número de conta e um vetor com 10.000 contas, como está lá no tópico. E agrupe as operações por conta. Basta pedir a conta corrente nas operações.
  9. Algo como tem o vetor A e o vetor B com nomes e quer criar o vetor C = (A-B) ? O código que postou não faz sentido, mas acho que já sabe disso...
  10. Não entendi o que quer dizer. Se quer rodar um programa desconectado de sua sessão, apenas mandar rodar o programa, tipo abrir uma planilha, use CreateProcess() Qual a dificuldade com CreateProcess()? É só um formulário pra preencher e a maioria dos argumentos é óbvia ou opcional. E tem até um exemplo lá onde eu te falei. O que não entendeu? Pergunte algo objetivo nesse caso. Rodou o exemplo ao menos? Tem até um botão lá pra copiar... #include <windows.h> #include <stdio.h> #include <tchar.h> void _tmain( int argc, TCHAR *argv[] ) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); if( argc != 2 ) { printf("Usage: %s [cmdline]\n", argv[0]); return; } // Start the child process. if( !CreateProcess( NULL, // No module name (use command line) argv[1], // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) // Pointer to PROCESS_INFORMATION structure ) { printf( "CreateProcess failed (%d).\n", GetLastError() ); return; } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } Como está lá... Usando o botão e depois Control-V adicionado 18 minutos depois E só um exemplo. O que quer fazer é mais simples, se é apenas rodar o programa. É que você pode esperar por ele terminar, cancelar o outro quando seu programa encerra, se comunicar com o outro programa, ou só mandar rodar, que eu acho que é o que quer fazer...
  11. DE http://www.cplusplus.com/reference/list/list/insert/ Veja a mensagem com atenção: Nas 5 possibilidades que tem na lista lá em cima não tem um match com essa que tentou usar, com um parâmetro só... Insert precisa de dois parâmetros ao menos Parâmetros são entrada, void seria o retorno. AddItem() não está retornando nada e insert() retorna um iterator. Nada tem a ver o tipo de retorno da função com a existência ou o número de parâmetros. Em nenhuma linguagem que eu já tenha visto. Seu erro vem do fato que insert espera dois parâmetros nesse seu caso . E retorna um iterator, Você tem um livro sobre C++? Uma apostila? Um site de referência ou algo assim? Tem um exemplo do uso de lista aqui http://www.cplusplus.com/reference/list/list/insert/
  12. @OcaraMaisLINDOHAHAH Leu o que eu disse sobre esse exato problema ter sido já discutido dias atrás e ter até um exemplo para o MESMO enunciado no tópico que listei? Eu apostaria que não pode usar Stack nesse exercício, já que é a exata estrutura que o exercício quer trabalhar. Você deve escrever essa classe pilha... Declare a SUA classe stack e implemente os métodos com o mesmo nome. Não vou repetir aqui o que expliquei dias atrás e você pode ler no tópico que indiquei, mas talvez devesse ler o que está escrito lá. Você tem um livro de C++? Qual é? Tem uma apostila ao menos? Um site de referência? De todo modo o que fez está errado... Que pretende fazer aqui: ... Ra_Pilha1.push("1 "); cout << Ra_Pilha1.top() ; Ra_Pilha1.push("5 "); cout << Ra_Pilha1.top()<<"\n" ; for(i=0;i<8;i++) { Ra_Pilha1.pop(); } ... Pergunto isso porque o que está fazendo é colocar os caras na primeira pilha e depois remover todos. E aí quando for tentar por na segunda pilha vou dizer o que vai ter lá: NADA, porque você mesmo apagou todo mundo. Não use constantes como esse 8 aí. É pedir problemas. Se esquecer um na entrada já era. Não vai aparecer o 8 nunca e o loop já era. E se colocar um a mais ele vai ficar entalado na primeira pilha. Isso se o programa estivesse certo. O mais simples é usar um loop tipo while( !Pilha1.empty() ) // enquanto a pilha 1 NAO estiver vazia { Pilha2.push( top(Pilha1) ); // tira da 1 e poe na 2 Pilha1.pop(); // apaga da 1 }; // so isso
  13. Notei o #include <iostream> marcou seu tópico como C e escreveu acho que tudo exceto isso em C. Pretendia escrever um programa em C++? Se pretendia seu programa está muito longe ainda. Em C++ é mais fácil escrever esse tipo de coisa, mas é bem diferente do que escreveu exceto por esse include De todo modo, uma coisa que não deveria estar fazendo é começar seu programa por um menu e ficar lendo dados e mostrando coisas na tela. Não leva a nada e só vai te atrasar. Acha mesmo que precisa a cada vez que testar seu programa digitar, digamos, dois vendedores, e ficar em frente a tela digitando comandinhos de uma letra e preenchendo formulários? Não precisa. Demora muito. E é chato pra caramba. Evite usar funções void(). Em geral é um desperdício. Retorne algo que faça sentido. Um código de erro ao cadastrar? Um contador de itens listados? Algo assim. Não trate o erro dentro da função escrevendo mais e mais mensagens e arrumando mais pontos onde o programa pode encerrar. struct Vendedor { int IDVendedor; char nomeVendedor[30]; }; struct Produto { int IDProduto; char descricao[30]; float preco; }; struct Cliente { int IDCliente; char nomeCliente[30]; }; struct Vendas { Vendedor vendedores[2]; Produto produtos[2]; Cliente clientes[2]; }; struct Vendas v; Isso não está bom.O pior aí é a struct Vendas ter 2 itens dentro. Isso é pedir por problemas Provavelmente estaria bem melhor com algo assim typedef struct { int ID; char nome[30]; } Vendedor; typedef struct { int ID; char descricao[30]; float preco; } Produto; typedef struct { int ID; char nome[30]; } Cliente; typedef struct { Vendedor vendedor; Produto produto; Cliente cliente; } Venda; typedef struct { Cliente c[30]; Vendedor v[30]; Produto p[30]; } Cadastro; Venda v[2]; Cadastro loja1, loja2; Isso é só um exemplo e nem está completo, mas entenda que um cadastro tem clientes, produtos e vendedores. E as venda é só uma venda. Você declara um vetor delas, como todo o resto. Na prática provavelmente usaria uma lista delas e não um vetor de tamanho fixo, mas acho que já dá pra entender. E se tem duas vendas ou 200 você declara um vetor de Vendas e não 200 vendas DENTRO da estrutura Não use variáveis globais para acessar dentro das funções. É outro desastre. Nunca use variáveis globais porque só dá problema. Imagine que tivesse mais de um cadastro por exemplo... todos os autores recomendam isso. Muitas empresas proíbem isso. Muitos professores ensinam isso. Todos pela mesma razão. Pense mais nos dados antes de escrever o programa. Uma venda pode ser considerada como vinculando um único cliente a um único vendedor, mas provavelmente teria uma lista de produtos e não um só. Quanto mais perto modelar essas estruturas de seu modelo real mais simples vai ficar o seu programa. Então pense nas funções que precisa implementar e desenhe os dados de acordo. Escreveu várias funções. Porque não uma char Menu(); que mostra o menu e lê a opção e retorna para o seu programa? Muito mais simples. Muito mais simples também é ler o menu de um arquivo ao invés de ficar editando isso toda hora para adequar o alinhamento e as opções. use sempre default num case inicialize todas as variáveis. acho que sabe que esta entrando no loop da primeira vez sem ter sequer algo conhecido em op... "opicao" pega mal. Corrija. perguntar se quer retornar ao menu é algo irritante. Se não está no enunciado tire isso daí. inclua o simples: uma opção para sair do programa evite construções assim: struct Cliente { int IDCliente; char nomeCliente[30]; }; Dentro da struct Cliente dá pra imaginar que a ID vai ser de um cliente e o nome também. Só vai escrever mais a toa. typedef struct { int ID; char nome[30]; } Cliente; Prefira assim. E entenda que pode escrever Cliente c1 = { 12, "Cliente 212234-4" }; Cliente c2 = { 122, "Cliente 2" }; Vendedor exemplo[5] = { { 3, "Jhonny Cash" }, { 233, "Kris" }, { 5, "Waylon" }, [4] = {.nome = "Willie", .ID = 1254 } }; MUITO mais fácil. Ao invés de perder tempo com os menus e inventando nomes e produtos, apenas declare uns poucos de cada assim e termine logo as funções do programa e teste tudo. Depois em meia hora você coloca a p0^^@ do menu. Não perca tempo. Sobre o exemplo acima: note que no caso do vendedor foram declarados 5 e você nem precisa preencher todos. Os que estão na sequência vão ser os caras a partir de exemplo[0]. O que tem o [5] vai ser claro carregado em exemplo[4]. entenda que pode até declarar fora de ordem e colocar o nome do campo direto na linha, como .ID e .nome. E assim só precisa inicializar os campos que vai usar. Compare isso com ficar parado na tela inventando nomes e ID para 5 vendedores e 5 clientes e 5 produtos.... Acho que já entendeu... Esse trecho for (int i = 0; i < 5; i = i + 1) printf("Id do vendedor %d: [%d]\n", i, exemplo[i].ID); printf( "Vendedor 5: Id: %d. Nome: %s\n", exemplo[4].ID, exemplo[4].nome ); Mostra Id do vendedor 0: [3] Id do vendedor 1: [233] Id do vendedor 2: [5] Id do vendedor 3: [0] Id do vendedor 4: [1254] Vendedor 5: Id: 1254. Nome: Willie E pode ver como é muito mais fácil escrever assim Seu programa não está bom ainda.
  14. Esse exercíçio foi discutido aqui dias arás. Não tentou pesquisar nem nesse mesmo forum? Tem até um programa de exemplo lá em
  15. CreateProcess() é trivial. Tentou ler o que são os parâmetros? leu o exemplo que tem lá onde eu falei? Threads vão ser uma solução melhor se seu programa contem os trechos que quer rodar, não exatamente o próprio programa. Seriam funções declaradas em seu próprio programa podem rodar em paralelo. Claro que pode dar na mesma. CreateProcess() espera o nome de um programa executável e algumas informações sobre o ambiente de execução, a maioria opcional.
  16. provavelmente em C++ você não usaria scanf() printf() memset() e escreveria algo bem mais simples: uma classe Matriz com um método tipo float SomaColunas() e quem sabe um float SomaLinhas() Ou mesmo uma classe genérica que opera com matrizes de qualqeur tipo e de qualquer tamanho. C++ foi escrita com essa intenção. Usaria algo assim Matriz uma(5,8); Matriz outra(3,5); ... float s = outra.somaColuna(1); float uma = somaLinha(0);
  17. Chamar system() para fazer algo não é de fato fazer algo. É apenas chamar o interpretador de comandos do sistema para executar o comando gravado no parâmetro, que é um char*. Como pedir pra alguém fazer algo por você. Por cortesia do sistema todo programa em C recebe um int com a lista de argumentos e uma série de ponteiros para char*. E para onde apontam esses ponteiros? Para os argumentos. O primeiro é o nome completo da localização do próprio programa. E assim chamar system() e passar argv[0] dá nisso: simplesmente roda um programa, o próprio. Continuar chamando outros é o óbvio efeito colateral, o efeito da "sala de espelhos" onde você não sabe mais o que é reflexo... Se você precisa mesmo disso, o comum é criar um novo processo e passar o número do processo original; No Windows não existe fork() que é exatamente isso no Linux e no MacOS e lá o problema é resolvido usando o valor de retorno de fork() que é o numero do processo pai. Na primeira chamada fork() retorna zero. Pode fazer algo parecido em windows usando threads em C. Em Windows acho que o mais perto é usar CreateProcess() https://docs.microsoft.com/en-us/windows/win32/procthread/creating-processes ou threads https://docs.microsoft.com/en-us/windows/win32/procthread/creating-threads Você pode rodar um processo associado a um programa, associado a uma sessão ou como um serviço. No primeiro caso eles são encerrados quando seu programa é encerrado, o programa que os criou. No segundo caso ele vai rodar até um logoff de sua sessão. No terceiro caso ele vai ficar lá rodando até alguém fazer algo a respeito, como encerrar o sistema.
  18. Muito bom! E desta vez funciona para 0. A que usava strcat() e a posterior retornariam '\0' para zero e não "0". Eu rodei as funções em paralelo Esse trecho novo foi legal porque agora trata o zero else if (count == 0) { bin[0] = '0'; bin[1] = '\0'; } else { bin[count] = '\0'; } return bin; Esse trecho equivale a esse da função que eu postei if (val == 0) { // pode ser ou nao a primeira vez if (bits == 0) { // era 0 no inicio *p = '0'; *(p + 1) = 0; return p; } else { // acabaram os bits bits = 0; // reinicia porque pode chamar de novo return p; }; // if() }; // if() Só que vem ao final e não no início do código, como efeito do que vou descrever mais abaixo Por outro lado, se tirar esse trecho daquela função que escrevi e comparar com a que postou antes veja É quase a mesma coisa. A diferença é optar pela recursão no início ou no fim. O da direita usa recursão ao final. O da esquerda usa na entrada. O da esquerda usa a notação com colchetes, o da direita usa os endereços diretamente. Aí tem um loop e função termina. No primeiro exemplo o if é maior porque a função retorna "0" para zero. O segundo exemplo retorna '\0' e pode ser considerado um problema. Ao fazer a recursão no início a string é preenchida a partir da esquerda. Usando a recursão ao final ela é preenchida a a partir da direita Veja os dois trechos for (int j = bits; j > 0; j = j - 1) *(p + j) = *(p + j - 1); // copia *p = '0' + (char)(val % 2); // '0' ou '1' *(p + bits + 1) = 0; // poe um '\0' bits = bits + 1; // a fila anda size_t i; for (i = 0; bin[i]; i++); bin[i] = (b & 1) ? '1' : '0'; bin[i + 1] = '\0'; Claro que para fazer algo assim simples assim os programas devem ser mesmo parecidos, mas esse último que @isrnick escreveu parece bem mais eficiente e elegante. adicionado 10 minutos depois Não entendi o que quer dizer. Talvez pudesse postar algum código. Pode ser interessante. [ Não leve a mal meu comentário, @Mauro Britivaldo Não sou moderador desse forum nem nada, mas acho que escrever "...O uso da variável static (int/char *) foi equivocado porque seu melhor sentido está em..." mereceria uma explicação melhor para não parecer simplesmente grosseiro. Isso se a afirmação fizer sentido afinal. E entenda que não é atributo desse código alocar memória. É mais seguro deixar o chamador passar o endereço de uma área alocada suposta com tamanho suficiente ]
  19. Explicando: Aquele loop "complicado" apenas desloca a string para a direita e abre lugar para o próximo caracter da string. Vou repetir aqui: for (int j = bits; j > 0; j = j - 1) *(p + j) = *(p + j - 1); // copia Naturalmente o efeito é o mesmo de strcat(), porque a ideia é resolver o mesmo problema. Declarar variáveis como static em uma função recursiva é absolutamente comum na prática porque é a maneira de passar contexto de uma execução para a outra. E tem custo zero. Ou até menor que zero já que elimina uma alocação a cada chamada recursiva. Por outro lado chamar uma função dentro de uma função recursiva é algo que se evita a todo custo. Chamar uma função envolve mudança de contexto, empilhar argumentos, um jump e um retorno no mínimo... strcat() tem dois argumentos e tem um código de preparação e um loop. E um retorno. Tipo o for que está aí acima. Mas sem overhead Pois é. Não tem sentido algum chamar uma função para mover dois bytes. Para seu programa parecer menos complicado? Em duas linhas? Já leu uma implementação de strcat() na biblioteca padrão? Já escreveu uma? É a mesma coisa que o loop, como eu disse. Não comparei os tempos, na verdade confesso que sequer rodei seu programa, mas sua observação e esse exemplo chamaram minha atenção. Vou estimar que, apenas para o programa ter duas linhas "menos simples" numa função de 15 linhas, chamar uma função de biblioteca para mover dois bytes ou algo mais, vai fazer essa solução demorar umas 40 vezes mais. Qualquer hora vou medir e isso e posto para vocês. O confinamento mudou minha agenda afinal. Semanas atrás eu retirei uma rotina dessas para acelerar um loop de um processo em uma simulação e foi algo assim a diferença, cerca de 50X, mas o processamento era muito mais complexo. De todo modo considere o que estou dizendo: um loop é sempre melhor que uma função, mas nesse caso é ingênuo demais usar uma função... E se for para mover dois bytes então nem sei o que dizer. Pense em como começa strcat(), como processa, e como retorna. E vai fazer isso dentro de cada recursão. Espero que dê pra entender
  20. @isrnick É bem mais eficiente um loop que movimenta bytes adjacentes -- menos de 63 --- do que esse exemplo que postou, que chama uma função dentro de uma função recursiva... Pense bem... E compare os tempos
  21. Algo assim serviria char* em_binario_na_string(long long int val, char* p) { static int bits = 0; if (val == 0) { // pode ser ou nao a primeira vez if (bits == 0) { // era 0 no inicio *p = '0'; *(p + 1) = 0; return p; } else { // acabaram os bits bits = 0; // reinicia porque pode chamar de novo return p; }; // if() }; // if() // desloca os bits pra direita for (int j = bits; j > 0; j = j - 1) *(p + j) = *(p + j - 1); // copia *p = '0' + (char)(val % 2); // '0' ou '1' *(p + bits + 1) = 0; // poe um '\0' bits = bits + 1; // a fila anda return em_binario_na_string(val / 2, p); // e continua }; Um teste 0 * 1 * 2 * 3 * 4 * 5 * 6 *1234*6789*1234*6789*1234*6789*1234*6789*1234*6789*1234*6789*123 00 0 binario: '0' 01 1 binario: '1' 02 127 binario: '1111111' 03 32767 binario: '111111111111111' 04 2147483647 binario: '1111111111111111111111111111111' 05 9223372036854775807 binario: '111111111111111111111111111111111111111111111111111111111111111' 0 * 1 * 2 * 3 * 4 * 5 * 6 *1234*6789*1234*6789*1234*6789*1234*6789*1234*6789*1234*6789*123 Com esse programa int main() { char maior_valor[65]; char* p = &maior_valor[0]; long long int exemplo[6] = { [0] = 0, // limite [1] = 1, [2] = 0x7F, // char 1 byte [3] = 0x7FFF, // short 2 bytes [4] = 0x7FFFFFFF, // int 4 bytes [5] = LLONG_MAX // long 8 bytes }; grade(); long long int j = 1; for (int i = 0; i <= 5; i = i + 1) { *p = 0; printf("%02d%20lld\tbinario: '%s'\n", i, exemplo[i], em_binario_na_string(exemplo[i],p)); }; grade(); return 0; }; O programa todo #include <limits.h> #include <stdint.h> #include <stdio.h> char* em_binario_na_string(long long int, char*); void grade(); int main() { char maior_valor[65]; char* p = &maior_valor[0]; long long int exemplo[6] = { [0] = 0, // limite [1] = 1, [2] = 0x7F, // char 1 byte [3] = 0x7FFF, // short 2 bytes [4] = 0x7FFFFFFF, // int 4 bytes [5] = LLONG_MAX // long 8 bytes }; grade(); long long int j = 1; for (int i = 0; i <= 5; i = i + 1) { *p = 0; printf("%02d%20lld\tbinario: '%s'\n", i, exemplo[i], em_binario_na_string(exemplo[i],p)); }; grade(); return 0; }; char* em_binario_na_string(long long int val, char* p) { static int bits = 0; if (val == 0) { // pode ser ou nao a primeira vez if (bits == 0) { // era 0 no inicio *p = '0'; *(p + 1) = 0; return p; } else { // acabaram os bits bits = 0; // reinicia porque pode chamar de novo return p; }; // if() }; // if() // desloca os bits pra direita for (int j = bits; j > 0; j = j - 1) *(p + j) = *(p + j - 1); // copia *p = '0' + (char)(val % 2); // '0' ou '1' *(p + bits + 1) = 0; // poe um '\0' bits = bits + 1; // a fila anda return em_binario_na_string(val / 2, p); // e continua }; void grade() { // mostra um grid para faciliar contar as letras printf("\n%34s0 * 1 * 2 * 3 * 4\ * 5 * 6 \n", ""); printf("%34s*1234*6789*1234*6789*1234*6789*1234*6789*\ 1234*6789*1234*6789*123\n", ""); return; } // fim
  22. algo assim seria mais de acordo com o enunciado, ainda usando recursão e ainda retornando o resultado como no problema original char* em_binario(long long int val, char* vetor);
  23. C++ e C são linguagens muito --- muito mesmo --- diferentes e tem sorte de ser assim simples, trocar <iostream> namespace, cout e rodar o novo programa Nesse caso aí não mudou nada: esse é o trivial ainda. Em C todo programa entra com 3 streams abertos, stdin stdout e stderr. Em C++ eles são cin cout e cerr, os arquivos 0 1 e 2. Você tem um livro de C? Seria importante. pode usar um printf() nesse caso, mas aqui o certo seria usar fprintf(stderr,...); porque você pode querer salvar stdin ou stderr separadamente em arquivos, redirecionando as mensagens de erro pra outro lugar por exemplo. E e se usar só printf() vai misturar tudo e teria que ter certeza da lógica do programa que esta "convertendo" Exemplo Seu programa X.exe em Windows Você pode rodar X >teste.txt 2>err.txt Claro que pode escrever X 1>teste.txt 2>err.txt Que dá na mesma. E vai perceber claro que tudo que gravou em stdout --- todos os o simples printf() que é a mesma coisa que fprintf( stdout...); --- vai ficar em teste.txt e tudo que gravou usando fprintf(stderr,...); vai ficar em err.txt. E na tela claro, não vai sair nada. Antes da interface gráfica isso era muito usado. E ensinado. Hoje em dia não sei mais o que ensinam

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!