Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

arandoble

soma de array

Recommended Posts

Estou tento dificuldades em resolver esse algoritmo. Ele deve somar dois vetores de tamanho n. No arquivo de entrada são passados (2n+1) números: o primeiro número int é o tamanho de posições de um array de float; os demais números float são o conteúdo de dois arrays. A resposta é a soma desses dois arrays.

Exemplo: seja 3 o número de dimensões do vetor, logo o primeiro vetor v1 = (2.1; 2.4; 5.6) e o segundo vetor v2 = (4.1; 3.4; 9.6), logo o arquivo de saída será v1+v2 = (6.2; 5.8; 15.2)

 

aqui está o que eu conseguir fazer.

 

#include <stdio.h>
#include <stdlib.h>

#define TAM 5

int main(int argc, char *argv[])
{
   float vt1[TAM], vt2[TAM], vtS[TAM];
   int i;

   for(i=0; i<TAM; i++){
                        printf("digite os valores de VT1:");
                        scanf("%f", &vt1[i]);
                        }

   printf("\n\n");

   for(i=0; i<TAM; i++){
                        printf("digite os valores de VT2:");
                        scanf("%f", &vt2[i]);
                        }


          for(i=0; i<TAM; i++){
                               vtS[i] = (vt1[i] + vt2[i]);
                               }

          printf("%f\n Saída", vtS);                      

 system("PAUSE");	
 return 0;
}

 

Exemplo de Entrada

3

2.1

2.4

5.6

4.1

3.4

9.6

Exemplo de Saída

6.2

5.8

15.2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao meu ver, o código está certo. qual a sua dificuldade?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema grande está na seguinte linha:

 

printf("%f\n Saída", vtS);

 

Na chamada acima, printf recebe o valor de vtS. E o valor de qualquer array em C é um ponteiro para seu primeiro elemento. A linha acima faz tanto sentido quanto o código abaixo (ou seja, nenhum):

 

float a = 10.0f, *f = &a;
printf("%f", f);

 

O que você deve estar querendo é imprimir cada elemento do vetor de floats resultantes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tento dificuldades em resolver esse algoritmo. Ele deve somar dois vetores de tamanho n. No arquivo de entrada são passados (2n+1) números: o primeiro número int é o tamanho de posições de um array de float; os demais números float são o conteúdo de dois arrays. A resposta é a soma desses dois arrays.

Exemplo: seja 3 o número de dimensões do vetor, logo o primeiro vetor v1 = (2.1; 2.4; 5.6) e o segundo vetor v2 = (4.1; 3.4; 9.6), logo o arquivo de saída será v1+v2 = (6.2; 5.8; 15.2)

 

aqui está o que eu conseguir fazer.

 

#include <stdio.h>
#include <stdlib.h>

#define TAM 5

int main(int argc, char *argv[])
{
   float vt1[TAM], vt2[TAM], vtS[TAM];
   int i;

   for(i=0; i<TAM; i++){
                        printf("digite os valores de VT1:");
                        scanf("%f", &vt1[i]);
                        }

   printf("\n\n");

   for(i=0; i<TAM; i++){
                        printf("digite os valores de VT2:");
                        scanf("%f", &vt2[i]);
                        }


          for(i=0; i<TAM; i++){
                               vtS[i] = (vt1[i] + vt2[i]);
                               }
 // É bem aqui que você esqueceu de colocar o for.         
for (i=0; i<TAM; i++)
   {
       printf(" Saida %f\n", vtS[i]);
   }                    

 system("PAUSE");	
 return 0;
}

 

Exemplo de Entrada

3

2.1

2.4

5.6

4.1

3.4

9.6

Exemplo de Saída

6.2

5.8

15.2

A modificação que fiz esta como comentario no programa acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A modificação que fiz esta como comentario no programa acima.

Agradeço pela a ajuda. Porém se possível peço mais uma ajuda, como posso determinar a dimensão do vetor. por exemplo:

 

Os vetores vt1 e vt2 tenham o tamanho para eu digitar.

 

Exemplo de Entrada

3 <------------------dimensão do vetor ( ou seja os vetores vt1 e vt2 terão tamanhos 3)

2.1

2.4

5.6

4.1

3.4

9.6

Exemplo de Saída

6.2

5.8

15.2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi sua dúvida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi sua dúvida.

Antes de colocar os números no vetor vt1 e os números no vt2, preciso determinar os tamanhos desses vetores ou seja:

 

1º eu digito o tamanho dos vetores: 3 (então nesse caso eu só posso colocar três números no vt1 e três números no vt2)

 

Como eu crio e aplico essa variável(que determina o tamanho dos vetores) no programa, e se ela pode ser um outro vetor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi. Acho que no seu caso não pode ser um vetor declarado de forma estática.

Tem que declará-lo como vetor dinâmico utilizando a variável tamanho digitada pelo usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, pelo o que eu entendi, você pode utilizar um vetor da C99, que você pode inicializar com uma variável ao invés de um literal, ou então utilizar alocação dinâmica, que já é mais complexo...

 

 

