簡體   English   中英

分段故障核心已棄用……?

[英]Segmentation fault core dumped…?

我正在努力做到這一點:

編寫一個接受三個用戶輸入的程序:作業標記,期中標記和期末考試標記。

這些輸入的類型為float,其值應在0到100之間。

程序應計算最終成績的百分比和字母成績。

•最終成績的計算方式為:作業20%,期中考試30%,期末考試50%。 字母等級的計算方式為:A(最終等級≥80%),B(80>最終等級≥70%),C(70>最終等級≥60%),D(60>最終等級≥50%)和F (50>最終成績)。

顯示最終成績和字母成績。

使用以下代碼:

#include <stdio.h>

int checkMark(int);
float getMark();
float computeFinalGrade(float assign, float midterm, float finalExam, float finalGrade);
int computeLetterGrade(float);

int checkMark(int x)
{
    while(x<0 || x>100) //While x is a negative number:
    {
        printf("Invalid entry.Try again:");
        scanf("%d",&x);
    }

    if(x>0 && x<=100)//If x is a positive number:
        x=x;

    return x;
}

float getMark(void)
{
    float mark=0,assignMark=0,midMark=0,examMark=0,finalMark=0;
    char letterGrade;


    printf("Enter assignment grade:");
    scanf("%d",mark);

    checkMark(mark);
    assignMark=mark;

    printf("\nEnter midterm mark:");
    scanf("%f",&mark);

    checkMark(mark);
    midMark=mark;

    printf("\nEnter exam mark:");
    scanf("%f",&mark);

    checkMark(mark);
    examMark=mark;


    finalMark=computeFinalGrade(assignMark,midMark,examMark,finalMark);
    letterGrade=computeLetterGrade(finalMark);

    printf("The final grade for the course is %.1f, and the letter grade is %c.\n",finalMark,letterGrade);

    return 0;
}

float computeFinalGrade(float assign, float midterm, float finalExam, float finalGrade)
{
    assign=(float)0.2*assign;
    midterm=(float)0.3*midterm;
    finalExam=(float)0.4*finalExam;

    finalGrade=(float)assign+midterm+finalExam;
    return finalGrade;
}

int computeLetterGrade(float finalGrade)
{
    int grade;

        if(finalGrade>=80)
            grade=65;

        if(finalGrade<80)
            if(finalGrade>=70)
                grade=66;

        if(finalGrade<70)
            if(finalGrade>=60)
                grade=67;

        if(finalGrade<60)
            if(finalGrade>=50)
                grade=68;

        if(finalGrade<50)
            grade=70;

    return grade;
}

int main()
{
    getMark();

    return 0;
}

當我調試上面的程序並輸入一個負數時,它顯示以下信息:

Enter assignment grade:123
Segmentation fault (core dumped)

我到底在做什么錯?

這是你的問題:

scanf("%d",mark);

您需要傳遞變量的地址 ,並且說明符應為%f 嘗試:

scanf("%f", &mark);

順便說一句,對此有一個C常見問題解答

如果您使用的是Linux,請在此處查看我的答案。 它與valgrind有關,該工具可幫助調試段錯誤,內存泄漏等。

有關代碼的更多說明:

int checkMark(int x)
{
    while(x<0 || x>100) //While x is a negative number:
    {
        printf("Invalid entry.Try again:");
        scanf("%d",&x);
    }

    if(x>0 && x<=100)//If x is a positive number:
        x=x;

    return x;
}

應該是:

#define MIN_GRADE 0
#define MAX_GRADE 100

int checkMark(int x)
{
    while(x<MIN_GRADE || x>MAX_GRADE)
    {
        printf("Invalid entry.Try again:");
        scanf("%d",&x);
    }

    return x;
}

注意我:

  • 刪除了無用的評論

  • 刪除魔術數字(0和100)

  • 刪除了一個無用的測試(如果退出while循環,則x在{0,...,100}中

  • 允許x等於0

  • 刪除了冪等賦值( x=x沒做任何有用的事情...)

然后:

float getMark(void)
{
    float mark=0,assignMark=0,midMark=0,examMark=0,finalMark=0;
    char letterGrade;

    printf("Enter assignment grade:");
    scanf("%d",mark);

^如其他人所述,您應該在此scanf使用%f&mark

    checkMark(mark);

^在這里,它應該是mark = checkMark(mark); 如果要更新此代碼中的mark變量。 這是因為mark的值傳遞給了函數,而不是對變量mark的引用。 另一個解決方案是傳遞這樣的參考,但是我認為您還沒有准備好:)

    assignMark=mark;

    printf("\nEnter midterm mark:");
    scanf("%f",&mark);

    checkMark(mark);
    midMark=mark;

    printf("\nEnter exam mark:");
    scanf("%f",&mark);

    checkMark(mark);
    examMark=mark;

^所有這些行的相同評論

    finalMark=computeFinalGrade(assignMark,midMark,examMark,finalMark);

^在這里傳遞finalMark作為參數是完全沒有用的。 應該只是finalMark = computeFinalGrade(assignMark, midMark, examMark); ,你不覺得嗎?

    letterGrade=computeLetterGrade(finalMark);

    printf("The final grade for the course is %.1f, and the letter grade is %c.\n",finalMark,letterGrade);

    return 0;
}

如前所述,您無需將一些finalGrade值傳遞給computeFinalGrade ,您應該可以:

float computeFinalGrade(float assign, float midterm, float finalExam)
{
    return 0.2*assign + 0.3*midterm + 0.4*finalExam; // this could even be a macro
}

最后,在computeLetterGrade ,您正在執行大量的冗余測試,並且此變量分配使您的控制流變得混亂,另外,您應該使用char而不是int 嘗試以下方法:

char computeLetterGrade(float finalGrade)
{
    if(finalGrade>=80) return 'A';
    // Since we did not return, necessarily finalGrade < 80
    if(finalGrade>=70) return 'B';
    if(finalGrade>=60) return 'C';
    if(finalGrade>=50) return 'D';
    // All other ifs failed, therefore finalGrade < 50
    return 'E';
}

您可能需要修復一些我沒有提到的問題,但至少您應該通過一些更接近目標的工作。

當您的程序嘗試訪問分配給您的程序之外的內存區域時,就會發生分段錯誤。 scanf()需要該變量的地址。 在代碼中,您將變量的值傳遞給scanf()而不是cnicutar指出的地址。

scanf("%d",mark);

mark變量未初始化,並且具有一些隨機數據,scanf會在嘗試寫入該地址時將其視為內存位置...由於訪問了受限制的內存,因此發生分段錯誤。 另外,mark是浮點變量,因此應使用%f說明符。

scanf("%f", &mark);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM