| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2246 人关注过本帖, 1 人收藏
标题:哪里有错误啊?输入分数后就出错变乱码了。。。
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
教你一個技巧:在寫scanf()之類語句的時候,在後面馬上寫一句printf(),再馬上運行一次輸入看看打印出來的數據是不是跟希望輸入的一樣,確認輸入語句正確之後,再接著寫後面的代碼,不然你寫好了再運行,連在哪裏開始出錯都沒頭緒,十多、數十行的代碼可以慢慢看、叫人幫忙看,代碼一長,誰給你看,你自己也看不來。

寫程序,一邊寫一邊運行和測試,是最基本的習慣。沒老師教,你自己學,又摸不到這門路,絕對吃苦頭,我現在教了你,不照著做,那是你的事了,門是這樣帶了你的,修行在個人。這一招,足夠你上三級臺階。

授人以渔,不授人以鱼。
2014-11-25 12:07
c语言总虐我
Rank: 2
等 级:论坛游民
帖 子:112
专家分:66
注 册:2014-11-22
收藏
得分:0 
回复 10 楼 TonyDeng
我以为l是long,不想要长的数,就去掉了。。。这回输入完分数不崩溃了,可是没输出高于均分那句啊,

连渣都不是——5.8
要拜雍正,专治八阿哥  b u g——6.27
2014-11-25 12:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
double在C語言中原本就是long float。你不會寫一段代碼把數組m[]全部數據打印出來看看scanf()進來了什麽的麽?這些測試代碼,在得到結果之後可以刪掉或注釋掉的,爲什麽不寫?

授人以渔,不授人以鱼。
2014-11-25 12:12
BuilderZ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:82
专家分:123
注 册:2014-9-22
收藏
得分:0 
%f is for float(include double, float, long)
%d is for int
your code double m[50], but you scanf it as a int type(also you print it as a int type), easy mistake
2014-11-26 03:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你看看有哪块代码是没学过的?
 
程序代码:
/*
http://bbs.bccn.net/thread-439119-1-1.html

题目:定义一个函数,功能是计算n个学生的成绩中,高于平均成绩的人数,并作为函数的返回值。用主函数来调用
它,统计50个学生成绩中,高于平均成绩的有多少人?
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

// 函数原型
void Pause(void);
void ListScores(const double scores[], int count, int flag);
double GetSumScore(const double scores[], int count);
double GetAverageScore(const double scores[], int count);
int GetUpperStudents(const double scores[], int count);

// 程序主入口
int main(void)
{
    const double scores[50] = { 80, 64, 78, 91, 56, 82, 93, 72, 88, 68 };
    const int n = 10;

    ListScores(scores, n, 0);
    putchar('\n');
    printf_s("平均分: %6.2f\n", GetAverageScore(scores, n));
    printf_s("高于平均分的人数: %d\n", GetUpperStudents(scores, n));
    ListScores(scores, n, 1);

    Pause();
    return EXIT_SUCCESS;
}

/*
功能:暂停程序,等待用户按任意键
参数:无
*/
void Pause(void)
{
    printf_s("\nPress any key to continue...");
    _getch();
}

/*
功能:显示学生成绩
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
      flag     -- 是否显示高于平均分的成绩(0不显示,1显示)
*/
void ListScores(const double scores[], int count, int flag)
{
    const double average = GetAverageScore(scores, count);
    int index;

    for (index = 0; index < count; ++index)
    {
        if ((flag != 1) || (scores[index]) > average)
        {
            printf_s("[%-2d]  %6.2f\n", index + 1, scores[index]);
        }
    }
}

/*
功能:获取n个学生的成绩的总分
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
*/
double GetSumScore(const double scores[], int count)
{
    double sum = 0.0;
    int index;

    for (index = 0; index < count; ++index)
    {
        sum += scores[index];
    }

    return sum;
}

/*
功能:获取n个学生的成绩的平均分
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
*/
double GetAverageScore(const double scores[], int count)
{
    return GetSumScore(scores, count) / count;
}

/*
功能:获取n个学生的成绩中高于平均成绩的人数
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
*/
int GetUpperStudents(const double scores[], int count)
{
    const double average = GetAverageScore(scores, count);
    int quantity, index;

    quantity = 0;
    for (index = 0; index < count; ++index)
    {
        if (scores[index] > average)
        {
            ++quantity;
        }
    }

    return quantity;
}

运行效果:
图片附件: 游客没有浏览图片的权限,请 登录注册

 
你写好这些以后,再集中精力把接收数组数据的部分写出来,这已经不是题目所要求的了。人机交互,属于界面部分,既可以在控制台下完成,也可以在图形界面下完成,也可以通过读取磁盘数据来完成。界面归界面,这样写出来的代码,无论你怎么修改界面,都不需再修改,你的目标,只要再集中在如何把填充数组数据上就可以了。
 
另外,你再看我给你设计的这些函数,都是基本上要用到的,即使现在用不到多次,但很明显往后也要用,所以,哪怕是只使用一次,也要把函数写出来!这是代码清晰性的保证。你只要看主函数的逻辑,思路很清晰,在干什么,都一目了然。回头看看自己写的,看得清楚吗?
 
 
[ 本帖最后由 TonyDeng 于 2014-11-27 15:14 编辑 ]