#include <stdio.h>

int main(void)
{
   int n = 1;

   for(;;)
   {
       printf("Digite o tamanho do vetor: ");
       scanf(" %d", &n);

       if(n > 0)
           break;
   }

   int vetor_int[n];


   return 0;
}

 

Para compilar:

gcc -WAll -WExtra -WError -pedantic -ansi -std=c99 -o <nome_do_arquivo_de_saida> <nome_da_source>

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sabia que o problema era a alocação baseada no conteúdo dos arquivos. Segue o exemplo. Baseie-se nele para fazer o resto do programa:

 

#include <stdio.h>
#include <stdlib.h>

#define BUFFSZ 256

int main(int argc, char *argv[])
{
   if (argc < 2)
   {
fprintf(stderr, "\n\tEspecifique o nome do arquivo de entrada.\n");
exit(EXIT_FAILURE);
   }

   FILE *input = NULL;
   if ((input = fopen(argv[1], "r")) == NULL)
   {
fprintf(stderr, "\n\tErro ao tentar abrir o arquivo '%s'.\n", argv[1]);
exit(EXIT_FAILURE);
   }

   char buff[bUFFSZ];

   if (fgets(buff, sizeof buff, input) == NULL)
   {
fprintf(stderr, "\n\tErro de leitura.\n");
exit(EXIT_FAILURE);
   }

   unsigned int n = 0;
   if (sscanf(buff, "%u ", &n) == 0)
   {
fprintf(stderr, "\n\tFormato de arquivo de entrada invalido.\n");
exit(EXIT_FAILURE);
   }

   printf("\n\tAlocando vetores de %u ints.\n\n", n);

   int vetor_a[n], vetor_b[n];

}

 

Para compilar este exemplo, use:

 

gcc -std=c99 -Wall -Wextra -pedantic -Werror -Wno-unused [arquivo.c] -o [executavel]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sabia que o problema era a alocação baseada no conteúdo dos arquivos. Segue o exemplo. Baseie-se nele para fazer o resto do programa:

 

#include <stdio.h>
#include <stdlib.h>

#define BUFFSZ 256

int main(int argc, char *argv[])
{
   if (argc < 2)
   {
fprintf(stderr, "\n\tEspecifique o nome do arquivo de entrada.\n");
exit(EXIT_FAILURE);
   }

   FILE *input = NULL;
   if ((input = fopen(argv[1], "r")) == NULL)
   {
fprintf(stderr, "\n\tErro ao tentar abrir o arquivo '%s'.\n", argv[1]);
exit(EXIT_FAILURE);
   }

   char buff[bUFFSZ];

   if (fgets(buff, sizeof buff, input) == NULL)
   {
fprintf(stderr, "\n\tErro de leitura.\n");
exit(EXIT_FAILURE);
   }

   unsigned int n = 0;
   if (sscanf(buff, "%u ", &n) == 0)
   {
fprintf(stderr, "\n\tFormato de arquivo de entrada invalido.\n");
exit(EXIT_FAILURE);
   }

   printf("\n\tAlocando vetores de %u floats.\n\n", n);

   int vetor_a[n], vetor_b[n];

}

 

Para compilar este exemplo, use:

 

gcc -std=c99 -Wall -Wextra -pedantic -Werror -Wno-unused [arquivo.c] -o [executavel]

Muito obrigado! a você e a todos que me ajudaram, conseguir resolver o problema. Queria ter postado isso antes mas não estava conseguindo entrar no site. Abaixo está como ficou o código.

 

#include "Arquivo.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *entrada = abrirArquivoEntrada();
    FILE *saida = abrirArquivoSaida();

    float *vt1, *vt2, *vt1ini=NULL, *vt2ini=NULL;
    int i;
    int control=0, cont=0, cont2, tamanho;

     while(control<= 1){
                     if(cont==0){
                                 fscanf(entrada, "%d", &tamanho);
                                 vt1=(float *) calloc (tamanho, sizeof(float *));
                                 vt2=(float *) calloc (tamanho, sizeof(float *));
                                 vt1ini=vt1;
                                 vt2ini=vt2;
                                 cont=0;
                                 }
            else{
                  if((fscanf(entrada, "%f", vt1))!=EOF){ 
                                                         (*vt2)=(*vt1)+(*vt2);

                   vt1++;
                   vt2++;

                    if(cont>=tamanho){
                                        vt1=vt1ini;
                                        vt2=vt2ini;
                                        cont=0;
                                        }
                                                          }
                    else{
                         control=3;
                         }
                }
                cont++;
                    }

       vt2=vt2ini;

        for(cont=1; cont<=tamanho; cont++){
                                           fprintf(saida, "%0.1f\n", *vt2);
                                           vt2++;
                                           }             

   fclose(entrada);
   fclose(saida);

   printf("Sua saida:");
   print(nomeSaida);

   compararSaidaResposta();

   system("PAUSE");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.