Ir para conteúdo
Fórum Script Brasil

Dan Oliveira

Membros
  • Total de itens

    95
  • Registro em

  • Última visita

Tudo que Dan Oliveira postou

  1. Eu não dei uma olhada na lógica, mas quando você quer criar um vetor com um tamanho definido pelo usado em tempo de execução você vai usar alocação de memória. "Mas o que é isso?" Quando você escreve um programa você tem que especificar tipos, retorno de função, loops... Tudo isso precisa de ter um endereço da memória e um espaço para ser guardado, ou seja seu programa já diz quanto de memória vai precisar para o sistema e ele vai dar. Quando ele for executado ele poderá alterar os valores na memória que foi permitido e previamente declarada. Para usar alguma memória durante o tempo de execução do programa(quando ele está rodando) o sistema oferece um espaço para os programas em que eles possam alocar (alugar) tais blocos de memória. "E o por quê disso?" Por mera segurança, se um sistema deixasse o programa ter total controle sobre a memória RAM ele poderia reescrever a memória usada pelo próprio sistema e assim conseguiria fazer qualquer coisa com ele, tipo roubar senha. Você pode pesquisar um pouco como os programas realmente são executados. Vamos a prática. A linguagem C oferece uma biblioteca padrão para alocação de memória sujo o arquivo de cabeçalho é stdlib.h. Existe três funções relacionadas a alocação de memória. void* malloc(size_t size) //aloca um bloco tamanho size na memória void free(void* ptr) //libera a memória apontada por ptr void* realloc(void* ptr, size_t size) //realoca um bloco já alocado O que você tem que saber: size_t é unsigned int, ou seja não aceita valores negativos então teste para ver se o usuário digita algo entre zero e o maior valor aceito por size_t void* é o retorno das funções de alocação, ou seja quando você for converter para qualquer tipo você precisa fazer um casting (conversão) o retorno da função malloc será NULL se ela não conseguir alocar eespaço. se eu quiser alocar um int faço o seguinte declaro um ponteiro para int int* ptr; e aloco a memória fazendo uma conversão da memória para um int (int) ptr = (int) malloc(sizeof(int)); //o operador sizeof() especifica quantos bytes(2 ou 4 na maioria) preciso para representar um int if(ptr = NULL) //não foi alocado a memoria return 1; //retorna um valor com o código esse um é arbitrário toda vez que o programa retornar ele eu sei q foi problema com a memória ptr = (int* ) realloc(ptr, 4 * sizeof(int)); //Aqui você realoca a memóriia para suportar um vetor de 4 ints, convertendo então o ponteiro para suportar tal dado free() é uma função que libera a memeória alocada pelo ponteiro ou seja free(ptr); //libera a memória que tinha alocado antes serve para grande programa, às vezes precisamos de um espaço para determinda tarefa, ou função e como a alocação é válida até quando nosso programa é encerrado temos que liberar o espaço quando não precisamos dele #include <stdio.h> #include <stdlib.h> int* fibo (int n); int main (void) { int n1; int *f; printf ("Digite um numero: "); scanf ("%d", &n1); f = fibo (n1); if(f == NULL) { printf("Falha ao alocar memória\n"); return 1; //programa finalizado com erro } for (int i=0; i<n1; i++) printf ("%d ", f[i]); free(f); //libera espaço da memória return 0; } int* fibo (int n) { int n1 = 0; int n2 = 1; int* f; //ponteiro para um vetor int, equivale a int f[], só que da maneira correta f = (int* )malloc(n * sizeof(int)); //aqui a um casting dizendo que é um vetor de int if (f == NULL) //se a alocação deu errada return NULL; f[0] = n1; f[1] = n2; for (int i = 2; i <= n; i++) { f[i] = n1 + n2; n1 = n2; n2 = f[i]; } return (f); } Tem outras boas práticas também a ser seguidas, consulte cplusplus.com/reference para saber mais. Lembrando não analisei sua lógica, só expliquei como trabalhar com alocação, dúvidas fique a vontade para pergunta todos estarão à disposição
  2. Você cria um vetor de caracteres char string[20]; Depois para acessar uma posição na string é só usar um indicador n. Por exemplo: Para acessar n posição da string. string[n]; você pode usar isto para excluir. Outra opção e levando em conta que você tenha noção sobre ponteiros. Você teria que criar uma string com alocação de memória dinamica para aceitar qualquer tamanho de string e uma função que exclui um caractere de string trazendo todos caracteres da direita uma posição a esquerda e ir liberando espaço, na verdade isso funciona com arrays em C também. por exemplo: 0 1 2 3 4 5 6 D A N I E L \0 //O usuario exclui N 0 1 2 3 4 5 6 D A N I E L \0 //É só usar um loop para copiar os caracteres da direita para esquerda 0 1 2 3 4 5 D A I E L \0
  3. Sempre que você estiver diante de um problema que precisa de uma estrutura de dados em C você utiliza uma struct struct filme{ int codigo; char[20] titulo; int res; //uma variavel para testar se estar reservado } O que você tem a fazer é sempre que um usuário for reservar um filme voce checar essa variavel. Quando for 0 o filme não está reservado Quando for 1 o filme já está reservado E por ultimo se lembre de zerar a variavel ao começar o programa é bom sempre atribuir o numero 0 a res senão seu programa estará coletando uma valor qualquer na memória.
  4. if (pass == 123); //Esse ponto e virgula indica que o if acaba aqui. Logo o que estiver abaixo entre chaves {} sempre será executado e o else fica sem um if anterior
  5. Você pode usar a função fgets() para ler uma string do arquivo: Sua compoisção é: char *fgets(char *minhaString, int numBytes, FILE *arq) Onde minhaString é a string que recebe o valor; int numBytes o numeros de bites a ser lido do arquivo; FILE *arq - um ponteiro para o arquivo aberto; Essa função lê uma string até ter lido numBytes caracteres ou encontrado o caractere '\n' Você pode criar um vetor com 100 nomes de 80 caracteres limites cada char nomes[100][80]; e depois pode lê o arquivo e coloca em cada indice do vetor char nome[100][80] int i = 0; while(!feof(p_arquivo) || i <100) { fgets(nome[i],sizeof(char[80]), p_arquivo); }
  6. Leia o arquivo inteiro e guarde em um vetor de strings; Depois use um algoritmo de ordenação (bubblesort, quicksort, ...) Para ajudar você poderia usar a função strcmp() do header string.h int strcmp(char* string1, char* string2) Ela retorna 1 se string1 for maior que string2 Ela retorna -1 se string2 for maior que string1 Ela retorna 0 se string1 for igual a string2 Lembrando que todo caractere(char) é um inteiro(int) e é na tabela ascii 'a' terá um valor menor que 'z' Ou seja: strcmp("a", "b") retorna -1 strcmp("b", "a") retorna 1 strcmp("a", "a") retorna 0
  7. Eu programo em C mas como deu pra perceber a sintaxe do cout está errada. ele não é uma função e logo não exista os parenteses para passar argumentos. o resultado esperado é obtido por: cout<<num1<<"e divisel por: "<<num2<<endl;
  8. A declaração está certa, (colocaria char num[] como parâmetro pois C não sabe dimensões de uma string). posta a sua função completa para sabermos o que está errado.
  9. Eu não entendi seu programa ou o que ele faz. Por favor poste o enunciado ou explique o que ele precisa fazer para ajudarmos.
  10. é só mudar o printf e aproveitar o laço para mostrar... #include <stdio.h> int main(void){ int vezes, i, aux, total; total =0; //Pede ao usuario um int para vezes printf("Digite o numero de vezes a ser somado: "); scanf(" %d", &vezes); //itera i até n vezes for(i =0; i <vezes; i++){ //pede um numero ao usuario usando aux; printf("Num%d: ", i + 1); scanf(" %d", &aux); //é só pra isso que serve aux total += aux; //soma o valor de aux a total e atribui a total } printf("O resultado total foi: %d\n", total); return 0; }
  11. aux ou (variavel auxiliar) é só uma variavel a mais para ajudar no processo do algoritmo. iterar é um termo usado para o acréscimo de uma varavel, usada em um loop. algumas partes que eu deixei de implementar erá só colocar alguns scanfs taí o código #include <stdio.h> int main(void){ int vezes, i, aux, total; total =0; //Pede ao usuario um int para vezes printf("Digite o numero de vezes a ser somado: "); scanf(" %d", &vezes); //itera i até n vezes for(i =0; i <vezes; i++){ //pede um numero ao usuario usando aux; printf("Digite um inteiro: "); scanf(" %d", &aux); //é só pra isso que serve aux total += aux; //soma o valor de aux a total e atribui a total } printf("O resultado total foi: %d\n", total); return 0; }
  12. Peça um numero ao usuario e itere em um laço o enquanto i menor que o numero de vezes. Use uma variavelauxiliar e acrescente ao total em cada iteração ... int vezes, i, aux, total; total =0; ...Peça ao usuario um int para vezes for(i =0; i <vezes; i++){ ...peça um numero ao usuario usando aux; total += aux; //soma o valor de aux a total e atribui a total } ...imprime na tea o valor de total é um código imcopleto, pois não vou fazer seu dever de casa. Qualquer dúvida, poste um código que ficaremos feliz em te ajudar.
  13. Temos um tópico sobre o mesmo tema Dúvida em linguagem C
  14. Use a tag code para melhor entendimento. Sua lógica está fraca, em algumas coisas tá legal em outras perde o sentido. até aqui tá legal aí.. primeiro que no segundo if a variavel maior2 vai ter o mesmo valor que maior1. no segundo if se num[cont] for igual(e claro que lele vai ser igual) a num[cont] depois você compara a diferença do próprio? Outra coisa que vale ressaltar é um printf errado, alta o %d para mostrar o valor de cont e tambem se um usuário esperto digitar um numero negativo(ou só nº negativos)? o programa vai funcionar com muitos erro. Vai a minha lógica. Primeiro pede ao usuário um numero(num[0]), atribua ele a maior1. Depois itere em um laço e peça outros e faça a comparação se num[cont] é maior que maior1, e se for atirbua o valor de maior1 a maior2, e o valor de num[cont] a maior1.
  15. o que acontece você cria uma variavel x local em main() Você chama Testando(x) Na verdade o programa cria uma variavel Teste local em Testando() com o mesmo valor de x No final Teste ganha o valor = 0 e é destruida no final da função Trocamos o valor de x? Não. então não serve pra nada essa função se não usarmos ponteiro.
  16. Pedro, quando se usa ponteiros e você passa um endereço das variáveis em uma função, não importa onde esteja elas serão alteradas sendo globais ou locais. uma teoria no que acontece. supondo que no programa acima: a =2; b =1; &a = 1002; //o endereço de a na memória &b = 1004; &x = 2012; &y = 2014; Quando você passa por cópia acontece isso: //trocar(a, B); x = a; // x = 2 y = b;// y = 1 eles trocam os valores de x e y que são destruidos depois da função Quando você passa por referencia acontece isso: //trocar(a, B); x = &a; // x = 1002 e *x = 2 y = &b;// y = 1004 e *y = 1 Qual a diferença? No segundo caso com ponteiros a função muda o valor que está na memória passada por referencia isso indica que qualquer parametro passado vai ser utilizado como se fosse ele mesmo independente que seja local ou global.
  17. Você pode usar ponteiros, estude-os bastante pois é o grande trunfo de C, eu vou passar uma abstração desse assunto sem teorias grande, busque um livro ótimo. podemos usar ponteiros se precisarmos de alterar uma variavel fora do escopo, mas antes temos: int *p; //na declaração o * serve para indicar que aquela variavel é um endereço int i; p = &i; //o caractere & retorna o valor do endereço fisico na memória RAM, dizendo assim que o ponteiro aponta para o endereço i *p = 9; //usado depois da declaração o * acessa o valor da variavel apontada podendo assim altera-la //Por cópia, é errado e nada se altera void trocar(int x, int y) { int aux; //variavel auxiliar aux = x; x = y; y = aux; } //Por referencia void trocar(int *x, int *y) { int aux; //variavel auxiliar aux = *x; *x = *y; *y = aux; } //chamando asfunções em main main ... //por cópia troca(a,b); //por referencia troca(&a,&b);//usa sempre o & para indicar que se passa um endereço e a variável vai ser alterada, casos como scanf, printf usa-se essa notação Vetores e strings(vetores de caracteres) são passados automaticamente por referencia. Qualquer dúvida, ou uma explicação bem mais detalhada à disposição
  18. Dan Oliveira

    AJUDA

    O pedro está certo, como programador temos que pensar que nosso programa rodará em qualquer um sistema operacional por exemplo no linux não existe um comando "PAUSE" e isso não serviria pra nada. Na verdade essa coisa de pausar o programa é inútil, todo mundo sabe que programas em modo DOS se chama pela linha de comando(Prompt de Comando no Windows ou um terminal no Linux) é pra ser chamado pela linha de comando, e ele funciona normalmente e mostra os dados corretamente. Quando se tem uma(pelo menos o devc++) ele cria uma instância de um prompt que some logo ao executar o programa. Bom esses programas são para interface sem o modo gráfico então abra o Prompt ou Terminal e execute os comandos, era assim que programas eram rodados antigamente: //cd diretório, vai para o diretório do programa linux: cd Área\ de\ Trabalho/ ou winddows cd .\Desktop //executa o programa linux: ./programa ou windows: programa.exe
  19. Se C ajuda, uma struct pessoa com campos, id idade peso, fscanf() serve vai aí um esboço: #define TAM_MAX 3 //O máximo de dados que seu programa pode ler typedef struct { int id, idade, peso; } Pessoa; Pessoa pessoa[TAM_MAX]; FILE *fp ... //abre arquivo para leitura fopen ... ... for(i = 0; i < TAM_MAX || !feof(fp); i++){ fscanf(fp, "%d %d %d", &id, &idade, &peso); ... pessoa[i].id = id; pessoa[i].idade = idade; pessoa[i].peso = peso; }
  20. Eu também estudo sozinho, e dá muito trabalho no começo e depois mais trabalho ainda.
  21. Eu também estudo sozinho, e dá muito trabalho no começo e depois mais trabalho ainda.
  22. um int pode ter o tamanho de 4 ou 2 bytes dependendo da arquitetura do computador. Em C existe o operador sizeof(tipo) para saber o tamanho em bytes de um tipo de dados. printf("%d", sizeof(int)); //em um windows(32 bits) pode ter o tamanho de 2 bytes, já em um sistema unix pode ter 4. Isso varia, para isso existe os modificadores long e short. long garante que o int terá 4 bytes. short garante que o int terá 2 bytes. ex: 2 bytes(no windows 32 bits) int; //terá 2bytes short int; //terá 2 bytes long int; //terá 4 bytes ex: 4 bytes(no Linux, ou windows 64 bits) int; //terá 4 bytes short int; //terá 2 bytes long int; //terá 4 bytes Para quẽ isso, um int de 2 bytes representa menos valores do que um de 4, ou incompatibilidade de um programa pois o int tem tamanho diferente. Já o register. O programa aloca um espaço na memória RAM do pc para suas variáveis, quando você usa o modificador register ela irá ser gravada em um registrador um local de rápido acesso, usado muito em variáveis de iteração.Se não houver espaço no registrador ele é alocada normalmente na RAM. register int i; //coloca i em um registrador for(i = 0; i <10; i++) { printf("%d", i); } Eu recomendo uma boa pesquisa pela internet, e recomendo o livro de Linguagem C Luís Damas, ele sabe ensinar mais facilmente do que a Bília em c/c++.
  23. Você está criando uma função que tem parametros passado por cópia, logo o valor alterado é da cópia da estrutura passada e não da própria. Não entendi o que você quer fazer, por que se for pra atribuir é bem mais recomendável fazer dentro de main, caso faça um calculo, mostre nos que tipo de cálculo seria.
×
×
  • Criar Novo...