鱼C论坛

 找回密码
 立即注册
查看: 3118|回复: 10

c语言如何通过函数给全局变量赋值

[复制链接]
发表于 2016-7-27 16:44:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,案例是谭浩强C的第四版,把程序什么的都照抄下来,编译,链接,都没有什么问题,但是运行不了。
原题是:输入2个学生的2门课,分别求每个学生的平均分,每门课的平均分,求出最高分所对应的学生与课程,求方差。

编译之后,发现不能给全局变量赋值,求解,
代码如下:
  1. #include <stdio.h>
  2. #define N 2
  3. #define M 2
  4. float a[N][M];
  5. float a_stu[N], a_cour[M];
  6. int r,c;                                         //r,c分别表示最高分的行与列
  7. int main ()
  8. {
  9.         int i,j;
  10.         float h,k;                                      
  11.         float f1(void);                              //计算方差
  12.         float f2();                                  //计算最高分
  13.         void  f3(void);                              //输入10个学生的成绩
  14.         void  f4(void);                              //计算每个学生的平均分
  15.         void  f5(void);                                     //计算每门课的平均分                                                                                         
  16.                   f3();
  17.               f4();
  18.                   f5();
  19.         for (i=0;i<N;i++)
  20.         {
  21.                         printf("\n No %2d",i+1);
  22.                         for (j=0;j<M;j++)
  23.                                 printf("%8.2f",a[i][j]);
  24.                             printf("%8.2f",a_stu[i]);
  25.         }
  26.                
  27.         printf("五门课的平均成绩为");
  28.         for (j=0;j<M;j++)
  29.                             printf("%8.2f",a_cour[i]);
  30.                                 printf ("\n");
  31.     h=f2();
  32.         k=f1();
  33.         printf("最高分为:%7.2f  是第 %d 位同学的第 %d 门课程",h,r,c);
  34.         printf("方差为:%8.2f\n",k);
  35.         return 0;
  36. }
  37. void  f3(void)                                             //输入学生的成绩
  38.         {
  39.                 int i,j;
  40.     for (i=0;i<N;i++)
  41.         {        printf("请输入第 %2d 位同学的成绩:\n",i+1);
  42.                 for (j=0;j<M;j++)
  43.                         scanf("%f",&a[i][j]);
  44.         }
  45.         }
  46.        
  47. void  f4(void)                                             //计算每个学生的平均分
  48.         {
  49.                 int i,j;
  50.                 float sum=0;
  51.     for (i=0;i<N;i++)
  52.         {       
  53.                 for (j=0;j<M;j++)
  54.                         sum = sum +a[i][j];
  55.                         a_stu[i]=sum/M;
  56.         }
  57.         }
  58. void  f5(void)                                             //计算每门课的平均分
  59.         {
  60.                 int i,j;
  61.                 float sum=0;
  62.     for (j=0;j<M;i++)
  63.         {       
  64.                 for (i=0;i<N;i++)
  65.                         sum = sum +a[i][j];
  66.                         a_cour[i]=sum/N;
  67.         }
  68.         }
  69. float  f2()                                             //计算最高分与学生和课程
  70.         {
  71.                 int i,j;
  72.                 float sum=a[0][0];
  73.     for (j=0;j<M;i++)
  74.         {       
  75.                 for (i=0;i<N;i++)
  76.                         if (sum<a[i][j])
  77.                                 sum=a[i][j];
  78.                         r=i+1;
  79.                         c=j+1;
  80.         }
  81.         return sum;
  82.         }
  83. float  f1(void)                                             //计算方差
  84.         {
  85.                 int i;
  86.                 float c=0,d=0;       
  87.                 for (i=0;i<N;i++)
  88.                 {
  89.                         c=c+a_stu[i]*a_stu[i];
  90.                         d=d+a_stu[i];
  91.                 }
  92.                        
  93.         return (c/N-(d/N)*(d/N));
  94.         }
复制代码


运行结果如下:
到底该怎么样给全局变量赋值呢?求解,谢谢大家了
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-27 17:34:30 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-27 23:15:04 | 显示全部楼层
本帖最后由 Krant5 于 2016-7-27 23:16 编辑