授人以渔,不授人以鱼。
2014-11-27 14:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
现在再你看另一个版本的实现,这次不事先确定学生的人数,而是通过数组计算出来。你比较一下前后两个程序,我变动的地方有多少,再想一下,如果当初不是那么写,则需要修改的地方又是多少?

程序代码:
/*
http://bbs.bccn.net/thread-439119-1-1.html

题目:定义一个函数,功能是计算n个学生的成绩中,高于平均成绩的人数,并作为函数的返回值。用主函数来调用
它,统计50个学生成绩中,高于平均成绩的有多少人?
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

// 函数原型
void Pause(void);
int GetStudentsNumber(const double scores[]);
void ListScores(const double scores[], int count, int flag);
double GetSumScore(const double scores[], int count);
double GetAverageScore(const double scores[], int count);
int GetUpperStudents(const double scores[], int count);

// 程序主入口
int main(void)
{
    // 学生成绩数组,以负数标识有效数据的结尾,其可行性取决于成绩是不可能有负数的这一点事实
    const double scores[50] = { 80, 64, 78, 91, 56, 82, 93, 72, 88, 68, -1 };

    const int n = GetStudentsNumber(scores);

    ListScores(scores, n, 0);
    putchar('\n');
    printf_s("平均分: %6.2f\n", GetAverageScore(scores, n));
    printf_s("高于平均分的人数: %d\n", GetUpperStudents(scores, n));
    ListScores(scores, n, 1);

    Pause();
    return EXIT_SUCCESS;
}

/*
功能:暂停程序,等待用户按任意键
参数:无
*/
void Pause(void)
{
    printf_s("\nPress any key to continue...");
    _getch();
}

/*
功能:获取学生人数
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
*/
int GetStudentsNumber(const double scores[])
{
    int index = 0;

    for (index = 0; scores[index] >= 0; ++index)
    {
        ;   // 空循环
    }

    return index;
}

/*
功能:显示学生成绩
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
      flag     -- 是否显示高于平均分的成绩(0不显示,1显示)
*/
void ListScores(const double scores[], int count, int flag)
{
    const double average = GetAverageScore(scores, count);
    int index;

    for (index = 0; index < count; ++index)
    {
        if ((flag != 1) || (scores[index]) > average)
        {
            printf_s("[%-2d]  %6.2f\n", index + 1, scores[index]);
        }
    }
}

/*
功能:获取n个学生的成绩的总分
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
*/
double GetSumScore(const double scores[], int count)
{
    double sum = 0.0;
    int index;

    for (index = 0; index < count; ++index)
    {
        sum += scores[index];
    }

    return sum;
}

/*
功能:获取n个学生的成绩的平均分
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
*/
double GetAverageScore(const double scores[], int count)
{
    return GetSumScore(scores, count) / count;
}

/*
功能:获取n个学生的成绩中高于平均成绩的人数
参数:scores[] -- 储存学生成绩的数组,每个元素是分数
      count    -- 数组中学生的个数
*/
int GetUpperStudents(const double scores[], int count)
{
    const double average = GetAverageScore(scores, count);
    int quantity, index;

    quantity = 0;
    for (index = 0; index < count; ++index)
    {
        if (scores[index] > average)
        {
            ++quantity;
        }
    }

    return quantity;
}


天天做意大利面条,不会提高你的烹饪技术,初学者必戒。

[ 本帖最后由 TonyDeng 于 2014-11-27 15:43 编辑 ]

授人以渔,不授人以鱼。
2014-11-27 15:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
另外,注意:在现代的计算机上,double的速度比float快,写程序默认用double,不要再用什么float,那是咸丰朝的经验,现在二十一世纪了。

授人以渔,不授人以鱼。
2014-11-27 15:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你再想一想:我为什么要弄出15楼截图那样的界面?那就是为了方便你调试程序用的!那些函数,用得着的时候,调用即可,用不着,搁在那也不占地方,实在有洁癖,注释掉即可。但你不写这些,绝对给自己惹麻烦。这才是编程要学的,整天做数学题,不如去数学系。

授人以渔,不授人以鱼。
2014-11-27 15:48
猫林heart
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:60
专家分:390
注 册:2014-9-26
收藏
得分:0 
回复 18 楼 TonyDeng
解释的好清楚!
2014-11-27 19:30
c语言总虐我
Rank: 2
等 级:论坛游民
帖 子:112
专家分:66
注 册:2014-11-22
收藏
得分:0 
回复 15 楼 TonyDeng
不好意思,好几天都没看了,老师后来说我们这个题有点超纲,交作业的时候就把这个题删掉了,然后我也把我原来写的提交了。然后我会好好看的。。。。。。不胜感激

连渣都不是——5.8
要拜雍正,专治八阿哥  b u g——6.27
2014-11-29 21:17
快速回复:哪里有错误啊?输入分数后就出错变乱码了。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023914 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved