c ++:因为没有按预期工作

时间:2017-11-06 21:32:35

标签: c++ for-loop

我的问题是当我运行代码并调用列表时,所以我按3,没有任何反应,只是跳过for()中的代码。为什么会发生这种情况,我该如何解决? 简单的代码将是受欢迎的。我现在就是这个。

在主要检查之前的前两个int是否学生是否符合学校的资格,或者没有。我测试了那些并且他们工作得很好。

结构描述了一个学生。他/她有一个名字(nev),标记(bacmagy,bacrom,bacmat,bacvalasz)。一个布尔值(langexam)存在,表示学生是否有语言考试

bsiker是真的,如果calculateBac中的公式结果为真。 atmente是真的,如果bsiker和langexam都是真的。

上市会吐出名字,bsiker和atmente。

#include <iostream>
using namespace std;


int atmegye(bool elso, bool masodik){
    if (elso && masodik)
        return true;
    else
        return false;
}

int calculateBac(double magy, double mat, double rom, double val){
    double osszeg = magy + mat + rom + val;
    osszeg = osszeg / 4;
    if (magy < 5 || mat < 5 || rom < 5 || val < 5 || osszeg < 6)
        return false;
    else
        return true;
}

int main(){

    struct diak{
        char nev[32];
        bool langexam, atmente, bsiker;
        double bacmagy, bacrom, bacmat, bacvalasz, bac;
    };

    diak v[150];
    bool cap = false;
    int opcio;
    int j, n = 0;
    int i = 0;

    do{
        cout << "\n Welcome. \n 1-new studient \n 2-Change a studient's details \n 3-List \n 4-Exit \n";
        cin >> opcio;

        switch (opcio){
            case 4:{
                return 0;
            }
            case 1:{
                cout << "Please give the name of the student: ";
                cin >> v[i].nev;
                cout << "Hungarian mark: ";
                cin >> v[i].bacmagy;
                cout << "Romanian mark: ";
                cin >> v[i].bacrom;
                cout << "Maths mark: ";
                cin >> v[i].bacmat;
                cout << "Optional mark: ";
                cin >> v[i].bacvalasz;

                cout << " Do you have a language exam? Please respond with 1 or 0: ";
                cin >> v[i].langexam;
                v[i].bsiker = calculateBac(v[i].bacmagy, v[i].bacrom, v[i].bacmat, v[i].bacvalasz);
                v[i].atmente = atmegye(v[i].bsiker, v[i].langexam);
                i = i + 1;
                i = n;
                cout << n;

                break;
                }

            case 3: {
                for(i = 0; i < n; i++)
                    cout << v[i].nev << " " << v[i].bsiker << " " << endl;
                break;
            }
        }
    }while (opcio != 5);
}

4 个答案:

答案 0 :(得分:1)

这一行错了:

$string = '19187044491';
$searchString = '\%'.$string.'\%';
dd($searchString);  // this is outputing '\187044491\%'

它应该是:

            i = n;

您的代码只是撤消其前面的 n = i; 行。

答案 1 :(得分:1)

n初始化为0,永远不会设置为任何其他值。因此,你的for循环不应该运行任何迭代

答案 2 :(得分:1)

问题在于for循环的条件。您将n的值初始化为0,并且该值似乎永远不会改变。变量i也在for循环内初始化为0。当用户选择选项3时,评估for循环条件(0 <0)是假的,因此每次都跳过for循环。因此,要解决此问题,您需要在代码中的某处更新n的值,或者需要更改条件语句。希望这有帮助!

答案 3 :(得分:0)

我知道这可能对你的作业没有任何帮助,但是这里的 a (其中之一)处理这种方式的方式更像c ++,而且没有使用OOP。

标准库和c ++类型系统为我们提供了大量有用的工具,以便首先避免编写错误(这真的很棒!),并找到剩下的那个在编译时(节省了大量的时间!)。这就是c和c ++之间最大的区别,它是一个非常重要的区别。

