これは本当にループのために私を投げています。他の構造体の内部にある構造体の配列のメンバー変数は、参照によって渡されません。
私は2つの構造体employeeとdepartmentを持っています。部門構造内には、従業員構造の配列があります。
従業員を部門(add_empl_to_dept())に追加する関数を呼び出すと、部門の従業員配列(empl_in_dept [])に値が正しく保存されますが、関数のスコープ内でのみ有効です。プログラムがメインに戻ると、値は失われます。
は、なぜこの出来事で、どのように場合は、それを修正することができますか?
ここでのコードの非常識な長さについては申し訳ありません。全体をコピー&ペーストするほうがはるかに簡単でした。これが問題なのかどうか教えてください。
ありがとうございました!
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
struct employee
{
int eID;// stores the employee ID number
char fName[40]; //stores the employee's first
char lName[40];//stores the employee's last name
float salary;//stores the employee's salary
};
// structure for storing department information
struct department
{
int dID;//stores the department's ID number
char dName[40];//stores the name of the department
int empl_in_dept_count;// stores how many employees have been added to the department
employee empl_in_dept[10];//stores upto 10 employees
};
bool dCheck(department dList[], int dCount, int dID);
bool eCheck(employee eList[], int eCount, int eID);
bool empl_in_dept_check(department dList[], int dCount, employee eList[], int eID, int dID);
void addDepartment(department dList[], int &dCount);
void addEmployee(employee eList[], int &eCount);
void add_empl_to_dept(department dList[], int dCount, employee eList[], int eCount);
void ePrint(employee eList[], int eCount);
void dPrint(department dList[], int dCount, employee eList[]);
void e_in_dPrint(department dList[], int dCount, employee eList[]);
void average(department dList[], int dCount, employee eList[]);
void save(department dList[], int dCount, employee eList[], int eCount);
void load(department dList [], int &dCount, employee eList[], int &eCount);
void printMenu();
int main()
{
employee eList[30];//stores individual employee information in each index
int eCount = 0; //stores total number of employees added. Used as an index number for the eList array when adding employees
department dList[10];//stores the individual department information in each index.
int dCount = 0; //stores total number of departments added. Used as an index number for the dList array when adding departments
//initialize all dList's empl_in_dept_count variables to zero
for (int i = 0; i < 10; i++)
{
dList[i].empl_in_dept_count = 0;
}
//do-while loop based on the bool variable, run. When run = false, the program ends.
do
{
printMenu();//prints out the menu and prompts the user for a choice.
do// check for a valid menu choice
{
cin >> menu;//reads in the user's menu choice
cout << "----------------------------------------------------------" << endl;
if (menu <1 || menu > 10)
{
cout << "That is not a valid selection." << endl;
printMenu();//prints out the menu and prompts the user for a choice.
}
}while(menu <1 || menu > 10);
//switch statement based on the variable, menu.
switch(menu)
{
case 1://calls the addDepartment function
addDepartment(dList, dCount);
break;
case 2://calls the addEmployee function
addEmployee(eList, eCount);
break;
case 3://calls the add_empl_to_dept function
add_empl_to_dept(dList, dCount, eList, eCount);
break;
case 4://calls the ePrint function
ePrint(eList, eCount);
break;
case 5://calls the dPrint function
dPrint(dList, dCount, eList);
break;
case 6://calls the e_in_dPrint function
e_in_dPrint(dList, dCount,eList);
break;
case 7://calls the average function
average(dList, dCount, eList);
break;
case 8://calls the save function
save(dList, dCount, eList, eCount);
break;
case 9://calls the load function
load(dList, dCount, eList, eCount);
break;
case 10://sets run to false and ends the program
run = false;
break;
}
}while(run);
return 0;
}
/*
============================================================================
Function : dCheck
Parameters : department dList, int dCount, and int dID
Return : True or false depending on if a department exists
Description : This function checks a user entered department ID against the dList arrays previously
entered dIDs to see if the ID number has already been entered.
============================================================================
*/
bool dCheck(department dList[], int dCount, int dID)
{
//Cycles through the dList array to compaire the user entered dID number to the dList.dID number
for(int i = 0; i <= dCount; i++)
{
if (dList[i].dID != dID && i == dCount)//If there is no match, the function returns false
{
return false;
}
if(dList[i].dID == dID)//If there is a match, the function returns true
{
return true;
}
}
}
/*
============================================================================
Function : eCheck
Parameters : employee eList, int eCount, and int dID
Return : True or false depending on if a employee exists
Description : This function checks a user entered employee ID against the eList arrays previously
entered eIDs to see if the ID number has already been entered.
============================================================================
*/
bool eCheck(employee eList[], int eCount, int eID)
{
//Cycles through the eList array to compaire the user entered eID number to the eList.eID number
for(int i = 0; i <= eCount; i++)
{
if (eList[i].eID != eID && i == eCount)//If there is no match, the function returns false
{
return false;
}
if(eList[i].eID == eID)//If there is a match, the function returns true
{
return true;
}
}
}
/*
============================================================================
Function : empl_in_dept_check
Parameters : department dList, int dCount, employee eList, int eID, int dID
Return : True or false depending on if a employee exists in a department
Description : This function checks a user entered employee ID against the dList arrays previously
entered eIDs to see if the ID number has already been entered into the department. This function assumes
that the dCheck and dCheck fxs have already been called and returned true.
============================================================================
*/
bool empl_in_dept_check(department dList[], int dCount, employee eList[], int eID, int dID)
{
//Cycles though the dList indexes to get to the correct user entered dID
for (int i = 0; i < dCount; i++)
{
if(dList[i].dID == dID)//Finds the user entered dID
{
/*
empl_in_dept is an array of eList indexes. This
for-loop cycles through dList's empl_in_dept[j] indexes to check the user entered eID number
against a eList.eID.
*/
for (int j = 0; j <= dList[i].empl_in_dept_count; j++)
{
if(dList[i].empl_in_dept_count == 0)//checks to see if no employees have been added to the department
{
return false;
}
if(dList[i].empl_in_dept[j].eID != eID && j == dList[i].empl_in_dept_count)//check to see if the user entered eID already exists in the department
{
return false;
}
if(dList[i].empl_in_dept[j].eID == eID)//if there is a match, return true
{
return true;
}
}
}
}
}
/*
============================================================================
Function : addDepartment
Parameters : department dList[], int &dCount
Return : void fx
Description : This function adds department info to the dList array after checking if it already exists. It uses
dCount to specify what dList index to store info in
============================================================================
*/
void addDepartment(department dList[], int &dCount)
{
int dID;//stores a department ID number to be checked and/or saved
cout << "Enter in a department ID number: ";
cin >> dID;
cout << endl;
if(dCheck(dList, dCount, dID))//check to see if the department already exists, true returns out of the function
{
cout << "This department already exists." << endl;
cout << endl;
return;
}
else//if the department does not exits, add it to the dList and add a department name as well
{
dList[dCount].dID = dID;//stores the user entered department number
cout << "Enter in a department name: ";
cin.ignore();//discards return carrage
cin.getline(dList[dCount].dName, 40, '\n');//stores the user entered department name
cout << endl;
cout << "Department " << dID << " has been added." << endl;
dCount += 1;//increment the dCount by one
cout << endl;
return;
}
}
/*
============================================================================
Function : addEmployee
Parameters : employee eList[], int &eCount
Return : void fx
Description : This function adds employee info to the eList array after checking if it already exists. It uses
eCount to specify what eList index to store info in
============================================================================
*/
void addEmployee(employee eList[], int &eCount)
{
int eID;//store the user entered employee ID number
cout << "Enter in employee ID number: ";
cin >> eID;
cout << endl;
if(eCheck(eList, eCount, eID))//checks to see if the employee already exists, true returns out of the function
{
cout << "This employee already exists" << endl;
return;
}
else//if the employee does not exist, add employee info to eList
{
eList[eCount].eID = eID;
cout << "Enter employee first name: ";
cin.ignore();//discards return carrage
cin.getline(eList[eCount].fName, 40, '\n');//saves employee's first name
cout << endl;
cout << "Enter employee last name: ";
cin.getline(eList[eCount].lName, 40, '\n');//saves employee's last name
cout << endl;
cout <<"Enter employee salary: ";
cin >> eList[eCount].salary;//saves employee's salary
cout << endl;
cout << "Employee " << eID << " has been added." << endl;
eCount +=1;//increment eCount by one
cout << endl;
return;
}
}
/*
============================================================================
Function : add_empl_to_dept
Parameters : department dList[], int dCount, employee eList[], int eCount
Return : void fx
Description : This function adds an employee to a department. It stores the employee in the empl_in_dept array
as a pointer to the address of an eList index.
============================================================================
*/
void add_empl_to_dept(department dList[], int dCount, employee eList[], int eCount)
{
int eID, dID;//these variables store the user entered employee and department ID
cout << "Enter in department ID number: ";
cin >> dID;
cout << endl;
if(dCheck(dList, dCount,dID))//checks if the department exists, if false, returns out of the function
{
cout << "Enter in an employee ID number: ";
cin >> eID;
cout << endl;
if(eCheck(eList, eCount, eID))// check if an employee exists, if false, returns out of the function
{
if(empl_in_dept_check(dList, dCount, eList, eID, dID))//checks if an employee is already added to a department, if true, returns out of the function.
{
cout << "The employee has already been added to the department." << endl;
return;
}
else//adds the user entered eID to the user entered dID
{
//for-loop cycles through dList searching for the user entered dID
for(int i = 0; i <= dCount; i++)
{
if(dList[i].dID == dID)//stops the for-loop at the user entered dID
{
//for-loop cycles through eList searching for the user entered eID
for(int j = 0; j <= eCount; j++)
{
if(eList[j].eID == eID)// stops the for-loop at the user entered eID
{
dList[i].empl_in_dept[dList[i].empl_in_dept_count].eID = eList[j].eID;
strcpy(dList[i].empl_in_dept[dList[i].empl_in_dept_count].fName, eList[j].fName);
strcpy(dList[i].empl_in_dept[dList[i].empl_in_dept_count].lName, eList[j].lName);
dList[i].empl_in_dept[dList[i].empl_in_dept_count].salary = eList[j].salary;
cout << dList[i].empl_in_dept[dList[i].empl_in_dept_count].eID << endl
<< dList[i].empl_in_dept[dList[i].empl_in_dept_count].fName << endl
<< dList[i].empl_in_dept[dList[i].empl_in_dept_count].lName << endl
<< dList[i].empl_in_dept[dList[i].empl_in_dept_count].salary << endl;
cout << "Employee " << eID << " has been added to department " << dID << "." << endl;
dList[i].empl_in_dept_count += 1;//increments the department's employee count by one
cout << endl;
return;
}
}
}
}
}
}
else
{
cout << "The employee does not exist." << endl;
return;
}
}
else
{
cout << "The department does not exist" << endl;
return;
}
}
/*
============================================================================
Function : ePrint
Parameters : employee eList, int eCount
Return : void
Description : This function prints out a list all employee IDs, first and last names, and salaries
============================================================================
*/
void ePrint(employee eList[], int eCount)
{
printf("----------------------------------------------------------\n");
if(eCount == 0)//if there are no employees, prints None and returns out of the function
{
printf("Empl ID | First Name Last Name | Salary\n");
printf("----------------------------------------------------------\n");
printf("None\n");
printf("\n");
return;
}
else
{
printf("Empl ID | First Name Last Name | Salary\n");
printf("----------------------------------------------------------\n");
//for-loop cycles through the eList array and print out employee info for each index
for(int i = 0; i < eCount; i++)
{
printf("%d %s %s %.2f \n", eList[i].eID, eList[i].fName, eList[i].lName, eList[i].salary);
}
printf("\n");
return;
}
}
/*
============================================================================
Function : dPrint
Parameters : department dList[], in dCount, employee eList[]
Return : void
Description : This function prints out a list all department IDs, department Names, and employees in the department
============================================================================
*/
void dPrint(department dList[], int dCount, employee eList[])
{
printf("----------------------------------------------------------\n");
if(dCount == 0)//if there are no departments, prints None and returns out of the function
{
printf("Dept ID | Dept Name\n");
printf("----------------------------------------------------------\n");
printf("None\n");
printf("\n");
return;
}
else
{
//for-loop cycles through the dList array and print out department info for each index
for(int i = 0; i < dCount; i++)
{
printf("Dept ID | Dept Name\n");
printf("----------------------------------------------------------\n");
printf("%d %s\n", dList[i].dID, dList[i].dName);
printf("----------------------------------------------------------\n");
printf("Empl ID | First Name Last Name | Salary\n");
printf("----------------------------------------------------------\n");
if(dList[i].empl_in_dept_count == 0)//check to see if there are no employees in the department
{
printf("None\n");
printf("\n");
}
else//prints out employees in department
{
//for-loop cycles through the empl_in_dept indexes and prints out employee info for each department
for(int j = 0; j < dList[i].empl_in_dept_count; j++)
{
printf("%d %s %s %.2f \n", dList[i].empl_in_dept[dList[i].empl_in_dept_count].eID, dList[i].empl_in_dept[dList[i].empl_in_dept_count].fName, dList[i].empl_in_dept[dList[i].empl_in_dept_count].lName, dList[i].empl_in_dept[dList[i].empl_in_dept_count].salary);
}
cout << endl;
}
}
return;
}
}
/*
============================================================================
Function : e_in_dPrint
Parameters : department dList[], in dCount, employee eList[]
Return : void
Description : This function prints out a list all employees in a department
============================================================================
*/
void e_in_dPrint(department dList[], int dCount, employee eList[])
{
int dID; //stores the user entered department ID number
cout << "Enter in a department ID number: ";
cin >> dID;
cout << endl;
if(dCheck(dList, dCount, dID))//check to see if the department exists
{
//for-loop cycles through the dList to reach the user entered dID
for(int i = 0; i < dCount; i++)
{
if(dList[i].dID == dID)//stops the for-loop at the user entered dID
{
printf("Dept ID | Dept Name\n");
printf("----------------------------------------------------------\n");
printf("%d %s\n", dList[i].dID, dList[i].dName);
printf("----------------------------------------------------------\n");
printf("Empl ID | First Name Last Name | Salary\n");
printf("----------------------------------------------------------\n");
if(dList[i].empl_in_dept_count == 0)//check to see if there are no employees in the department
{
printf("None\n");
printf("\n");
return;
}
else//prints out employees in department
{
//for-loop cycles through the empl_in_dept indexes and prints out employee info for each department
for(int j = 0; j < dList[i].empl_in_dept_count; j++)
{
printf("%d %s %s %.2f \n", dList[i].empl_in_dept[dList[i].empl_in_dept_count].eID, dList[i].empl_in_dept[dList[i].empl_in_dept_count].fName, dList[i].empl_in_dept[dList[i].empl_in_dept_count].lName, dList[i].empl_in_dept[dList[i].empl_in_dept_count].salary);
}
cout << endl;
return;
}
}
}
}
else
{
cout << "That department does not exist." << endl;
return;
}
}
/*
============================================================================
Function : average
Parameters : department dList[], employee eList[]
Return : void
Description : This function prints out an average of employee salaries in a department
============================================================================
*/
void average(department dList[], int dCount, employee eList[])
{
int dID;// stores the user entered deparment ID number
int sum = 0; //stores the sum of the department employee's salary
float average;
cout << "Enter in a department ID number: ";
cin >> dID;
cout << endl;
if(dCheck(dList, dCount, dID))//check to see if the department exists, returns out of the function if it does not
{
//for-loop cycles through dList to find the user entered dID
for(int i = 0; i < dCount; i++)
{
if(dList[i].dID == dID)//stops the for-loop at the user entered dID
{
//for-loop cycles through the department's employees and adds up their salaries
for(int j = 0; j < dList[i].empl_in_dept_count; j++)
{
sum = (dList[i].empl_in_dept[j].salary + sum);
}
average = sum/dList[i].empl_in_dept_count;
printf("Dept ID | Dept Name | Average\n");
printf("----------------------------------------------------------\n");
printf("%d %s %.2f\n", dList[i].dID, dList[i].dName, average);
cout << endl;
return;
}
}
}
else
{
cout << "That department does not exist." << endl;
}
}
/*
============================================================================
Function : save
Parameters : department dList[], int dCount, employee eList[], int eCount
Return : void
Description : This function all department and employee information into a file
============================================================================
*/
void save(department dList[], int dCount, employee eList[], int eCount)
{
FILE *fp;//file pointer
char fileName [20];
cout << "Enter in a name for the file to save to: ";
cin.ignore();
cin.getline(fileName, 20, '\n');// stores a user defined file name
fp = fopen(fileName, "w");
if(fp == NULL)//check to see if the file stream has been opened. if not return out of the function
{
cout << "The file did not open" << endl;
return;
}
fprintf(fp, "%d\n", eCount);//prints the eCount to the file
//for-loop cycles through eList and prints out employee info to the file
for(int i = 0; i < eCount; i++)
{
fprintf(fp, "%d %s %s %f\n", eList[i].eID, eList[i].fName, eList[i].lName, eList[i].salary);
}
fprintf(fp, "%d\n", dCount);//prints the dCount to the file
//for-loop cycles through dList and prints out department info to the file
for(int i = 0; i < dCount; i++)
{
fprintf(fp, "%d %s %d ", dList[i].dID, dList[i].dName, dList[i].empl_in_dept_count);
//for-loop cycles through dList's empl_in_dept array and prints out info to the file
for(int j = 0; j < dList[i].empl_in_dept_count; j++)
{
fprintf(fp, "%d ", dList[i].empl_in_dept[j]);
}
fprintf(fp, "\n");
}
fclose(fp);//closes the file stream
}
/*
============================================================================
Function : load
Parameters : department dList[], int dCount, employee eList[], int eCount
Return : void
Description : This function loads all department and employee information from a file
============================================================================
*/
void load(department dList [], int &dCount, employee eList[], int &eCount)
{
FILE *fp;//file pointer
char fileName [20];
cout << "Enter in the name of the file to load: ";
cin.ignore();
cin.getline(fileName, 20, '\n');// stores a user defined file name
fp = fopen(fileName, "r");
if(fp == NULL)//check to see if the file stream has been opened. if not return out of the function
{
cout << "The file did not open" << endl;
return;
}
fscanf(fp, "%d\n", &eCount);//prints the eCount to the file
//for-loop cycles through eList and prints out employee info to the file
for(int i = 0; i < eCount; i++)
{
fscanf(fp, "%d %s %s %f\n", &eList[i].eID, eList[i].fName, eList[i].lName, &eList[i].salary);
}
fscanf(fp, "%d\n", &dCount);//prints the dCount to the file
//for-loop cycles through dList and prints out department info to the file
for(int i = 0; i < dCount; i++)
{
fscanf(fp, "%d %s %d ", &dList[i].dID, dList[i].dName, &dList[i].empl_in_dept_count);
//for-loop cycles through dList's empl_in_dept array and prints out info to the file
for(int j = 0; j < dList[i].empl_in_dept_count; j++)
{
fscanf(fp, "%d ", &dList[i].empl_in_dept[j]);
}
}
fclose(fp);//closes the file stream
}
/*
============================================================================
Function : printMenu
Parameters : none
Return : void
Description : This function prints the menu and prompt the user for an entry
============================================================================
*/
void printMenu()
{
printf("----------------------------------------------------------\n"
"Enter the number for the corresponding option:\n"
"1 : Add a new department\n"
"2 : Add a new employee\n"
"3 : Add an employee to a department\n"
"4 : Print a list of all employees\n"
"5 : Print a list of all departments\n"
"6 : Print a list of all employees in a department\n"
"7 : Compute and print the average salary of a department\n"
"8 : Save the full employee listing to a file\n"
"9 : Load the full employee listing from a file\n"
"10: Exit\n"
"----------------------------------------------------------\n"
"> ");
}
誇張と非機能コード。 'add_empl_to_dept'を呼び出して残りを破棄し、あなたがどこにいるのかを見てみましょう。 – user4581301
ようこそスタックオーバーフロー。コードを[最小限の完全な例](http://stackoverflow.com/help/mcve)に縮小することは、私たちの便宜のためだけではなく、あなた自身のバグを見つけるのに役立ちます。これは重要なスキルであり、いずれかのバグ修正よりも貴重です。 – Beta
私はyaを聞く:)。私はそれが投稿するにはあまりにも多くのことを知っていた。それを今すぐハッキングしてください:) –