
主要错误有三个,第一:后面所有的a[students][subiects]变成a[i][j]
在计算每个同学的总分和平均分的时候要将sum的初值设置为0吧
在计算平均分的时候,你的语句是ave = sum / students;ave = sum / subiects
这个是不对的,应改为,ave =10 sum / students,ave =10 sum / subiects原因在于 假设sum=7,students=3,则ave=7/3=2,而实际想要的结果为23333
#include<stdioh>#define subiects 3 //学科数量
#define students 4 //学生人数
int main(void)
{
int a[students][subiects] = { 53,54,76,87,89,56,76,85,45,75,76,45 };
int i = 0, j = 0, sum = 0;//sum为总分
double ave;//ave为平均值
//输入成绩
for (i = 0; i < students; i++)
{
printf("请输入学生%d的%d科成绩:", i + 1, subiects);//i+1为学生序号
for (j = 0; j < subiects; j++)
{
scanf("%d", &a[i][j]);
}
}
//输出成绩
printf("\t\tC语言\t大英\t高数\t总分\t平均分\n");
for (i = 0; i < students; i++)
{ sum=0;
printf("\t同学%d", i+1);
for (j = 0; j < subiects; j++)
{
sum += a[i][j];
printf("\t%d", a[i][j]);
}
ave = 10sum / subiects;
printf("\t%d\t%2f\n",sum,ave);
}
printf("\n\n");
//颠倒输出
sum = 0;
ave = 0;
printf("\t");
for (i = 0; i < students; i++)
printf("\t同学%d", i + 1);
printf("\t平均分\n");
for (j = 0; j < subiects; j++)
{
if (j == 0)
printf("\tC语言");
if (j == 1)
printf("\t大英");
if (j == 2)
printf("\t高数");
sum=0;
for (i = 0; i < students; i++)
{
sum += a[i][j];
printf("\t%d", a[i][j]);
}
ave = 10sum / students;
printf("\t%2f\n",ave);
}
return 0;
}
这里涉及到一个字符在源代码(文本)中,编译好的二进制文件中,以及最后控制台输出编码形式的区别
首先,要明确一点:C(语言/程序)并不理解ANSI,UTF-8以及任何其他编码它只知道处理你给它的字符的二进制表示
在简体中文Windows下,默认的文本保存编码是ANSI(即GBK);Linux下根据系统locale设定,一般应该是(zh_CNUTF-8)(以下基于简体中文Windows)
1)对于源文件中保存的"中文"这个字符串,VS2008看到的就是"0xd6d0"和"0xcec4"的形式(默认ANSI编码得到)但编译器才不管是不是GBK神马的,它就管那串数字
区别,MinGW看到的是"0xe4b8ad"和"0xe69687"(gcc默认UTF-8)注意,用MinGW编译的源文件中有中文宽字符必须保存为UTF-8编码
2)然后,在二进制文件中的存储形式,对传统的字符串(char str[] = "中文";),编译器什么都不做,直接把那串数字(如"0xd6d0","0xcec4")搬过去塞进二进制文件
但对于宽字符串(wchar_t wstr[] = L"中文";),编译器会将其做转换,转换成Unicode编码格式(在Windows是UTF-16,而Linux下是UTF-32)如"中文"的16位Unicode是"0x4e2d"和"0x6587",然后把这串转换后的数字("0x4e2d","0x6587")塞进二进制文件中(这里VS和MinGW做的没有区别)
这里有点需要注意,编译器必须知道你的源文件保存的编码!如VS默认是ANSI编码,如果你用UTF-8保存c源文件去用VS打开看一定是乱码同理如果你用mingw编译ANSI编码保存的源文件,也会出错!(但可以修改编译选项解决,见文章末尾) 在本文这里这个原因其实很好理解,因为编译器需要知道,如果它要将一个保存在文件中的字符转成宽字符时,是从什么编码转到Unicode(可见上述VS是GBK->Unicode,而MinGW是UTF-8->Unicode)
字体设置问题WIN7系统设置方式如下:
一 仅查看适合您的语言设置的字体的步骤
在允许选择字体的程序中,Windows 可以根据输入语言设置隐藏字体。可以让 Windows 自动显示和隐藏字体,也可以选择在程序中查看计算机上安装的所有字体。有关输入语言设置的信息,请参阅添加或更改输入语言。
1单击打开“字体”。
2在左侧窗格中,单击“字体设置”。
3确保选中“根据语言设置隐藏字体”复选框。如果未选中,请将其选中,然后单击“确定”。
提示:若要在程序中查看所有安装的字体,请清除“根据语言设置隐藏字体”复选框,然后单击“确定”。
二 手动显示和隐藏字体的步骤
还可以使用“显示”和“隐藏”按钮逐个显示或隐藏字体。
1单击打开“字体”。
2选择字体,然后单击“显示”或“隐藏”。
三 还原默认字体设置的步骤
可以删除对显示设置进行的任何更改。
1单击打开“字体”。
2在左侧窗格中,单击“字体设置”。
3单击“还原默认字体设置”。注意这还会删除对显示设置进行的所有手动更改。
以上就是关于C语言,字符串输出是乱码全部的内容,包括:C语言,字符串输出是乱码、C语言控制台程序,中文输出变成乱码,怎么解决、WIN系统,某些特殊符号乱码,不是全部。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)