Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. Pense como no caso de main() O protótipo de main é int main( int argc, char** argv); para um efeito como o que você quer. Mas declarou struct poligono{ int N; // numero de vertices struct ponto *vertices // ponteiro para o vetor de vertices }; Então vertices aponta para uma única estrutura. Nem deveria estar no plural Recomendo sempre --- sem querer entrar em discussões religiosas aqui --- declarar o tipo precisamente e não usar * nas variáveis. Pense nisso: formalmente você quer declarar um vértice e o vértice é do tipo ponteiro para struct ponto e assim: struct ponto* vertices; é mais real que assim struct ponto *vertices; a variável é vertices. *vertices não é uma variável. De volta ao problema: você quer declarar uma série de ponteiros para vertice e então está errado assim. vertice deve apontar para uma série de ponteiros para pontos, um depois do outro. Compare com esse trecho typedef struct { float x; // coordenada x float y; // coordenada y } Ponto; typedef struct { int N; // numero de vertices Ponto** vertices; // ponteiro para o vetor de vertices } Poligono; Entende a diferença? adicionado 0 minutos depois E agora o plural é que está errado adicionado 19 minutos depois Entendeu melhor?
  2. provavelmente o que você quer fazer é acessar os vértices como um vetor, como argv[1], argv[2] .. argv[N] certo?
  3. Não entendi. Você tem uma pergunta?
  4. Não respondeu. Entendeu o que seria? Entendeu isso? Declarou as funções como descrito no tópico #10 e mesmo assim não funcionou? O que deu errado?
  5. Pois é. Tenho uma opinião diferente da de @devair1010 e acho que já expliquei porque. Comece pelos dados. Sempre pelos dados. Pois é. Mesmo em um programa sem praticamente nenhum tipo de processamento, como é o caso desse aqui. Sobre seu programa: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <locale.h> #include <conio.h> #include <iostream> #include<string.h> #define MSG "Erro!" precisa mesmo de tudo isso? Provavelmente não. Esqueça conio.h. É uma herança de uma biblioteca dos anos '80. Não há nada relevante lá desde os '90. <iostream> é uma biblioteca para C++. esqueça isso math.h em um programa de cadastro? esqueça isso locale.h ? Precisa mesmo se preocupar com acentos e ponto decimal num programa como esse? Não creio char nome[100], email[100]; int Opcao, i, j, t, cel; printf("Digite 1- Inserir um novo cadastro\t2-Mostrar todos os cadastros\t0 - Encerrar:: "); scanf("%d", &Opcao); Não se expressou bem. É um cadastro só. Sabe escrever uma função? Tem um livro? Seu curso tem um livro-texto? Sua escola assina uma biblioteca online que você possa usar? Sobre os dados Tem sempre muitas maneiras de escrever as coisas. Exemplo Uma agenda é uma lista de itens e pode escrever algo mínimo mas que já tenha sentido struct item { char celular[20]; char email[50]; char fixo[20]; int id; char nome[50]; }; typedef struct item Item; struct ag { char nome[20]; Item cad[20]; }; typedef struct ag Agenda; typedef cria um alias, um sinônimo, e ajuda a criar nomes significativos e a não ter que ficar repetindo struct isso ou aquilo toda hora no programa Vendo a lista fica claro que a agenda tem lugar para 20 itens e tem um nome para diferenciar de outras agendas que possa ter no programa. E os itens tem um número único, id, que você pode usar para identificar os caras com mais facilidade, E o programa? Veja esse programa com esses dados #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> struct item { char celular[20]; char email[50]; char fixo[20]; int id; char nome[50]; }; typedef struct item Item; struct ag { char nome[20]; Item cad[20]; }; typedef struct ag Agenda; int alterar_pessoa(int, Agenda*); int excluir_pessoa(int, Agenda*); int listar_agenda(Agenda*); int listar_pessoa(int,Agenda*); int menu(); int main(int argc, char** argv) { Agenda iPhone; Agenda Android; Agenda* pAg = NULL; Item exemplo_comum = { "999-123-456", // cel "[email protected]", // email "4567-8989", // fixo 12, // id "Forum Clube" // nome }; Item exemplo_99 = { .nome = "Willie Nelson", .email = "[email protected]", .id = 11, .fixo = "4567-8989", .celular = "(98) 999-999-999" }; strcpy(iPhone.nome, "Agenda do iPhone"); iPhone.cad[0] = exemplo_comum; Android.cad[0] = exemplo_99; return(0); }; // main() int alterar_pessoa(int id, Agenda* ag){}; int excluir_pessoa(int id, Agenda* ag){}; int listar_agenda(Agenda* ag){}; int listar_pessoa(int ident, Agenda* agenda){}; int menu(){}; Ele não faz nada. Mas já tem dados! Duas agendas. E funções. E nem precisa de nada pra começar a testar. E nem tem um menu ainda. Espero que ajude a entender o que estou te falando.
  6. poste o programa de um modo que possa ser copiado e testado eventualmente, por favor... DICA PARA SER UTILIZADAS Algumas funções que serão úteis durante o desenvolvimento do programa: * system(“pause”) – chamada de sistema que “pausa” o programa e o faz aguardar pelo usuário; * system(“cls”) – chamada de sistema que limpa os caracteres que foram impressos na tela anteriormente; * fflush(stdin) – limpar o buffer do teclado. Essa função deve sempre ser utilizada após ter utilizado alguma função de entrada de dados como o scanf, gets, etc. Isso se dá pois em algumas situações o buffer do teclado mantém “lixo de memória”, prejudicando a próxima operação de entrada do programa; DICA PARA SER UTILIZADAS Algumas funções que serão úteis durante o desenvolvimento do programa: * system(“pause”) – chamada de sistema que “pausa” o programa e o faz aguardar pelo usuário; * system(“cls”) – chamada de sistema que limpa os caracteres que foram impressos na tela anteriormente; * fflush(stdin) – limpar o buffer do teclado. Essa função deve sempre ser utilizada após ter utilizado alguma função de entrada de dados como o scanf, gets, etc. Isso se dá pois em algumas situações o buffer do teclado mantém “lixo de memória”, prejudicando a próxima operação de entrada do programa; Outra dica Desconfie das dicas acima. Ou as esqueça, se possível. evite usar system() qualquer coisa. É uma bobagem. Seu programa não estará fazendo nada. Apenas chamando o sistema para executar algo. E abre uma porta para invasão e sacanagem, na medida em que alguém cria um cls ou pause e colocar no lugar do que você espera. Se precisa limpar a tela, faça isso usando o sistema, no Windows. No Unix/Linux não existe essa noção de console. "pause" é algo folclórico, e acho que se sabe que qualquer read() fread() fgets() getc() scanf() qualquer um desses vai parar a execução até o usuário teclar algo. E se alguém está recomendando isso para parar o programa ao final para a janela não fechar, que é o que já vi em notas de aula, é o pior. Seu ambiente de desenvolvimento --- o IDE que é masculino e não feminino --- tem uma opção para não fechar a janela ao final do programa, inserindo um "pause" por conta dele.E você não deve testar seus programas sempre no IDE. É um ambiente especial e não saberá se ele funciona de verdade ao sair desse "container". É ingenuidade nunca rodar o programa fora do IDE. fflush() sequer funciona em geral para arquivos --- streams --- de entrada. E não deve ser usado de modo algum.O sistema usa buffers e tem boa razão para isso. Só se deve mexer nisso ao ter uma boa razão para tal. E não é tratar o fato de não ter lido certo os valores da entrada padrão, provavelmente. Faça seu programa em torno dos dados e não em torno de menus e printf() scanf(). Com o tempo vai perceber que isso só te faz perder tempo e atrasa tudo. Apenas insira a interface depois de testar todas as funções. Procure usar constantes, literais. E ler de arquivos que pode salvar e editar e manter para repetir os testes. É pouco inteligente ficar no terminal digitando um item de cadastro por minuto para inventar 3 itens. E depois 3 produtos e afinal entrar em um menu pra listar. Não é produtivo. Vai levar 5min para entrar com um conjunto razoável de dados e aí se o programa cancela em 3s vai ficar furioso...
  7. Pois é: no que eu escrevi tinha um SE e você desconsiderou... esse seu código é determinístico. Nada de SE... E aí não funcionou... Mas já sabe porque
  8. Seu programa não está bom. E assim vai ter muito trabalho pra testar e não precisa. typedef struct aux{ int chave; struct aux *dir; }NO; typedef NO* PONT; PONT inicializa(){ return(NULL); } Essa é sua lista. Deve focar primeiro nos dados antes de escrever o programa. Aí tem pouca informação. Tem pouco conteúdo aí. E vai ter que arrumar dentro do programa. Muito já podia estar já aí dentro. Que pretende com inicializa()? Não faz sentido. Devolver NULL é o mesmo que escrever PONT* lista = 0; Não serve para nada. main() deve ser a última função de seu programa e não a primeira. Quando você abre o programa espera ver main(). Na verdade conforme seus programas aumentarem de tamanho talvez se acostume a deixar main() em um arquivo separado, pra não ficar compilando toda hora coisas em que não está mais mexendo, porque é mais esperto fazer assim. Uma lista ligada não é um objetivo. É uma ferramenta Entenda que sua lista é só um jeito de você agrupar os itens de cadastro, nesse caso. No seu próximo uso pode a tal lista de livros, a playlist com as músicas ou os itens da nota fiscal, para citar os exercícios mais comuns . Mas a lista é a mesma. É muito importante você considerar isso. a lista pode ter ponteiros para frente e para trás. Não faz diferença para programar. Mas vai preferir ter os dois. a lista tem nós, os tais Nodes os Nodes tem Elementos, que aqui são o cadastro. use ponteiros para todos eles para ficar genérico. Vai gostar na semana que vem quando for mudar algo ou fazer uma lista de outras coisas O que define a lista? sem inventar nada, pode ver no livro ou nas outras linguagens: a lista tem um tamanho tem um total atual de itens tem um endereço de início e de fim pode ter um nome ou uma identificação porque se você tem mais de uma pode ser útil pra diferenciar Então isso já deve fazer parte da lista e não de variáveis em seu programa. Só vai dar mais trabalho se não fizer assim. Em especial se pensar em ter mais de uma. Não use um menu antes de terminar de escrever as funções Resista até o 'último momento a escrever um menu ou ficar lendo dados do teclado. Só vai atrasar. Uma lista é uma lista. Um cadastro dentro de uma lista é um cadastro. Por exemplo, se vai alterar um registro escreva int alterar(Elemento* de, Elemento* para, Lista* lista); e teste assim: n = alterar(antes, para, cadastro1); É mais esperto assim. E você pode testar milhares de alterações em um loop. Ou ficar digitando no teclado um elemento, depois uma alteração, depois mostra... Leva uma era e não precisa. Um exemplo de Lista: Veja essa declaração de Lista de Nodes com Elementos e veja se entende a diferença: Um elemento typedef struct { int chave; } Elemento; Assim quando a programação lista estiver ok você pode alterar para incluir nome, endereço, idade, espaçonave, planeta, o que seja. E não mexer na lista. Um nó da lista typedef struct um_no { Elemento* el; struct um_no* A; // Antes struct um_no* D; // Depois } No; Um nó tem um ponteiro para um elemento. Sem entrar no mérito do que é. Isso é muito importante. A lista é uma ferramenta. Uma abstração. E tem que ficar assim, abstrata. Genérica. Você vai usar depois. E depois. Com outros tipos de elementos. Se não quer tratar ponteiros pros dois lados não use os dois. Mas aí para voltar um cara tem que ir pro início e contar um por um ou ficar salvando os ponteiros, o que é igualmente chato. A lista typedef struct { char* nome; int maximo; int quantos; No* inicio; No* fim; } Lista; Pois é: a lista tendo DENTRO dela esses valores facilita muito a sua vida pra escrever o programa. Sempre tem um limite pra se defender, um máximo de itens. Tem um contador atualizado, tem um nome até, que pode deixar como NULL, mas pode usar na hora de listar, por exemplo. Você sempre tem um ponteiro para o início, mas pense bem: se tiver um para o fim inserir no final fica bem fácil. Se tiver um para o início inserir no início fica muito fácil. Mas se tiver os dois a vida fica bem mais simples. E manter os dois atualizados é trivial. Mas achar o outro se só tem um é uma m#$%a porque tem que percorrer a lista toda. Inserir onde afinal? Em geral: inserir no início, no final e em alguma ordem. É isso que vai usar. Inserir na ordem pode ser também genérico, basta que você tenha uma função que compara dois elementos. Se mudar a lógica você muda só a função que compara. Sem novidades porque o próprio compilador C faz isso em qsort() por exemplo. Como criar uma lista assim? Lista* inicializa(char* nome, int limite) { Lista* l; l = (Lista*)malloc(sizeof(Lista)); l->nome = malloc(strlen(nome) + 1); strcpy(l->nome, nome); l->maximo = limite; l->quantos = 0; l->inicio = NULL; l->fim = NULL; return l; }; Nada de especial: declara um ponteiro para a lista, preenche os campos e retorna. Já faz sentido assim. Compare com o que usou PONT inicializa() { return NULL; } Como usar? Lista* uma = inicializa("Exemplo 1", 12); Lista* outra = inicializa("Outro Exemplo", 15); Veja como só ao declarar você já cria alguma informação: cada lista agora tem um nome, uma capacidade e um endereço. Confirme se entendeu a diferença e os detalhes se se interessou por esse caminho
  9. Talvez devesse mesmo aprender os tais conceitos básicos antes. Você tem um livro? Seria o melhor começo eu acho. Sua escola não assina um serviço de biblioteca online por exemplo? Esse programa que escolheu não parece muito bom... Não me surpreende que não funcione. Se você quer ver códigos para aprender talvez pudesse buscar exemplos dos livros mesmo. Programas sofisticados de produção estão disponíveis claro online, mas talvez seja cedo para tentar entendê-los. E se buscar códigos no GitHub pode pegar programas ruins e nem saber julgar que são ruins. Ao menos os autores dos livros tem uma certa responsabilidade com o que publicam... Pense nisso.
  10. O risco de usar gets() é o mesmo de usar scanf() e provavelmente pouco relevante num curso e exercício claramente introdutórios. E postar um link para o CWE --- e em inglês --- num tópico para iniciantes talvez não seja assim relevante. Talvez pudesse ter oferecido alguma dessas "alternativas melhores". Uma ao menos, ao invés de apenas jogar um link em inglês e uma afirmação. No caso do Windows e da Microsoft foram escritas "versões seguras" de muitas dessas rotinas, como scanf_s() por exemplo. A Microsoft nunca conseguiu emplacar essas versões no padrão da linguagem, mas uma discussão está aqui, em português: https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=vs-2019 Tem um comitê que decide o que vai para o padrão da linguagem e isso não teve votos para tal. O risco existe porque essas rotinas não controlam o tamanho da entrada, como o tamanho da string que vai ler via gets(), e a entrada padrão pode ser redirecionada a partir de um arquivo e assim enfiar algum código através de uma ingênua e aparentemente inofensiva chamada a uma função para lê uma letrinha do teclado. Para não correr o "risco de segurança": no caso de gets() por exemplo, apenas use fgets(). Em C a entrada padrão é stdin e fgets() é assim: char* fgets(char *vetor, int tamanho, FILE * arquivo); Nada de novo. Mas o int é o limite que não tem em gets(). char nome[30]; printf("Digite O Nome Da Pessoa "); // ao invés de gets(nome); // use fgets(nome,29,stdin); // reserve uma posicao para o null que vem no fim da string.... fflush() e stdin fflush() está definido apenas para buffers de saída, e isso existe porque os sistemas tem buffers para dados e decidem quando de fato enviar, por questões de eficiência. Então quando você tenta transmitir algo para outra máquina pela rede por exemplo, o sistema não manda cada letra por vez. Isso é feito em blocos e quando o sistema resolve. Mas em certos casos a gente precisa controlar pelo programa. Imagine um painel LCD por exemplo, com 200 letras. É razoável que o sistema mande o texto para o LCD ao ter 200 no buffer. Mas se o programa tem uma mensagem de 30 e quer mandar para o painel na hora seria o caso de um flush()... Na entrada isso não faz tanto sentido, e fflush() não foi prevista para atuar na entrada. Há situações limite que podem justificar isso, como esse caso de ler ou não um ENTER ou algum dado que foi digitado mas não se quer ler mais. Mas não é padrão. O simples é usar algo como void flush(FILE* f) { int c; while ((c = fgetc(f)) != '\n' && c != EOF); }; // flush() e escrever flush(stdin), que roda esse simples loop. scanf(), fscanf() e sscanf() foram escritas com um objetivo claro, que está no nome: scan formatted input, e são muto eficientes para isso, tipo uma versão portátil de awk e que foram escritas pelas mesmas pessoas na mesma época. O que seria uma "maravilha"?
  11. C++ é uma linguagem que facilita muito escrever esse tipo de coisa. Talvez por ter sido escrita com esse propósito "Abstrações com custo zero" foi o motivo principal de escrever essa linguagem, segundo... seu criador. O caminho simples, sem inventar: crie uma classe Mansao com N quartos, e N descendentes. Nem precisa ter os dois na verdade, porque basta um vetor de N itens, que podem ser bool ou char ou int ou qualquer coisa. É que assim fica mais representativo em relação ao enunciado Por exemplo: class Mansao { private: void sorteio(); public: int N; // os descendentes e quartos char* descendentes; bool* porta_aberta; Mansao(); Mansao(int); void no_jardim(); }; no_jardim() chama sorteio que cria uma ordem aleatória dos N caras. E depois um único loop até N define o estado das portas. Ao final do loop mostra o resultado com as portas que estão abertas... adicionado 1 minuto depois Mansao() cria um exemplo como o do enunciado, com 6 portas. Mansao(n) cria uma Mansao com n portas, claro. Pode ser a mesma função...
  12. O que é "modularização?" Nesse caso aqui apenas pense como seria recursivamente. Você tem um processamento, que é somar as parcelas, N parcelas de valor a vão dar o resultado X. Quando tiver o resultado X você mostra e pronto. Então em multi() você soma uma parcela, e se não for a última chama multi() para somar a próxima. Só isso. Entendeu?
  13. Não entendo o que significa Muito bom ter se preocupado em dizer o que está usando e as versões. Quase ninguém faz isso. Eclipse, Ubuntu 16.04 ARM. Pode ser importante saber a versão de gcc e as opções de compilação em certos casos. Pensando só no que está escrito aí: De onde vem NULL, o símbolo? De iostream De onde vem uint8_t? De cstdint Aí temos a pergunta óbvia: Sei programa tem esses #include? #include <iostream> // lar do NULL #include <cstdint> // lar do uint8_t, uint16_t, unit32_t, uint64_t... Ou reproduza esses #define como acima
  14. Para isso dar certo você precisa explicar para o compilador o que é "<<" para uma matriz 5x5 de int. Ou uma matriz qualquer NxN. Isso se chama operator overloading. Uma vez que você faça isso você pode escrever como tentou, ou quase isso. Sem fazer nada não consegue nada. Sem fazer nada precisa tratar cada um dos 25 int e fazer como quer. Não pode usar '<<' e esperar que funcione. Postei um exemplo de como fazer isso nesse forum, meses atras, para vários operadores em especia esse. Pode pesquisar aqui no conteúdo direto no perfil de cada usuário. Eu não tenho agora um índice. Em resumo você cria uma classe para esse tipo de matriz e implementa as funções de que precisa. E o resto funciona "no automático". C++ é perfeita para esse tipo de uso. Abstrações de dados sem perder performance. E sem muito trabalho. adicionado 53 minutos depois Exemplo Usando recortar e colar, um exemplo com essas matrizes e o uso tradicional, C-like, e um exemplo possível em C++, no mesmo programa... Um exemplo da classe class Int5x5 { public: int v[5][5]; Int5x5(); Int5x5(char); Int5x5(int); }; Bem inútil, mas serve para esse mínimo exemplo. Eis a ideia: se você declarar algo disso, pode usar 3 opções: Int5x5 Coisa e a matriz vai ser preenchida com valores a partir de 1 Int5x5 coisa(500) e a matriz vai ser preenchida com valores a aprtir de 500 Int5x5('?') e a matriz vai ser preenchida com valores aleatórios entre 1 e 1000 Se precisar de mais opções, escreva mais funções: a mágica do polimorfismo. É claro que na prática pode escrever para uma matriz NxN Um "overload básico para '<<' Basta declarar isso ostream& operator<< (ostream&, Int5x5&); E escrever algo como ostream& operator<< (ostream& saida, Int5x5& m) { cout << "\nMatriz 5x5 (<<)\n" << endl; for (int l = 0; l < 5; l = l + 1) { for (int c = 0; c < 5; c = c + 1) saida << setw(5) << m.v[l][c]; saida << endl; }; return saida; } E é só isso mesmo. É claro que na prática pode redefinir quase todos os operadores. Resultado Um teste em C++ do que tentou fazer Matriz 5x5 (<<) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Matriz 5x5 (<<) -32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 Matriz 5x5 (<<) 326 308 422 857 802 670 118 62 679 871 606 978 52 567 368 578 633 306 261 468 733 958 241 600 568 Para essas linhas de C++ cout << "\nUm teste em C++ do que tentou fazer\n" << endl; Int5x5 uma(1); cout << uma; Int5x5 outra(-32); cout << outra; Int5x5 sorteio('X'); cout << sorteio; Um programa com os exemplos mais comuns, e esses #include <iomanip> #include <iostream> using namespace std; class Int5x5 { public: int v[5][5]; Int5x5(); Int5x5(char); Int5x5(int); }; ostream& operator<< (ostream&, Int5x5&); int imprime_uma(int*); int main(int argc, char** argv) { // o simples int tabela5x5[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 }, { 21, 22, 23, 24, 25 } }; cout << "O comum agora\n\n" << endl; // como declarado cout << "\ntabela5x5 declarada\n\n" << endl; for (int l = 0; l < 5; l = l + 1) { for (int c = 0; c < 5; c = c + 1) { cout << setw(5) << tabela5x5[l][c]; }; cout << endl; }; cout << endl; // preenche tabela int tabela[5][5]; // essa vai preencher no programa int valor = 1; for (int l = 0; l < 5; l = l + 1) for (int c = 0; c < 5; c = c + 1) { tabela[l][c] = valor; valor = valor + 1; }; printf("\ntabela preenchida no programa\n\n"); for (int l = 0; l < 5; l = l + 1) { for (int c = 0; c < 5; c = c + 1) { cout << setw(5) << tabela5x5[l][c]; }; cout << endl; }; cout << endl; printf("\nusando o endereco da tabela\n"); printf("\ntabela declarada\n\n"); imprime_uma(&tabela5x5[0][0]); printf("\ntabela preenchida\n\n"); imprime_uma(&tabela[0][0]); cout << "\nUm teste em C++ do que tentou fazer\n" << endl; Int5x5 uma(1); cout << uma; Int5x5 outra(-32); cout << outra; Int5x5 sorteio('X'); cout << sorteio; return 0; }; // main() int imprime_uma(int* v) { for (int k = 0, l = 1; k < 25; k += 1, l = l + 1 ) { printf("%2d ", *(v + k)); if (l > 4) { l = 0; printf("\n"); }; // if() }; // for() return 0; }; Int5x5::Int5x5() { // o basico: a partir de 1 Int5x5(1); }; Int5x5::Int5x5(int N) { // valores a partir de N int valor = N; for (int l = 0; l < 5; l = l + 1) for (int c = 0; c < 5; c = c + 1) { v[l][c] = valor; valor = valor + 1; }; }; Int5x5::Int5x5(char r) { // tanto faz a letra. E so um exemplo // vai preencher com valores aleatorios entre 1 e 1000 srand(r); for (int l = 0; l < 5; l = l + 1) for (int c = 0; c < 5; c = c + 1) v[l][c] = rand() % 1000 + 1; }; ostream& operator<< (ostream& saida, Int5x5& m) { cout << "\nMatriz 5x5 (<<)\n" << endl; for (int l = 0; l < 5; l = l + 1) { for (int c = 0; c < 5; c = c + 1) saida << setw(5) << m.v[l][c]; saida << endl; }; return saida; }
  15. Talvez você melhor usar algo mais moderno para aprender linguagens. Tem que ser esse CodeBlocks? se rodar cc -o teste teste.c deveria compilar o programa e se der certo gerar o arquivo 'teste' no mesmo diretório. E você roda digitando ./teste e deveria mostrar a mensagem adicionado 19 minutos depois um gcc --version também seria útil para você sabe se tem e a versão do compilador em sua máquina. E nesse IDE --- sim, IDE é masculino --- se ele está configurado certinho, o que deveria ter acontecido durante a instalação. adicionado 21 minutos depois E nas opções do tal Code::Blocks veja se o compilador está lá detectado e configurado.
  16. arfneto

    C Algoritmo de cadastro <>

    my bad
  17. arfneto

    C Algoritmo de cadastro <>

    um pouco ruim de ler isso hein? Porque não colocou no bloco de código como os outros? Você entendeu o que te expliquei? Tentou rodar ao menos? Tem um livro de C? Sua escola não tem um abiblioteca online que você pode acessar? Arrume um livro. É importante. E siga as mensagens... Sabe o que é toupper()? pra que serve? Isso não faz parte da linguagem. Deve estar el alguma biblioteca. Procurou por isso? touuper() fica em ctypes.h ... Procurou algum exemplo? como esse em https://www.tutorialspoint.com/c_standard_library/c_function_toupper.htm adicionado 0 minutos depois Eu te disse pra focar nos dados. E te mostrei um exemplo que já funciona. Não fez nada com isso?
  18. basta multiplicar os caras da mesma posição e somar. Como está lá na fórmula. Sobre como calcular, devem haver muitas maneiras. O mais simples é um terceiro loop, depois de ler os dois conjuntos de pares, multiplicar e somar os produtos em um terceiro loop. Mas é um pouco ingênuo. O mais esperto é multiplicar assim que lê o segundo e assim ao final do loop já tem o produto. Se não percebeu na fórmula, é só um número, uma soma de produtos.
  19. E? Qual seria a dificuldade? Entendeu o problema? sabe o que é?
  20. Ou apenas declare. Basta que não seja digitada pelo usuario...
  21. então você já gravou em outro momento. Só isso. Você só não pode achar que vai ler algo que faça sentido se não sabe quem gravou lá. E é claro mais fácil você mesmo gravar na linha anterior. Mesmo porque aí você saberá o que espera ler...
  22. Como eu te disse, você não vai usar nenhum comando. Se chamam literais. constantes. Só vai declarar o trem e listar os valores. Não? "Gerar automaticamente sem ler do usuário" é uma descrição meio besta. E se for colocar um a um basta um loop, um for para colocar os int de 1 a 25 nas colunas L e C por exemplo, e claramente L e C vão de 0 a 4, certo?
  23. "size_t é normalmente usado pra indexar arranjos (arrays) e fazer contagem em laços (loops)" Como assim indexar arrays? Se está aprendendo é bom --- muito bom --- usar um IDE. E moderno. E escrever seus programas nele. O que você usa? veja esse caso: você declarar algo como size_t e põe o ponteiro do mouse sobre o size_t: alguns segundos depois o próprio IDE acende a definição para você: size_t é simplesmente um int sem sinal: unsigned int Você deve usar size_t em casos em que é mais prático: se sabe que só vai usar números positivos o compilador controla pra você e não precisa ficar a vida toda testando se o cara digitou um valor negativo para a idade, por exemplo. Nesse caso aqui é o tamanho da string, que naturalmente não pode ser negativo. Isso você podia ter feito: void print_reverse(char* a) { size_t len = strlen(s); char* t = [1] + [2] - 1; while ( [3] >= [4] ) { printf("%c", *t); t = [5] [6] [7]; { puts(""); } [ ] s [ ] t [ ] len [ ] s [ ] - [ ] 1 [ ] t se não entende os códigos volte umas páginas do livro, porque os exercícios vem DEPOIS dos conceitos...
  24. não sabe escrever uma função que inverte uma string? O próprio enunciado é uma dica
  25. Você não vai. Mas vai cada geração da função cuida da sua letra, esperando pra ver se é o ultimo e aí imprimir. E por iso imprime ao contrário, na ordem inversa

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!