Ir ao conteúdo

Ansi C

Membro Pleno
  • Posts

    3.284
  • Cadastrado em

  • Última visita

Tudo que Ansi C postou

  1. Ansi C

    C lista encadeada em c

    Única maneira que consigo pensar é que cada nó na lista seja menor que o nó posterior com exatamente 1 de diferença . Supondo que 1) prox->valor = 1, e 2)p->prox->valor = 2, 3) p->prox->prox->valo = 3 quando subtrair '1' de 1), 2) e 3) casos nesta sequência teríamos a saída : 0, 1, 2, 0 ... Entretanto, a variável count [que renova a sequência a cada ocorrência de valor == 0] está zerada em cada interação, pelo motivo que declaração if (p->valor == 0) não a está protegendo: void imprime (lista *li) { int i = 0, j = 0, count = 0; lista *p; do { for (p = li; p != NULL; p = p->prox) { p->valor = p->valor - 1; printf ("N[%d] = %d\n", i, p->valor); count++; if (p->valor == 0) { p->valor = count; count = 0; } i++; j++; } } while (j < 10); } Se colocarmos dessa maneira resolve?
  2. Desculpa, agora que você mencionou seu código é para C++, porém passa a impressão de ser em C, pelo menos foi essa a impressão que me deu. Comando em C para imprimir strings no prompt. Em C++ teria equivalência a cout << "Vetor criado com sucesso!" << endl; Pelo que vejo, ainda encontra com mesmo problema de tamanho igual a zero. int main(){ int tamanho=0, *sequencia,chama_funcao; cout << "\n\t Piramidal\n"; sequencia=alocavetor(tamanho); chama_funcao=piramidal(sequencia); } Vamos acompanhar a execução da tarefa: 1- As variáveis são criadas, destaque para tamanho que tem valor: 0 2- Mensagem: Piramidal 3- chama a função alocarvetor com o valor zero como parâmetro, observou que valor foi inicializada com 0?? sequencia = alocavetor (tamanho) e mesma coisa que sequencia = alocavetor(0); int*alocavetor (int tamanho){ int *aux; //alocação dinamica de memoria aux= (int*) malloc(tamanho *sizeof(int)); //retorna o valor alocado return aux; } 4- Declara uma variável para receber o ponteiro da memória, lembra que chamamos a função no ponto 3- assim: sequencia = alocavetor (tamanho) e mesma coisa que sequencia = alocavetor(0); então neste momento temos agora: aux = (int*) malloc (0 * sizeof (int)) Me corrija se eu estiver errado, mais não percebi mudança e você continuo com mesmo erro. adicionado 7 minutos depois Pare essa caso em particular do problema resolva atribuído o valor máximo da lista, por exemplo se o programa só vai manipular 1000 inteiros então defina assim: sequencia = alocavetor(1000); Ou então antes de chamar sequencia = alocavetor (tamanho) , chame uma função para definir o tamanho máximo; int main(){ int tamanho=0, *sequencia,chama_funcao; cout << "\n\t Piramidal\n"; cout << "Entre com tamanho maximo: "; cin >> tamanho; // Pegar o tamanho. sequencia=alocavetor(tamanho); chama_funcao=piramidal(sequencia); }
  3. @Leoveira Boa Noite, Já vi que a palavra elemento é sua favorita, já contou quantas vezes ela aparece int elementos=0, sequencia[elementos],chama_funcao; Olha ela aí, 2 repetições igualmente mal usadas. Primeiro ela aparece inicializada isso bom, depois você entregou tudo quando a usou para declarar o vetor de nome sequencia de uma maneira totalmente perigosa. Por quê? Ora, ora, se a variável elementos têm zero de valor quantos elementos você responderia que tem o vetor sequencia, se eu pergunto tu responde, sei-lha... afinal de contas 0 é os elementos de uma sequência de elementos 0. CORRETO! Se está errado, então por que compilou? Porque é legal, um vetor de tamanho zero nada mais é que um ponteiro constante: Eles não podem ser atualizados, tão pouco receber informações de outros ponteiros , e só apontam para um luga, o luga que apontará quando fora criado. Sendo assim, sequencia aponta para lugar desconhecido, segundo a implementação que será acessado na memória ou não, fatalmente ou não. Vai de sorte. Porque não existe lugar para eles, tais elementos estão sendo arbitrariamente gravados. Linguagens de Baixo Nível permitem controle de tudo. Mesmo quando estamos fazendo de maneira errada. Observe este exemplo, que eu mesmo agora criei, sobre uso de VLA (sigla para Variable-Length Array). Com base nos exemplos que poderá ver melhor também clicando no atalho acima. /* Uso Declaração de Inicialização de Vetores... */ #include<stdio.h> int main(void) { int elementos = 0; puts ("Entre com numero de elementos:"); while (1 != scanf (" %d", &elementos) || elementos == 0) { while (putchar(getchar ()) != '\n'){/* Vázio */} printf ("Argumento invalido, entre com numero [1...999...[$: "); } /// Vetor criado com largura igual a elementos /// que se encontram na memória de programa (pilha) puts ("Vetor Sendo criado..."); int sequencia[ elementos ]; /// Garantidamente não é somente um ponteiro e sim VLA. puts ("Vetor criado com sucesso!"); printf ("Tamanho: %u\n", sizeof sequencia / sizeof (int)); //! Atenção: sizeof só poder ser usando deste modo dentro do escopo em que é variável //! analisada foi criada. return 0; } Observou: Que existe ai ainda uma tentativa de forçar tamanho numérico para sequencia.
  4. O erro esta relacionado a função scanf. Após cada entrada o usuário tecla ENTER para confirma esse ENTER '\n' não é ignorado pelo comando scanf ("%c",& z);, pelo contrário &z captura o caractere '\n' ENTER ou NOVA LINHA e depois testa resultando na mensagem de invalido.
  5. Escolha usar vetores, aprender sobre matrizes também é bom, porém vetores e ponteiros são melhores.
  6. é pelo mesmo motivo! Mais uma vez você usou strlen em um array cujo o ultimo elemento não é '\0', Desta maneira a função retorna a largura errada. Por exemplo Isso é o interior de um vetor: ['-','M','A','U']. Se argumentar para strlen a função retorna um valor desconhecido no instante que ela encontrar '\0' perdido na memória. Agora isto é uma string literal: {"-MAU"} ou na sua forma analítica assim ['-','M','A','U','\0'], as duas são a mesma coisa, se nós as chamarmos em strlen o resultado é: 4. Uma dica é, teste todas as funções antes de usar, ou leia a documentação para entender mais profundamente sua utilidade, pontos fracos e fortes.
  7. A solução está correta. E ainda poderia ser com IF. if ('M' == opcao) cout << "llmo Sr. " << NOME; else if ('F' == opcao) cout << "llma Sra. " << NOME; else /* Default */ cout << "Sexo invalido."; Você não acha o uso de IF para esse caso mais elegante que SWITCH? Além disso, nesta situação o SWITCH não tem muita serventia, somente em caso de listas grandes e sequenciais que a declaração SWITCH demonstra maior desempenho. Viva o IF se então...
  8. void pontInfo (char Str[], int nCount) { cout << "Pontuação: "; char cAux[nCount]; char nArrayPont[] = {'?', '.', '!', ':', ',', ';', '-'}; int nSize = strlen (nArrayPont); // #Aqui tem um erro. ... A função strlen () exige, em seu parâmetro, uma argumento string. A única coisa que distingue um vetor de caracteres (char) de uma string (char) é o ultimo elemento, porque uma vetor string tem o caractere '\0' no fim da lista. Todas as funções que manipulam strings [strlen...strcmp] só terminam suas tarefas quando esse caractere for encontrado. Daí a array nArrayPont só precisa dele no fim da lista para strlen retorna a largura certa. Assim: void pontInfo (char Str[], int nCount) { cout << "Pontuação: "; char cAux[nCount]; char nArrayPont[] = {'?', '.', '!', ':', ',', ';', '-', '\0'}; int nSize = strlen (nArrayPont); // Correto retorno para nSize. ... Resolve aí
  9. Sim, cuide aproveitar as dicas que @Simon Viegas @devair1010 lhe propuseram pois essas já resolvem o problema. Como desafio proponho resolver sem armazenar as notas pesos, que de fato, não é necessário porque apenas os consolidados: média total e quantidade de alunos são necessários. Daí imagine que não existe vetores ou quaisquer forma de armazenamento em lista, tais informações só poderiam ser processadas no ato da entrada pelo usuário. Caso o exercício seja exclusivo para vetores, então me ignore, se não então resolva com essa estratégia para economizar em código, memória e procedimentos. Observei que você meio que fez isso aqui com média.
  10. Pegar os pesos? Ou Selecionar a partir do vetor já preenchido?
  11. Eita "danou-se" Devo ter me expressado muito mal, você entendeu tudo atravessadinho. Hipoteticamente um exercício tem seguinte enunciado: // Desenvolva um software que determina de 3 números inteiros qual é o //maior e exibe no prompt seu valor. Esse software para os testes após 5 instâncias. A resposta: #include<stdio.h> // função retorna o maior valor entres os números e escreve na tela. int maior(void); int main(void) { int repetir; // Vai repertir 5 vezes for (repetir = 0; 5 > repetir; repetir++) maior(); return 0; } // Programa do exércio hipotético fica aqui fora da função main. // Pode ter qualquer nome diferente de main. int maior (void) { int a, b, c, m; scanf (" %d%d%d", &a,&b,&c); if (a < b) {m = a; a = b; b = m;} if (a < c) {m = a; a = c; m = c;} printf("O maior eh: %d\n", a); return a; // a sempre é maior ou um dentre eles. } Ficando assim: void programa (void) int main (void) { int i; for (i = 0; 10 > i; i++) programa(); return 0; } void programa (void) { int v1, v2, v3; float media, mediaalta; printf("informe tres valores: ");
  12. Se entendi bem; Para o programa que se encontra dentro do main repetir n-vezes: Coloque o seu conteúdo dentro de uma função e declare essa dentro do main n-vezes por meio da declaração for. int main (void) { int i; for (i = 0; 10 > i; i++) programa(); }
  13. URI Só queria externar meio amor pela URI. Vou deixar uma dica, daí você segue ou não, considera útil ou não. 'Mais bixo' C é uma linguagem de programação de funções, porém para você e para maioria das pessoas, eu me incluiu nessas, parece que só existe um luga para deixar o código e este lugar é dentro do main. Digo isso porque Eu também jogo tudo dentro do main faço aquela bagunça doida da p****. Daí quando começa aparecer os erros lógicos é aquela loucura para achar dói tudo daí apago e faço mais organizado. Os exercício da URI são ótimos para nos doutrinar na qualidade de programadores mais organizados. Eu estou aprendendo lá também resolvi hoje um exercício que só 120 pessoas resolveram e fiquei no 12 lugar foi uma emoção só. Não estraga não, descobre sozinho que é mais gostoso
  14. @Esnack Olá! Aperta Ctrl+Z no editor e volta no tempo. Ou melhor leia este artigo Wikipédia acerca do algoritmo de ordenação Bubble sort. De início você verá que o loop de ordenação não para enquanto houver substituição feita, já o seu algoritmo diminui a cada incremento do x. Ou seja, por um detalhe apenas.
  15. Ordenação você encontra neste artigo da Wikipédia. Melhor é você mesmo ler. Caso esteja com coragem
  16. A que bom! Você mesmo resolveu! Sim! Concordo Eu não me aguentei de ansiedade e resolvi implementar uma versão quadmagico2.c /* Programa: quadmagico2.c Escrito por: Mauro Britivaldo Data da Criação: 23-02-18 Propósito: Dizemos que uma matriz quadrada inteira é um quadrado mágico se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todas iguais. Dada uma matriz qudrada A (n) (n), verificar se A é um quadrado mágico.*/ #include <stdlib.h> #include <stdio.h> // Protótipos de Funções // Protótipo de Função que escanear vetor bidimensional e soma seus elementos. int quadrado_magico (int l/*linhas*/,int c/*Colunas*/, int[l][c]/*Matriz*/); int main (void) { int l,c; scanf("%d %d",&l,&c); int QUADRADO[l][c], i, j; i= -1; while (l > ++i) { j= -1; while (c > ++j) scanf(" %d",QUADRADO[i]+j); } printf("%ceh MAGICO.\n", quadrado_magico(l, c, QUADRADO)? '\b':'~'); return 0; } // Função que retorna 1-verdadeiro ou 0-falso para quadrado mágico. int quadrado_magico (int l, int c, int q[l][c]) { int i, j, slinhas,scolunas,sdigprincipal,sdigsegundaria; sdigprincipal = sdigsegundaria = 0; i = -1; while (l > ++i) { slinhas = scolunas = 0; j = -1; while (c > ++j) { // Diagonal principal. if (i == j) sdigprincipal = q[i][j] + sdigprincipal; // Diagonal segundaria if ((i+j) == (l-1)) sdigsegundaria = q[i][j] + sdigsegundaria; // Linhas slinhas = q[i][j] + slinhas; // Colunas scolunas= q[j][i] + scolunas; } if (scolunas != slinhas) return 0; } return(sdigprincipal == sdigsegundaria); }
  17. Eu fiz o teste aqui porque gostei desse exercício. Desculpa dizer mais não funcionou. Poderias compilar e postar @Olinad212 ?
  18. Se tivesse postado isso desdo começo, já teria resolvido tudo, tão simplesmente isso já responde a pergunta, sem achismo, sem adivinhações e direto ao ponto lindo e perfieto. Para mim esse tipo de coisa nem adianta.
  19. Testou se as somas estão corretas, fez isso de maneira individual? Poste o código usando o code tag <> para melhor visualização.
  20. Sim, entendi também que ela já fez a função, o que postou aqui foi um debug da mesma. E que já está satisfeita. No final eu rodei o programa em um teste, só não exibiu o resultado correto para: X^Y/(2*Y) porque não colocou (2.0*Y), daí a função só retorna valores inteiros. adicionado 6 minutos depois A sim, daí eu presumi que ela colocou tudo em uma função e no lugar da mensagem um return(expressao(X,Y)/(2.0*Y)); Será que ela fez isso ??? Confesso que não dei importância para essa parte.
  21. Bom dia! Venho assistindo esse problema, até o momento com uma outro interpretação que resolvi compartilhar. Do enunciado temos Desconfiado por não ter logo de cara o sinal de multiplicação, achei que @mariana_____silva o tivesse esquecido entre as variáveis da mesma forma que digitou entre 2 e variável Y. Daí o que me ocorrerá que; Ela não esqueceu e seja mesmo entre as variáveis XY uma junção tal que para X= 21 ^ Y= 41, tem-se XY= 2141 e com isso 2*Y= 82. Para mim, isso explica o porquê da resposta inicial ter recursividade em sua solução, haja vista a simplicidade do problema com a interpretação predominante, usar de recursividade nessa rotina é baita exagero até mesmo para iniciantes. Esteja certo ou errado, ainda sim essa interpretação deu mais charme a questão que deixo de subproblema a ser solucionado a partir do interesse de vocês. (exercício extra)
  22. Ansi C

    C++ Variavel Receber Aquele valor

    O que você deseja e trocar a variável de lugar... Podemos atribuir nas variáveis, não importando o seu escopo (lugar). Existem alguns formas de provar isso, basicamente se usa ponteiros em C, já em C++ temos as referências que são menos que ponteiros, entretanto Referências e ponteiros são utilmente a mesma coisa. Supomos uma função que chamaremos de sum, a função imaginária realiza a soma de duas parcelas e logo após atribui a resultado. Uma variável que foi declarada fora da função que chamamos de sum. Em C++ essa rotina poderia ser assim: EXEMPLO #include <iostream> using namespace std; void sum (int parcela0, int parcela1, int &resultado) { //! Estou aqui resultado= parcela0 + parcela1; } int main() { int resultado; //< Estou aqui sum(10,10,resultado); cout << "10 + 10 = " << resultado << "\n"; } Esse código mostra a passagem por referência, veja se isso responde a sua pergunta. É como se a variável da função main() estivesse indo para o outro lado do código, pelo caminho do argumento referenciado.
  23. Levei-me pela formatação, é que geralmente as constantes são todas em CAIXA_ALTA desse jeito. Porém ao compilar o código não ouve erro de sintaxe, fui apressado
  24. Tira o tam do cabeçario da função float suavizacao(float vetor[tam]) Mais se por acaso deseja explicitar a largura do vetor então deixo assim: float suavizacao(int tam, float vetor[tam]) Percebi que tam é constate de MACRO, com isso está correto a que pensei estar errado. Geralmente as constates são escritas todas de caixa alta.
  25. Tenta com a função kbhit

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!