2016-04-24 4 views
-1

Этот код позволяет печатать отброшенные идентификаторы учащихся в определенном диапазоне между началом и концом, а когда я запускаю его, программа вылетает .. любые предложения? вход массив идентификаторов [12001,12002,12003,12006] желаемых результатов: 12004, 12005 // отброшенные идентификаторы между 12001 и 12006issue with For loop C++

void dropped_students(vector<string> students_id){ 
    // creating array of numbers between max and min 
    int start = min_id(students_id) , end = max_id(students_id); 
    vector<int> numbers; 
    string diff_number; 
    for (int i = start ; i <= end ; i++) 
     numbers.push_back(i); 
    // finding the drooped numbers 
    for (int i = 0 ; i < numbers.size(); i++){ 
     int found = 0; 
     int num = atof(students_id[i].c_str()); 
     for (int j = 0 ; j < students_id.size() ; j++){ 
      int stu_id = atof(students_id[j].c_str()); 
      if (stu_id == num) 
       found = 1;break; 
     } 
     if (found == 0) 
      {cout<< num << endl;} 
    }  
} 
+4

«какие-то предложения? " Вы должны опубликовать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и описать желаемое поведение, чтобы публиковать вопросы здесь. – MikeCAT

+0

Ваш код плохо отформатирован .. и вы не выразили, какой ваш намеченный результат и где вы застряли. – Tejendra

ответ

0

у Вас есть больше пунктов в «номера», чем в «studends», тем не менее вы используете «students_id [i]», где «i» - это индекс в «numbers» =>, это вне диапазона.

Я думаю, что эта линия

int num = atof(students_id[i].c_str()); 

должен быть

int num = numbers[i]; 
0

Я хотел бы сделать это таким образом, чтобы оптимизировать функцию:

  1. Сортировки массив по числовому значению студенческого билета
  2. Сканирование через массив учеников, поиск пробелов и вывод их

Функция может выглядеть следующим образом:

#include <algorithm> 

bool CompareIDs(string students_id1, string students_id2) { 
    return atoi(students_id1.c_str()) < atoi(students_id2.c_str()); 
} 

void dropped_students(vector<string> students_id){ 
    // creating array of numbers between max and min 
    sort(students_id.begin(), students_id.end(), CompareIDs); 
    bool first = true; 
    int last; 
    for (auto strid : students_id) { 
     int id = atoi(strid.c_str()); 
     if (!first) { 
      if (id>last+1) 
      for (int i = last + 1; i < id; i++) 
       cout << i << endl; 
     } 
     last = id; 
     first = false; 
    } 
} 

Я тестировал его с этой основной функции:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<string> students_id; 
    students_id.push_back("12001"); 
    students_id.push_back("12002"); 
    students_id.push_back("12003"); 
    students_id.push_back("12006"); 
    dropped_students(students_id); 
} 

и напечатал:

12004 
12005