数组中插入和修改函数的一个例子帮助(c ++)

时间:2014-12-06 04:50:44

标签: c++ arraylist

基本上,我几乎已经完成了整个代码,我只是遇到错误而且我不知道应该取出什么或添加到这些函数中。我知道他们之间的联系是因为他们的语言应该几乎相互对立。

在Insert函数中,它应该检查并查看新条目是否已经存在(如果存在,则函数不返回任何内容),如果条目不存在,则将条目插入到数组中。

bool ArrayRecord::InsertItem(int item, char* fName, char* lName, double gpa, char* pnum)
{
int location = 0;
//  int item;

while (location < length)
{
    if (list[location].id == item) return 0;

    else {

        list[length].id = item;
        list[length].firstName = fName;
        list[length].lastName = lName;
        list[length].gpa = gpa;
        list[length].phonenumber = pnum;
        length++;
        return 1;
        /*for the duplicate id prevention search id first if found then return function immediately otherwise start insertion*/
    }
}
}

以下是上述函数标题的调用:

bool InsertItem(int, char*,char*,double,char*);

现在,这真的让我头疼。我去过其他一些论坛,试图帮助解决这个问题,但我对给予的帮助感到困惑。修改是首先搜索条目。如果找到该条目,则修改该条目。如果未找到该条目,则将该条目插入到数组中。

bool ArrayRecord::Modify(int item, char* fName, char* lName, double gpa, char* pnum)
{
int location = 0;
int item; //item has no valid value
while (location < length)
{
    //item has no valid value - how do you know it's equal to the id value in the current location?
    if (list[location].id == item) return &list[location];
    else location++;
}
/*Do a search if it's found then modify the selection but if it's not found then insert a new info*/

}

以下是修改标题中的调用。

    bool Modify(int, char*, char*, double, char*);

这是错误

Error   1   error C2082: redefinition of formal parameter 'item'    
Warning 2   warning C4800: 'StudentRecord *' : forcing value to bool 'true' or 'false' (performance warning)    

我需要一些非常容易理解的语言示例,并希望能够非常详细地解释正在发生的事情以及我需要做什么。我是初学者而且我已经没有练习了,所以我忘了一些东西。我需要澄清。

2 个答案:

答案 0 :(得分:2)

夫妻俩:

InsertItem中的循环只执行一次,因为位置在开始时无效。如果要在添加新项目之前检查项目ID,则函数体应如下所示:

for (int location = 0; location < length; ++location)
    if (list[location].id == item) return false;

list[length].id = item;
list[length].firstName = fName;
list[length].lastName = lName;
list[length].gpa = gpa;
list[length].phonenumber = pnum;
length++;

return true;

第二个功能应该是不同的:

for (int location; location < length; ++location) {
    if (list[location].id == item) {
        // modify an item
        list[location].firstName = fName;
        list[location].lastName = lName;
        list[location].gpa = gpa;
        list[location].phonenumber = pnum;

        return false;
    } 
}

// add new item
list[length].id = item;
list[length].firstName = fName;
list[length].lastName = lName;
list[length].gpa = gpa;
list[length].phonenumber = pnum;

length++;

return true; 

在向其添加新项目或使用std :: vector

之前检查最大列表长度也会很好

答案 1 :(得分:1)

“形式参数的重新定义”是因为您将item作为输入添加到函数中,然后声明了具有相同名称的第二个item(请参阅ArrayRecord::Modify的第二行与提供给函数的参数列表。考虑尝试声明这样的变量:

bool myFunc() {
  int item;
  int item;
  // ...
  return 0;
}

这与将变量item声明为函数参数,然后将其声明为局部变量相同:您在同一范围内对同一变量有两个定义。

其次,警告告诉您函数ArrayRecord::Modify返回bool类型的值,但是在此函数中的一个return语句中,您返回的值不是bool类型,并且bool类型没有“明显”的翻译。具体来说,行if (list[location].id == item) return &list[location];返回对list数组中某个位置的地址引用(如果一切顺利,它永远不会是0),因此编译器必须决定如何翻译{ {1}}转换为&list[location]true返回值。

在回答评论问题时,我建议修复上面提到的“返回值”问题,然后在每个函数中添加“回退返回”,例如false作为每个函数中的最后一个语句。虽然您的代码似乎涵盖了使用return 0;语句到函数末尾的所有可能路径,但编译器不同意,并且您的选项是提供“默认”返回值,以防其他所有方法都失败,或者关闭编译器中的特别警告。前者比后者更值得推荐。

如果警告所有代码路径中都没有返回值,请注意

return

不保证返回值。在while (a < b) { if (q) return 1; else return 0; } 时,代码的执行可能跳过while (a < b) { ... },并且编译器看不到a>=b是保证启动条件的任何原因。