arduino ค้นหาค่าใน array อย่างไร?

Started by oldsnake13, May 17, 2015, 12:21:35 PM

Previous topic - Next topic

oldsnake13

สวัสดีครับ
ผมไม่ค่อยเก่งโปรแกรม C++ มีปัญหาอยากจะถามดังนี้ครับ
ผมต้องการจะค้นหาค่าใน array สอง array ตัวอย่างเช่น
table1 [5] = {1,2,3,4,5}
table2 [5] = {10,20,30,40,50}
เมื่อรับค่า 30 เข้ามาแล้ว ค้นหาค่าจากตารางที่2(teble2)ที่อยู่ในตำแหน่งที่ 2 เมื่อได้แล้วก็หาตำแหน่ง(index =2 )ที่ค่าๆนั้นอยู่เพื่อที่จะนำค่า index = 2 ไปชี้ค่าในtable1
ประมาณนี้ครับผมทดลองเขียนแล้วยังไม่ได้สักทีครับ

crywolf

for( i = 0; i < 5; i++ )
{
  if( table2[i] == receive )
  {
    data = table1[i];
    break;
  }
}

oldsnake13

Quote from: crywolf on May 17, 2015, 12:45:38 PM
for( i = 0; i < 5; i++ )
{
  if( table2[i] == receive )
  {
    data = table1[i];
    break;
  }
}

ขอบคุณครับ
แล้วถ้ามันมีสัก100 ค่า ผมกลัวเสียเวลาไม่อยากให้มันเริ่มที่ 0 ให้เริ่มที่ค่านะขณะนั้นเลยอย่างเช่น ค้นครั้งแรก 30 เจอแล้ว พอครั้งที่สอง ค่า = 99 ก็ให้เริ่มที่ 30 เลย พอครั้งต่อไปที่ 70 ก็ให้เริ่มที่ 99 ลดลงมาจนเจอ 70 ครับต้องทำอย่างไรครับ


crywolf

table1 กับ table2 มีรูปแบบความสัมพันธ์ กันยังไงครับ บางทีแค่ใส่สูตรก็ได้แล้ว
เอา table ที่ใช้งานจริงๆมาดูดีกว่าครับ หรือบอกที่มาที่ไปของ สิ่งที่ต้องการทำก็จะดีมาก

oldsnake13

Quote from: crywolf on May 17, 2015, 04:56:12 PM
table1 กับ table2 มีรูปแบบความสัมพันธ์ กันยังไงครับ บางทีแค่ใส่สูตรก็ได้แล้ว
เอา table ที่ใช้งานจริงๆมาดูดีกว่าครับ หรือบอกที่มาที่ไปของ สิ่งที่ต้องการทำก็จะดีมาก
table 1 คือค่าเวลาเป็น us table 2 คือจำนวนรอบพัดลมน่ะครับ ผมต้องการที่จะคำนวณรอบพัดลมแล้วเอาไปหาคาบเวลาที่ต้องการเช่น คำนวณได้ 800 index ไปmapหาค่าในตารางน่ะครับ

crywolf

ถ้าข้อมูลใน table เรียงลำดับ ใช้ Binary Search ก็ได้ครับ


#include <stdio.h>

int main()
{
   int c, first, last, middle, n, search, array[100];

   printf("Enter number of elements\n");
   scanf("%d",&n);

   printf("Enter %d integers\n", n);

   for (c = 0; c < n; c++)
      scanf("%d",&array[c]);

   printf("Enter value to find\n");
   scanf("%d", &search);

   first = 0;
   last = n - 1;
   middle = (first+last)/2;

   while (first <= last) {
      if (array[middle] < search)
         first = middle + 1;   
      else if (array[middle] == search) {
         printf("%d found at location %d.\n", search, middle+1);
         break;
      }
      else
         last = middle - 1;

      middle = (first + last)/2;
   }
   if (first > last)
      printf("Not found! %d is not present in the list.\n", search);

   return 0;   
}


http://www.programmingsimplified.com/c/source-code/c-program-binary-search

oldsnake13

ได้แล้วครับ ขอบคุณมาก

int table1[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
int table2[] = {0,100,101,102,103,104,105,106.107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130};
int Data      = 0;
int val  =0;
int val2  =0;
int i = 0;
String inString = "";
byte intBuffer[12];
String intData = "";
int delimiter = (int) '\n';
int  k= 0;
void setup() {
  Serial.begin(9600);
Size();
}

void loop() {
  read_int();
 
  mapping();
   delay(1000);
}
int  mapping(){

  if (i < 0){i=0;}
  //if (i > k){i=k;}
  int j;
  if ( Data > table2[i] ){
  for (i = j; i < k ; i++){

     if (Data == table2[i]){
      val = table1[i];   
      val2 = table2[i];
      j = i;
      break;
      }
  }
  }
 
   
   if (Data < table2[i] ){
   for (; i < k ; i--){
     if (Data <= 0){ i = 0; val = table1[i];  val2 = table2[i]; j = i;  break;}
     if (Data == table2[i]){
      val = table1[i];   
      val2 = table2[i];
      j = i;
      break;
      }
  }
  }
   
 
 
   
    Serial.print("Data");
    Serial.print (" "); 
    Serial.print (Data);
    Serial.print (" ");
    Serial.print ("TIME");
    Serial.print (" ");
    Serial.print (val);
    Serial.print (" ");
    Serial.print ("RPM");
    Serial.print (" ");
    Serial.print (val2);
    Serial.print (" ");
    Serial.println (i);
   
   
   

     
 
}
void read_int()
{
  // Read serial input:
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char
      // and add it to the string:
      inString += (char)inChar;
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
     // Serial.print("Value:");
      Data =(inString.toInt());
     // Serial.print("String: ");
     // Serial.println(inString);
      // clear the string for new input:
      inString = "";
    }
  }
}
void Size()
{
   k = sizeof(table2)/ sizeof(int);
   
}