Вычисление скалярного произведения и манипуляции со строками в C - PullRequest
0 голосов
/ 11 сентября 2018

Для домашней работы мне нужно создать программу, которая:

  1. Получить 2 строки (в формате char, макс. 100 символов) из scanf (например: {1, 2,3, 4} и {0,1, 2,0})

  2. Возьмите числа между пробелами (сейчас я использую strtok)

  3. Преобразовать их в double (для этого я использую strtod)

  4. Сделать скалярное произведение

Прежде чем скопировать мой настоящий код, я хочу спросить вас, ребята, знаете ли вы, как легко освоить этот тип манипуляции;мой экзамен будет таким: беру струны, разбираю их, но мне очень сложно научиться.И человек, и моя книга упрощены, и я не могу понять.

Спасибо всем, я надеюсь, что вы можете помочь мне, прежде чем я определенно буду без ума от этого.

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

  //TODO TAKE ARGOMENTS
  //TODO EXTRACT THE NUMBERS
  //TODO CONVERT THEM TO DOUBLE
  //TODO DO THE SCALAR PRODUCT

  //prototypes:

  unsigned manipulate_string(char vet[100]);

  //functions:

  unsigned manipulate_string(char vet[100]){
      const char s[4] = " ,{}";
      double vfinal[100];
      char *token;
      char *stringPtr;
      char *todPtr

      //get the first token

     token = strtok(vet, s);

     //walk through other tokens
     while( token != NULL ) {
         printf( " %s\n", token );

         token = strtok(NULL, s);

         double d = strtod(vet, &stringPtr);
         vfinale[100]=d

         return d;
     }
}

 int main () {
     char vet1[100];
     char vet2[100];
     double vet1f[100];
     double vet2f[100];
     const char s[4] = " ,{}";
     char *token;
     printf("inseert first vector\n");
     scanf("%[^\n\r]", vet1);
     printf("insert second vector\n");
     scanf("%[^\n\r]", vet2);

     vet1f[100]=manipulate_stringvet1[100]);
     vet2f[100]=manipulate_string(vet2[100]);

     printf("the first one is\n",vet1f);
     printf("the second one is\n",vet2f);


}

Теперь код предназначен только для просмотра манипуляции со строкой, после, не думаю, что яможет возникнуть проблема с выполнением функции, которая выполняет скалярное произведение.

Спасибо, еще раз, за ​​помощь и время, потраченное на это.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Даже если я исправлю проблемы, я просто не могу понять, почему strtod не преобразует мою строку. Вот исправленный код

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

//TODO TAKE ARGOMENTS
//TODO EXTRACT THE NUMBERS
//TODO CONVERT THEM TO DOUBLE
//TODO DO THE SCALAR PRODUCT


//prototipi

unsigned manipulate_string(char vet1[], char vet2[]);
//funzioni

unsigned manipulate_string(char vet1[], char vet2[]){
  const char s[4] = " ,{}";
  double vfinale1[100];
  double vfinale2[100];
  char *token1;
  char *token2;
  char *stringPtr1;
  char *stringPtr2;
  int c1=0, c2=0;

//get the first token

token1 = strtok(vet1, s);

//walk through other tokens
while( token1 != NULL ) {
   printf( " %s\n", token1);

   token1 = strtok(NULL, s);

}


token2 = strtok(vet2, s);

while( token2 != NULL ) {
   printf( "%s\n", token2);

   token2 = strtok(NULL, s);
}

 double d = strtod(vet1, &stringPtr1);
 vfinale1[c1]=d;

 double u = strtod(vet2, &stringPtr2);
 vfinale1[c2]=u;

 return *vfinale2;
 return *vfinale1;
}


int main(int argc, char const *argv[]){
   char vet1[100];
   char vet2[100];
   double vfinale2[100];
   double vfinale1[100];

   printf("insert first vector\n");
   scanf("%[^\n\r]", vet1);
   printf("insert second vector\n");
   scanf(" %[^\n\r]", vet2);

   manipulate_string(vet1, vet2);


   printf("the first one is %.2f\n", *vfinale1);

   printf("the second one is %.2f\n", *vfinale2);

}

выход:

insert first vector
1,2,3,4
insert second vector
5,6,7,8
 1
 2
 3
 4
 5
 6
 7
 8
 the first one is 0.00
 the second one is 0.00
0 голосов
/ 11 сентября 2018

Много проблем в вашем коде:

  • некоторые переменные написаны неправильно: vfinal // vfinale
  • пропущены некоторые точки с запятой: char *todPtr
  • некоторые скобки отсутствуют: vet1f[100]=manipulate_stringvet1[100]);

Но, даже если эти небольшие проблемы будут исправлены, вам нужно понимать манипулирование массивами:

  • double vfinal[100]; объявляет массив 100 double
  • vfinale[100] = d; установить значение 101th элемента массива равным d: вы пытаетесь записать вне массива.

У вас та же проблема (4 раза) в следующих строках:

vet1f[100]=manipulate_string(vet1[100]);
vet2f[100]=manipulate_string(vet2[100]);

И у вас есть еще одна проблема: функция manipulate_string делает не то, что вы хотите: вы делаете так, чтобы она возвращала только один unsigned char, в то время как вы хотите изменить массив vet1f (или vet2f) ( который должен был быть передан в качестве параметра)


Если мы возьмем этот кусок кода:

 token = strtok(vet, s);

 while( token != NULL ) {
     token = strtok(NULL, s);
     double d = strtod(vet, &stringPtr);
     vfinale[100]=d

     return d;
 }

Мы видим две проблемы:

  • Сначала return d; находится внутри цикла, делая выход до того, как последний токен будет прочитан

  • В блоке цикла (между {}) вы читаете новый токен перед использованием предыдущего, таким образом:

    • Жетон кулака потерян
    • Когда token будет NULL, оно будет передано strtod, и это не то, что вы хотите.

У большинства компиляторов может быть включено предупреждение, попробуйте использовать -Wall (GCC, clang, icc ...) или / W4 (visual studio)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...