说真的你编程习惯这么差,都学毁了 。代码写的乱七八糟根本看不好。可以运行出来的,至于数值错误自己逻辑自己检查,再有,全局变量在哪里都可以赋值!!!!!!!!!!!!!!!!
  1. #include <stdio.h>
  2. #define N 2
  3. #define M 2


  4. float f1(void);                              //计算方差
  5. float f2();                                  //计算最高分
  6. void  f3(void);                              //输入10个学生的成绩
  7. void  f4(void);                              //计算每个学生的平均分
  8. void  f5(void);                                     //计算每门课的平均分

  9. float a[N][M];
  10. float a_stu[N], a_cour[M];
  11. int r,c;                                         //r,c分别表示最高分的行与列
  12. int main ()
  13. {
  14.         int i,j;
  15.         float h,k;
  16.         f3();
  17.         f4();
  18.         f5();

  19.         for (i=0;i<N;i++)
  20.         {
  21.             printf("\n No %2d",i+1);
  22.                 for (j=0;j<M;j++)
  23.                 printf("%8.2f",a[i][j]);
  24.                 printf("%8.2f",a_stu[i]);
  25.         }

  26.         printf("五门课的平均成绩为");
  27.         for (j=0;j<M;j++)
  28.                             printf("%8.2f",a_cour[i]);
  29.                                 printf ("\n");
  30.     h=f2();
  31.         k=f1();
  32.         printf("最高分为:%7.2f  是第 %d 位同学的第 %d 门课程",h,r,c);
  33.         printf("方差为:%8.2f\n",k);
  34.         return 0;
  35. }
  36. void  f3(void)                                             //输入学生的成绩
  37. {
  38.                 int i,j;
  39.         for (i=0;i<N;i++)
  40.         {        printf("请输入第 %2d 位同学的成绩:\n",i+1);
  41.                 for (j=0;j<M;j++)
  42.                 scanf("%f",&a[i][j]);
  43.         }
  44.         printf("%f\n",a[1][1]);
  45. }

  46. void  f4(void)                                             //计算每个学生的平均分
  47.         {
  48.             printf("in f4\n");
  49.                 int i,j;
  50.                 float sum=0;
  51.     for (i=0;i<N;i++)
  52.         {

  53.                 for (j=0;j<M;j++)
  54.                         sum = sum +a[i][j];
  55.                         a_stu[i]=sum/M;
  56.         }
  57.         printf("out f4\n");
  58.         }
  59. void  f5(void)                                             //计算每门课的平均分
  60.         {
  61.             printf("in f5\n");
  62.                 int i,j;
  63.                 float sum=0;
  64.     for (j=0;j<M;j++)
  65.         {
  66.                 for (i=0;i<N;i++)
  67.                         sum = sum +a[i][j];
  68.                         a_cour[i]=sum/N;
  69.         }
  70.         printf("out f5\n");
  71.         }
  72. float  f2()                                             //计算最高分与学生和课程
  73.         {
  74.                 int i,j;
  75.                 float sum=a[0][0];
  76.     for (j=0;j<M;j++)
  77.         {
  78.                 for (i=0;i<N;i++)
  79.                         if (sum<a[i][j])
  80.                                 sum=a[i][j];
  81.                         r=i+1;
  82.                         c=j+1;
  83.         }
  84.         return sum;
  85.         }
  86. float  f1(void)                                             //计算方差
  87.         {
  88.                 int i;
  89.                 float c=0,d=0;
  90.                 for (i=0;i<N;i++)
  91.                 {
  92.                         c=c+a_stu[i]*a_stu[i];
  93.                         d=d+a_stu[i];
  94.                 }

  95.         return (c/N-(d/N)*(d/N));
  96.         }
复制代码
aaa.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-7-27 23:52:43 | 显示全部楼层

第一个问题:全局变量是可以赋值的!

