alves077 Posted February 14, 2013 at 08:59 PM Report #495323 Posted February 14, 2013 at 08:59 PM Boa noite, Tenho que ler um input, que é uma espécie de matriz de char's, melhor várias matrizes em que a primeira linha e o tamanho da matriz (ex: 6 4 -> 6 linhas e 4 colunas) vindo depois os caracteres (ex: * ) expostos como a matriz deve ser, tendo depois de analisar a matriz, este formato podem existir uma só matriz como 10: 1ª linha o tamanho da matriz (linha,coluna); de seguida é mostrada a matriz, e assim sucessivamente até encontrar uma linha em branco. Alguma ideia a melhor maneira de guardar este input? Tinha uma função fgets num while, como por exemplo: while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0)) { scanf("%d %d",&rows, &columns); for(i=0;i<columns;i++) for(j=0;j<rows;j++) { scanf("%c",&teste[j][i]); } } Só que isto não bate certo, primeiro porque vou acabar por ler linhas repetidas. Mas a ideia era enquanto não encontrar linha em branco, verifica nova matriz guardava essa nova matriz e passava para a próxima, até encontrar linha em branco. Alguma ideia como resolver de maneira eficiente este problema? Obrigado pela atenção, alves077
HappyHippyHippo Posted February 14, 2013 at 09:06 PM Report #495324 Posted February 14, 2013 at 09:06 PM diz se este é um exemplo dos dados de entrada: (2 matrizes, uma de 3 linhas e 4 colunas e outra de 2 linhas e 5 colunas) 3 4 1 2 3 4 2 3 4 5 3 4 5 6 2 5 1 2 3 4 5 2 3 4 5 6 correcto ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 14, 2013 at 09:13 PM Author Report #495325 Posted February 14, 2013 at 09:13 PM Sim, por exemplo. Só com o pormenor: a matriz em si e constituída por char's, por exemplo por : *. Mas sim a ideia de input e essa
HappyHippyHippo Posted February 14, 2013 at 09:27 PM Report #495326 Posted February 14, 2013 at 09:27 PM o que eu não percebo é porque dizes que vais ler linhas repetidas while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0)) { scanf("%d %d",&rows, &columns); // <--- isto já foi lido com o fgets !!! altera para while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0)) { sscanf(strg, "%d %d",&rows, &columns); // <---- estás a ler da string preenchida pelo fgets e não do stdin IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 14, 2013 at 09:32 PM Author Report #495328 Posted February 14, 2013 at 09:32 PM (edited) Edit.. Mas o código assim não lê, por exemplo o input que escreveste. Ele lê um char em uma linha, penso eu... E não era isso que pretendia, lesse quantas as linhas que tenho. Logo não preenche bem a matriz, nem termina quando deve terminar Obrigado pela atenção, alves077 Edited February 14, 2013 at 09:44 PM by alves077
HappyHippyHippo Posted February 14, 2013 at 09:45 PM Report #495330 Posted February 14, 2013 at 09:45 PM mas testaste ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 14, 2013 at 09:57 PM Author Report #495331 Posted February 14, 2013 at 09:57 PM Sim. está com um comportamento estranho.. não termina quando deve, as vezes não deve e termina... Mas sendo um scanf("%c",&teste[j]); ele não insere as colunas bem, porque não lê dois caracteres na mesma linha.. acho eu.. Obrigado pela atenção, alves077
HappyHippyHippo Posted February 14, 2013 at 10:06 PM Report #495333 Posted February 14, 2013 at 10:06 PM tens p'rai uns erros (o seguinte código é bem executado (para input bem computado) #include <stdio.h> #define max 10 int main() { char teste[max][max]; char strg[max]; int rows, columns, i, j; while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0)) { sscanf(strg, "%d %d",&rows, &columns); // atenção à ordem rows/columns !!!!!!!! for(i=0;i<rows;i++) { for(j=0;j<columns;j++) { // atencão à oredem i/j !!!!!! // um espaço para ignorar caracteres de espaços/tabs/line carriage scanf(" %c",&teste[i][j]); } } } for(i=0;i<rows;i++) { for(j=0;j<columns;j++) printf("%c", teste[i][j]); printf("\n"); } return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 14, 2013 at 10:16 PM Author Report #495336 Posted February 14, 2013 at 10:16 PM hm ok.. O erro dos indices já tinha modificado mas não avisei. O codigo que publicas-te termina logo após a 1ª matriz, não suporta mais do que uma matriz pelo que vi, ele não lê um '\n' a mais e depois sai do while? Obrigado pela atenção, alves077
HappyHippyHippo Posted February 14, 2013 at 10:26 PM Report #495338 Posted February 14, 2013 at 10:26 PM o código que tens também não suporta mais que uma matriz ... pensa como resolver o problema IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 14, 2013 at 10:40 PM Author Report #495347 Posted February 14, 2013 at 10:40 PM Sim, a minha ideia era com o while conseguir captar mais do que uma matriz, com os for's chegava para captar uma matriz. Ele nunca fica no while, parece me que a condição de comparar com o '\n' não é aceite, porque ele lê o ultimo \n, logo sai sempre, nao há maneira de ler esse suposto \n? posso estar enganado mas e a ideia com que fico... Obrigado pela atenção, alves077
HappyHippyHippo Posted February 14, 2013 at 10:48 PM Report #495350 Posted February 14, 2013 at 10:48 PM se o problema é um '\n', então a maneira mais simples será: while((fgets(strg,max,stdin)!=NULL) && (strcmp(strg,"\n") != 0)) { sscanf(strg, "%d %d",&rows, &columns); for(i=0;i<rows;i++) { for(j=0;j<columns;j++) { scanf(" %c",&teste[i][j]); } } scanf("\n"); } no entanto terás sempre de resolver o problema de ler somente uma matriz IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 14, 2013 at 11:41 PM Author Report #495358 Posted February 14, 2013 at 11:41 PM Pois, resolve um problema, mas acrescenta outro... Já estou aqui a volta desde while, mas até agora nada. Terei que alterar o while para aceitar mais do que uma matriz? Pensava que assim chegaria mas não estou a conseguir obter o pretendido.
HappyHippyHippo Posted February 14, 2013 at 11:49 PM Report #495360 Posted February 14, 2013 at 11:49 PM pensa assim : blocos de código que sejam repetidamente necessários são o principal alvo de criação de funções IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 16, 2013 at 10:15 AM Author Report #495533 Posted February 16, 2013 at 10:15 AM (edited) Bom dia, Já tentei de outra maneira mas sem sucesso: int ent=0; while((ent = getchar()) != '\n') && (ent != EOF)) { fgets(strg,MAX,stdin); sscanf(strg, "%d %d",&row, &columns); /*...*/ } Assim ele lê com getchar(), e fica no ciclo até o uma linha em branco, aqui tudo bem, mas o getchar() lê um caracter e depois o número de row e columns já não bate certo, por isso, resolvo um problema mas aparece outro. Conseguem dar uma ideia como resolver? Já andei aqui as voltas mas nada de muito relevante foi feito.. Já agora surgiu-me uma outra dúvida a nivel de sintaxe, queria comparar um char com uma barra lateral tipo '\', com posso fazer em c, já que ele não reconhece assim como uma barra lateral? Obrigado pela atenção, alves077 Edited February 16, 2013 at 11:09 AM by alves077
pmg Posted February 16, 2013 at 11:15 AM Report #495536 Posted February 16, 2013 at 11:15 AM REGRA #1 Usa sempre o valor devolvido pela maior parte das funcoes declaradas em <stdio.h>. Esta regra aplica-se a funcao fgets()! while (fgets(strg, MAX, stdin)) { if (sscanf(strg, "%d%d", &row, &columns) != 2) /* error */ /* ... */ } O caracter "barra invertida" pode ser especificado em C da seguinte forma if (ch == '\\') /* barra invertida */; 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!
alves077 Posted February 16, 2013 at 11:40 AM Author Report #495538 Posted February 16, 2013 at 11:40 AM Mas nesse caso acho que continuo ocm o mesmo problema Por exemplo: while (fgets(strg, MAX, stdin)) { if (sscanf(strg, "%d%d", &row, &columns) != 2) break; for(i=0;i<rows;i++) { for(j=0;j<columns;j++) { scanf(" %c",&teste[i][j]); } } } Parece me que ele lê o \n e salta a próximo input de linhas e colunas, saindo assim logo a seguir de introduzir a 1ª matriz, mas ainda não consegui solucionar o problema... Como foi dito post's atrás com uma leitura de um \n nao funciona, porque tira um problema mas aparece outro, já andei aqui as voltas mas esta dificil.. Obrigado pela atenção, alves077
pmg Posted February 16, 2013 at 11:48 AM Report #495540 Posted February 16, 2013 at 11:48 AM Mostra um exemplo dum input que da erro? Cada elemento do array teste pode ser o que? um algarismo, uma letra, um asterisco, um sinal de menos, ...? Nao pode ser o que? um espaco, um TAB, um enter, .. O input esta organizado por linhas? 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!
alves077 Posted February 16, 2013 at 11:59 AM Author Report #495541 Posted February 16, 2013 at 11:59 AM Por exemplo: 3 4 * * * * * * * * * * * * 2 5 * * * * * * * * * * A matriz em si é de char, a 1ª linha dis as dimensões da matriz. É suposto parar quando lê uma linha em branco, quando não houver mais nada para ler. O input em principio não estará espaçado, isto é entre colunas não há espaço. Obrigado pela atenção, alves077
pmg Posted February 16, 2013 at 12:24 PM Report #495543 Posted February 16, 2013 at 12:24 PM (edited) Se nao ha espaco entre colunas, para que puseste o espaco no scanf()? primeiro passo: ler o numero de linhas e colunas. segundo passo: num ciclo consoante o numero de linhas terceiro passo: ler tantos caracteres quanto o numero de colunas e ignorar o fim de linha Voila! em codigo: // primeiro passo while (fgets(strg, MAX, stdin)) { if (sscanf(strg, "%d%d", &row, &columns) != 2) break; //segundo passo for (linha = 0; linha < row; linha++) { // terceiro passo (ler a linha toda duma vez) char caracteres[1000]; /* nao misturar fgets() com scanf() */ if (!fgets(caracteres, sizeof caracteres, stdin)) /* erro */ break; for (coluna = 0; coluna < columns; coluna++) { teste[linha][coluna] = caracteres[coluna]; } } } Edited February 16, 2013 at 12:25 PM by pmg 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!
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