Answer:
main.cpp
------------------------------------------
#include <iostream>
#include <iomanip>
//#include "/home/cs340/progs/16f/p5/prog5.h"
#include "prog5.h"
using std::cout; using std::endl; using std::cin;
using std::advance;
const int TAGS_LINE = 12;
int main() {
in_args josephusStruct; //creates a struct to hold values for Josephus Problem
vector<string> josephusVec; //creates a vector to hold the names for Josephus Problem
unsigned cnt = 1; //count of number of passes
cout << "\\Number of soldiers? 41"; //Sets values to corresponding members of the struct
josephusStruct.N = 41;
cout << "\\Index for emlination? 3";
josephusStruct.M = 3;
cout << "\\Index for printing? 7 \\";
josephusStruct.K = 7;
init_vals(josephusVec, josephusStruct); //calles function to fill up vector
print_vector(josephusVec, cnt); //prints the intital vector with all names before elimation begins
josephusStruct.M -= 1; //adjusts elimation index
auto indexIt = josephusStruct.M % josephusVec.size(); //iterator to be used for index elimation
while(josephusVec.size() >1) josephusVec.size() == 1) //prints out vector with the header every Kth time
print_vector(josephusVec, cnt);
cnt++; //increment number of passes
cout << endl;
return 0;
}
void init_vals(vector<string>& vec, in_args& in) {
vec.resize(in.N);
generate(vec.begin(), vec.end(), SEQ(in.N));
}
void print_vector(const vector<string>& vec, const unsigned& cnt) {
vector<string>::const_iterator vecIt; //iterator to print items in vector
int itemCnt = 0; //count for items per line
if(cnt < 2) { //prints out the intial group header
cout << "\\ Initial group of soldiers \\"
<< "-------------------------" << endl;
}
else { //prints out after elimation group header
cout <<"\\ After emliminating the " << cnt << "th soldier" << endl
<< "------------------------------------" << endl;
}
for(vecIt = vec.begin(); vecIt != vec.end(); vecIt++) { //for loop to iterate thrpugh items in vector and print them
if(itemCnt % TAGS_LINE == 0 && itemCnt != 0) //prints a new line once desiered number of items per line is reached
cout << endl;
cout << *vecIt << " ";
itemCnt++;
}
cout << endl;
}
------------------------------------------------------------------------------------------------
pro5.h
-----------------------------------------
#ifndef H_PROG5
#define H_PROG5
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define NO_LETS 26 // no of letters in English alphabet
#define NO_ITEMS 12 // no of items printed on single line
// struct for input arguments
struct in_args {
unsigned N, // total no of soldiers
M, // count to eliminate soldier
K; // frequency of printouts
};
// class to generate name tags for soldiers
class SEQ {
private:
string id; // name tag for soldier
unsigned size, nd; // no of soldiers, no of digits in name tags
// returns no of digits in name tags
unsigned find_nd ( const double& sz ) {
if ( ( sz / NO_LETS ) <= 1 ) return 2;
else return ( find_nd ( sz / NO_LETS ) + 1 );
}
public:
// constructor for name-tag generator
SEQ ( const unsigned& s = 1 ) : size ( s ) {
double sz = ( double ) size / 9; nd = find_nd ( sz );
id = string ( nd, 'A' ); id [ nd - 1 ] = '1';
}
// returns next name tag in sequence
string operator ( ) ( ) {
string tmp = id; int i = nd - 1;
if ( id [ i ] < '9' ) id [ i ]++;
else {
id [ i ] = '1'; bool flag = true;
for ( i--; i >= 0 && flag; i-- )
if ( id [ i ] < 'Z' ) { id [ i ]++; flag = false; }
else id [ i ] = 'A';
}
return tmp;
}
};
// reads and initializes all input arguments
//void init_vals ( vector <string>&, unsigned&, unsigned&, unsigned& );
void init_vals ( vector <string>&, in_args& );
// prints all name tags for remaining soldiers after elimination
void print_vector ( const vector <string>&, const unsigned& );
#endif