Receive user vector in C

1

Hello everyone. I need help getting a vector of integers (separated by spaces) from the user. Here is my code:

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

/*Observacoes:
1, se a ordem nao e decrescente
-1, se a ordem nao e crescente
0, se nao ha ordem
99 se for constante*/

//declaracao de variaveis globais
int t; //tamanho do vetor
int* v; //ponteiro para vetor de inteiros

//prototipo funcao
int verificaOrdem(int* v);

int main(){
  //Receber vetor de tamanho 4 como input

  int rc = verificaOrdem(v); //chamada de funcao
  printf("\n Retorno da funcao verificaOrdem: %d \n", rc);

  return 0;  /*Isso serve para informar ao compilador que ocorreu tudo certo com a função main(). Se main retornasse um outro valor diferente de 0 haveria um problema em sua execução, que seria informada ao compilador*/
}

int verificaOrdem(int* v){
  bool aumentando = false;
  bool diminuindo = false;
  for(int i = 0; i < 4; ++i ){
    if(v[i] > v[i+1]) diminuindo = true;
    if(v[i] < v[i+1]) aumentando = true;
    if(aumentando && diminuindo) return 0;
  }
  if(aumentando) return 1;
  if(diminuindo) return -1;
  return 99;
}
    
asked by anonymous 10.08.2017 / 18:54

1 answer

1

That's until you gave a little work to do, but you're here:

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

/*Observacoes:
1, se a ordem nao e decrescente
-1, se a ordem nao e crescente
0, se nao ha ordem
99 se for constante*/

void separarInteiros(int *destino, int tamanho, char *entrada);
int verificaOrdem(int* v, int tamanho);

int main() {
  int v[4];

  char entrada[100];
  fgets(entrada, 100, stdin);
  separarInteiros(v, 4, entrada);
  int rc = verificaOrdem(v, 4);
  printf("\n Retorno da funcao verificaOrdem: %d \n", rc);

  return 0;
}

void separarInteiros(int *destino, int tamanho, char *entrada) {
  char *resto = entrada;
  for (int contador = 0; contador < tamanho; contador++) {
    int final = 0;
    while (1) {
      if (resto[final] == '
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

/*Observacoes:
1, se a ordem nao e decrescente
-1, se a ordem nao e crescente
0, se nao ha ordem
99 se for constante*/

void separarInteiros(int *destino, int tamanho, char *entrada);
int verificaOrdem(int* v, int tamanho);

int main() {
  int v[4];

  char entrada[100];
  fgets(entrada, 100, stdin);
  separarInteiros(v, 4, entrada);
  int rc = verificaOrdem(v, 4);
  printf("\n Retorno da funcao verificaOrdem: %d \n", rc);

  return 0;
}

void separarInteiros(int *destino, int tamanho, char *entrada) {
  char *resto = entrada;
  for (int contador = 0; contador < tamanho; contador++) {
    int final = 0;
    while (1) {
      if (resto[final] == '%pre%' && final == 0) return;
      if (resto[final] == ' ' || resto[final] == '%pre%') {
        resto[final] = '%pre%';
        if (final != 0) destino[contador] = atoi(resto);
        resto = &(resto[final + 1]);
        if (final != 0) {
          final = 0;
          break;
        }
      } else {
        final++;
      }
    }
  }
}

int verificaOrdem(int* v, int tamanho) {
  bool aumentando = false;
  bool diminuindo = false;
  for (int i = 0; i < tamanho - 1; ++i) {
    if (v[i] > v[i + 1]) diminuindo = true;
    if (v[i] < v[i + 1]) aumentando = true;
    if (aumentando && diminuindo) return 0;
  }
  if (aumentando) return 1;
  if (diminuindo) return -1;
  return 99;
}
' && final == 0) return; if (resto[final] == ' ' || resto[final] == '%pre%') { resto[final] = '%pre%'; if (final != 0) destino[contador] = atoi(resto); resto = &(resto[final + 1]); if (final != 0) { final = 0; break; } } else { final++; } } } } int verificaOrdem(int* v, int tamanho) { bool aumentando = false; bool diminuindo = false; for (int i = 0; i < tamanho - 1; ++i) { if (v[i] > v[i + 1]) diminuindo = true; if (v[i] < v[i + 1]) aumentando = true; if (aumentando && diminuindo) return 0; } if (aumentando) return 1; if (diminuindo) return -1; return 99; }

To read the entry, I used the fgets function.

The separarInteiros function is responsible for making the spell happen. The for runs from 0 to 3, each iteration to assemble a number. The while goes through the letters until it finds an empty space, substitutes it with atoi , isolating a word from the rest of the entry. Then, the verificaOrdem function is used to convert the word to a number and the analysis follows with the rest of the entry.

There was a bug in your tamanho - 1 function. It ran through items 0 through 3. This means that item 3 would be compared to item 4, which is already outside the array. The solution is to go from 0 to 3 (or in the case of the code I posted, from 0 to %code% ).

    
11.08.2017 / 01:20