#include <iostream>
#include <vector>
#include <string>
#include <string.h>

// fixed-size record to save in data file, for example.
struct diak{
    char nev[32];
    bool langexam, atmente, bsiker;
    double bacmagy, bacrom, bacmat, bacvalasz, bac;
};

void atmegye(diak& student)
{
    student.atmente = student.bsiker && student.langexam;
}

void calculateBac(diak& student)  // computes grades average, checks if passed.
{
    double osszeg = student.bacmagy + student.bacmat + student.bacrom + student.bacvalasz;
    student.bac = osszeg / 4.0;

    student.bsiker = student.bacmagy >= 5
                  && student.bacrom >= 5
                  && student.bacmat >= 5
                  && student.bacvalasz >= 5
                  && student.bac >= 5;       // this last test unnecessary, but rules are rules.
}

void AddNewStudent(std::ostream& os, std::istream& is, std::vector<diak>& students)
{
    diak new_student;
    std::string temp;
    while(temp.empty())
    {
        os << "Student name: ";  
        is >> temp;   // using a temp buffer avoids out of bounds errors
    }

    if (temp.length() >= sizeof(new_student.nev))
        temp.resize(sizeof(new_student.nev) - 1);
    strcpy(new_student.nev, temp.c_str());

    // input values below SHOULD be validated for range (0-100)
    // or whatever makes sense for your school.

    os << "Hungarian mark: ";  is >> new_student.bacmagy;
    os << "Romanian mark: ";   is >> new_student.bacrom;
    os << "Maths mark: ";      is >> new_student.bacmat;
    os << "Optional mark: ";   is >> new_student.bacvalasz;

    // example validation.  Validating user input is the worst!
    // above ^^^ grades ^^^ can use a common function for validation.
    for(;;)
    {
        os << " Do you have a language exam? Please respond with 1 or 0:";
        is >> temp;
        if (temp == "0")
        {
             new_student.langexam = false;
             break;
        }
        if (temp == "1")
        {
             new_student.langexam = true;
             break;
        }

       // not a valid entry, try again!
    }

    calculateBac(new_student);
    atmegye(new_student);

    students.push_back(new_student);
}

void EditSudent(std::ostream& os, std::istream& is, std::vector<diak>& students)
{
    // query which student then edit using streams 'os' and 'is' for i/o.
}   

// could also be used to write to file...
void PrintStudents(std::ostream& os, const std::vector<diak>& students)
{
    // maybe by printing a student number you could reuse this 
    // function from EditStudent()...
    //
    // At the same time, it is only 2 lines of code.  You decide.

    for(size_t i = 0; i < students.size(); i++)
        os << students[i].nev << " " << students[i].bsiker << "\n";
    os.flush();
}

int main()
{
    std::vector<diak> students;  // could also be an std::list<>

    while(true)  // 1 less line of code than do {...} while, and easier to read. 
    {
        int opcio = 0;
        std::cout << "\n Welcome." 
                     "\n 1-new studient" 
                     "\n 2-Change a studient's details" 
                     "\n 3-List "
                     "\n 4-Exit \n";
        std::cin >> opcio;

        switch (opcio)
        {
            case '1':
                AddNewStudent(std::cout, std::cin, students);
                break;

            case 2:
                EditSudent(std::cout, std::cin, students);   // << queries student and edit that
                break;

            case 3:
                PrintStudents(std::cout, students);
                break;

            case 4:
                return 0;
        }
    }
}

注意任务如何很好地划分到他们自己的函数中,这也有助于更快地发现错误,因为它使代码更容易阅读和推理(着名的分而治之的策略)。

将学生数组(或列表)作为单个实体简化了管理,没有额外的变量来保持最新等等......

在更严肃的应用程序中,输入验证最好使用模板完成,并为用户提供转义字符,以便他可以随时取消添加新学生。