ASHASHIN Posted February 15, 2013 at 06:44 PM Report #495462 Posted February 15, 2013 at 06:44 PM (edited) Boas, tenho como trabalho pegar no tamanho de uma lista, um numero e uma lista e somar a cada elemento da lista esse mesmo número EX: Input: 5 1 [1,1,1,1,1] Output: [2,2,2,2,2] mas o meu output sem a linha "printf (",%d", s->value); //confirmar se os numeros estão a ser somados" é [] (e com a mesma é "22222[]") alguém me pode explicar o porquê? #include <stdio.h> #include <stdlib.h> /* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif // Listas //definição de Lista typedef struct lnode *List; typedef struct lnode { int value; List next; } List_node; List list_cons (int x, List s) { List r = (List) malloc (sizeof (List_node)); r -> value = x; r -> next = s; return r; } List list_read_some(FILE *f, int n) { List result = NULL; if (n > 0) { int x; fscanf(f, "%d", &x); result = list_cons(x, list_read_some(f, n-1)); } return result; } void list_show(FILE *f, List s) { fprintf(f, "["); if (s) { fprintf(f, "%d", s -> value); s = s->next; while (s) { fprintf(f, ",%d", s -> value); s = s -> next; } } fprintf(f, "]\n"); } // adiciona acc a cada elemento da lista e imprime a mesma List list_accumulate (List s, int acc) { while (s) { s->value += acc; printf ("%d", s->value); //confirmar se os numeros estão a ser somados s = s->next; } return s; } void test_list_accumulate () { int acc, size; //criação lista vazia List s = NULL; while (scanf ("%d%d", &size, &acc) != EOF) { s = list_read_some(stdin, size); s = list_accumulate (s, acc); list_show(stdout, s); } } int main () { test_list_accumulate (); return 0; } EDIT1: esqueci-me de copiar a main no código acima EDIT2: adicionar identação (quando eu fiz guardar alterações após o EDIT1 o código estava identado não percebo porque é que não ficou no post), em relação à minha definição do NULLL (e quanto ao tanto ser para C como C++ que acho qu referes porcausa da definição de NULL) já estava no ficheiro original tal como a funçãod e leitura e escrita, List s = NULL é a minha unica variavel global e declarei-a assim para não ter que estar sempre a escrever essa linha noutras funções) EDIT3: adicionei função em falta e removi a variavel global e adicionei os includes EDIT4: retirada a virgula no printf da "list_accumulate" Edited February 15, 2013 at 08:13 PM by ASHASHIN Falta LP no GeSHi
pmg Posted February 15, 2013 at 07:08 PM Report #495464 Posted February 15, 2013 at 07:08 PM (edited) Primeiro: porque achas que a tua definicao de NULL é preferivel a definicao do proprio compilador? NULL esta definido em muitos headers (pelo menos <stddef.h>, <stdio.h>, <stdlib.h>). Segundo: sugiro que nao escrevas codigo que seja valido tanto em C como em C++. Se o fizeres ficas com uma coisa que nem é carne nem peixe. Escolhe uma linguagem e trabalha com essa linguagem. Terceiro: evita variaveis globais Quarto: melhora a indentacao do teu codigo PS Vou estudar o teu codigo e tentar perceber porque nao imprime como queres. Edit Quinto: o scanf() devolve EOF quando ha erro na leitura. O teu scanf() na funcao test_list_accumulate() pode devolver EOF, 0, 1, ou 2. Os valores EOF, 0, e 1 indicam que algo correu mal ... mas so averiguas o caso EOF: nos outras casos prossegues o programa como se tivesse corrido tudo bem. Sugiro que verificas se o resultado for diferente de 2 em vez de igual a EOF while (scanf("%d%d", &size, &acc) == 2) Edit #2 Sexto: o teu programa nao compila: a funcao list_cons() nao esta definida em lado nenhum. Edit #2 Setimo: apaga a variavel global! Nao esta la a fazer nada! Todas as funcoes que usam 's' usam a partir de um parametro, ou como variavel local (na funcao test_list_accumulate()) Edited February 15, 2013 at 07:33 PM by pmg Quinto e Sexto e Setimo What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
ASHASHIN Posted February 15, 2013 at 07:52 PM Author Report #495467 Posted February 15, 2013 at 07:52 PM a função em falta foi adicionada e em principio não falta nada para ser compilável
HappyHippyHippo Posted February 15, 2013 at 08:03 PM Report #495469 Posted February 15, 2013 at 08:03 PM este é o output que tenho com esse código: 5 1 1 1 1 1 1 ,2,2,2,2,2[] IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ASHASHIN Posted February 15, 2013 at 08:11 PM Author Report #495471 Posted February 15, 2013 at 08:11 PM (edited) Oops, a virgula ficou de quando eu tentei imprimir sem a "list_show" mas não muda o facto de que os elementos da lista continuam de fora dos "[]" Edited February 15, 2013 at 08:16 PM by ASHASHIN
HappyHippyHippo Posted February 15, 2013 at 08:16 PM Report #495472 Posted February 15, 2013 at 08:16 PM porque os número que estão a ser apresentados não são da função list_show !!! List list_accumulate (List s, int acc) { while (s) { s->value += acc; printf ("%d", s->value); //confirmar se os numeros estão a ser somados s = s->next; } return s; // <-- qual o valor de s nesta instrução ? (após o ciclo) } void test_list_accumulate () { // ... s = list_accumulate (s, acc); // <--- qual o valor de s ? list_show(stdout, s); // qual o valor de s ? // ... } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted February 15, 2013 at 08:20 PM Report #495473 Posted February 15, 2013 at 08:20 PM Mete isto na primeira linha da funcao list_show() printf("list_show() called\n"); What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
ASHASHIN Posted February 15, 2013 at 08:24 PM Author Report #495475 Posted February 15, 2013 at 08:24 PM porque os número que estão a ser apresentados não são da função list_show !!! List list_accumulate (List s, int acc) { while (s) { s->value += acc; printf ("%d", s->value); //confirmar se os numeros estão a ser somados s = s->next; } return s; // <-- qual o valor de s nesta instrução ? (após o ciclo)| se o imput foi 5 1 1 1 1 1 1 s deveria valer [2,2,2,2,2] } void test_list_accumulate () { // ... s = list_accumulate (s, acc); // <--- qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá ser [1,1,1,1,1] list_show(stdout, s); // qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá [2,2,2,2,2] // ... } porque os número que estão a ser apresentados não são da função list_show !!! Então quais são?
HappyHippyHippo Posted February 15, 2013 at 08:26 PM Report #495476 Posted February 15, 2013 at 08:26 PM apaga a linha printf da função list_accumulate ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ASHASHIN Posted February 15, 2013 at 08:28 PM Author Report #495477 Posted February 15, 2013 at 08:28 PM ao apagar a lista o output é [] (como indicado no 1º post)
HappyHippyHippo Posted February 15, 2013 at 08:31 PM Report #495478 Posted February 15, 2013 at 08:31 PM responde às perguntas que coloquei no código no post anterior IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ASHASHIN Posted February 15, 2013 at 08:35 PM Author Report #495479 Posted February 15, 2013 at 08:35 PM (edited) Eu já respondi (acho eu que era aquilo que estavas a perguntar) na quotação com código quando perguntei "Então quais são?" (percebi depois que te estavas a referir ao printf da "list_accumulate" Edited February 15, 2013 at 08:35 PM by ASHASHIN
HappyHippyHippo Posted February 15, 2013 at 08:40 PM Report #495480 Posted February 15, 2013 at 08:40 PM eu comentei o código ... e nesse comentário estão questões ... responde à perguntas que saberás qual é o problema IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ASHASHIN Posted February 15, 2013 at 08:51 PM Author Report #495481 Posted February 15, 2013 at 08:51 PM 1- return s; // <-- qual o valor de s nesta instrução ? (após o ciclo)| se o imput foi 5 1 1 1 1 1 1 s deveria valer [2,2,2,2,2] 2- s = list_accumulate (s, acc); // <--- qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá ser [1,1,1,1,1] 3- list_show(stdout, s); // qual o valor de s ?| se o imput foi 5 1 1 1 1 1 1 s deverá [2,2,2,2,2] 2- s em " list_accumulate" vale [1,1,1,1,1] e s=list_accumulate (s, acc) deveria ser [2,2,2,2,2] 3- o s deveria ser [2,2,2,2,2] mas o que aparece "imprimido" é [] Lamento se não estou a perceber bem o que queres dizer 😞
HappyHippyHippo Posted February 15, 2013 at 08:56 PM Report #495482 Posted February 15, 2013 at 08:56 PM "s" é um ponteiro ... logo nunca, mas nunca digas que um ponteiro tem o valor de "[2,2,2,2,2]" !!! um ponteiro é um número, e esse número representa a posição de memória. logo, responde novamente às perguntas se necessário, usa a seguinte função para descobrir: printf("%p", s); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ASHASHIN Posted February 15, 2013 at 09:05 PM Author Report #495485 Posted February 15, 2013 at 09:05 PM Ok.... eu sinto-me mal comigo mesmo....... Já percebi o porquê obrigado pela ajuda 🙂
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now