本帖最后由 Whitehat_K 于 2016-7-27 23:56 编辑
  1. #include <stdio.h>
  2. #define N 2
  3. #define M 2
  4. float a[N][M];
  5. float a_stu[N], a_cour[M];
  6. int r,c;                                         
  7. int main ()
  8. {
  9.         int i,j;
  10.         float h,k;                                      
  11.         float f1(void);                              
  12.         float f2();                                 
  13.         void  f3(void);                              
  14.         void  f4(void);                              
  15.         void  f5(void);                                                                                                                       
  16.         f3();
  17.         f4();
  18.         f5();
  19.         for (i=0;i<N;i++)
  20.         {
  21.                 printf("\n No %2d",i+1);
  22.                 for (j=0;j<M;j++)
  23.                         printf("%8.2f",a[i][j]);
  24.                 printf("%8.2f",a_stu[i]);
  25.         }
  26.        
  27.         printf("每门课的平均成绩为");                         /*每门课的平均分*/
  28.         for (j=0;j<M;j++)
  29.                 printf("%8.2f",a_cour[j]);                        /*a_cour[j]*/
  30.         printf ("\n");
  31.         h=f2();
  32.         k=f1();
  33.         printf("最高分为:%7.2f  是第 %d 位同学的第 %d 门课程",h,r,c);
  34.         printf("方差为:%8.2f\n",k);
  35.         return 0;
  36. }
  37. void  f3(void)                                          
  38. {
  39.         int i,j;
  40.         for (i=0;i<N;i++)
  41.         {        printf("请输入第 %2d 位同学的成绩:\n",i+1);
  42.         for (j=0;j<M;j++)
  43.                 scanf("%f",&a[i][j]);
  44.         }
  45. }

  46. void  f4(void)                                            
  47. {
  48.         int i,j;
  49.         float sum=0;
  50.         for (i=0;i<N;i++)
  51.         {        
  52.                 for (j=0, sum=0;j<M;j++)                          /*1.sum需清零,不然计算错误*/
  53.                         sum = sum +a[i][j];
  54.                 a_stu[i]=sum/M;
  55.         }
  56. }
  57. void  f5(void)                                         
  58. {
  59.         int i,j;
  60.         float sum=0;

  61.         r = 1;                                               /*如果第一个学生第一门课就是最大值*/
  62.         c = 1;

  63.         for (j=0;j<M;j++)
  64.         {        
  65.                 for (i=0, sum=0;i<N;i++)               
  66.                         sum = sum +a[i][j];
  67.                 a_cour[j]=sum/N;                                 /*1.i应该从0开始或者改为j; 2.此处有死循环应换成j++; 3.sum清零*/
  68.         }
  69. }
  70. float  f2()                                         
  71. {
  72.         int i,j;
  73.         float sum=a[0][0];
  74.         for (j=0;j<M;j++)                                    /*1.死循环更改为j++*/
  75.         {        
  76.                 for (i=0;i<N;i++)
  77.                         if (sum<a[i][j])
  78.                         {
  79.                                 sum=a[i][j];                             /*即时记录最大值得标号*/
  80.                             r=i+1;
  81.                             c=j+1;
  82.                         }

  83.         }
  84.         return sum;
  85. }
  86. float  f1(void)                          /*个人认为求方差应该是求两个课程各自的方差,这部分就持保留意见*/                                    
  87. {
  88.         int i;
  89.         float c=0,d=0;        
  90.         for (i=0;i<N;i++)
  91.         {
  92.                 c=c+a_stu[i]*a_stu[i];
  93.                 d=d+a_stu[i];
  94.         }
  95.        
  96.         return (c/N-(d/N)*(d/N));
  97. }
复制代码
捕获.JPG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-7-28 08:06:59 | 显示全部楼层
看不懂 我还是个新手
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-28 11:05:38 | 显示全部楼层
3#楼上正解,程序卡在f5了的外层循环上了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 11:08:49 | 显示全部楼层
Krant5 发表于 2016-7-27 23:15
说真的你编程习惯这么差,都学毁了 。代码写的乱七八糟根本看不好。可以运行出来的,至于数值错误自己逻辑 ...

感谢大牛的热心帮助与建议,以后写代码会注意的,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 11:09:35 | 显示全部楼层

感谢你的热心帮助,祝你生活愉快
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 11:10:08 | 显示全部楼层
小丑哥 发表于 2016-7-28 08:06
看不懂 我还是个新手

看不懂,可能是我代码写的太乱了。哈哈。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 11:11:24 | 显示全部楼层
joey234you 发表于 2016-7-28 11:05
3#楼上正解,程序卡在f5了的外层循环上了

感谢你的帮助哦,这里的大牛好多哈。祝你生活愉快。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-29 20:06:38 | 显示全部楼层

叶良辰你好,。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-14 16:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表