标题:求解答,不懂得怎么调用函数,帮忙修改一下代码
只看楼主
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
结帖率:100%
已结贴  问题点数:8 回复次数:19 
求解答,不懂得怎么调用函数,帮忙修改一下代码
#include<stdio.h>
int main()
{
struct Student
{
    char name[5];
    int A;
    int B;
    int C;
    float average;
};
struct Student stu[3];
int i;
printf("请输入学生的信息:\n");
for(i=0;i<3;i++)
{
    printf("请输入第%d个学生的信息:\n",i+1);
    printf("姓名:");
    scanf("%s",stu[i].name);
    printf("A课程成绩:");
    scanf("%d",stu[i].A);
    printf("B课程成绩:");
    scanf("%d",stu[i].B);
    printf("C课程成绩:");
    scanf("%d",stu[i].C);
}
for(i=0;i<3;i++)
{
    stu[i].average=(stu[i].A+stu[i].B+stu[i].C)/3.0;
    printf("平均分%f",stu[i].average);
}
printf("学生成绩列表:\n");
for(i=0;i<3;i++)
{
    printf("姓名:%s A课程成绩:%d B课程成绩:%d C课程成绩:%d 平均分:%f\n",stu[i].name,stu[i].A,stu[i].B,stu[i].C,stu[i].average);
}
printf("\n");
return 0;
}
对于以上的代码,我要是想用void input(Student s[], int n),void average(Student s[], int n),void print(Student s[], int n)这些函数来实现函数调用,该怎么用法,下面是我的写法,可是出错了,不知道怎么修改。
#include<stdio.h>
#define c 3
struct Student
{
    char name[5];
    int A;
    int B;
    int C;
    float average;
};
struct Student stu[3];
int main()
{
    void input(Student s[], int n);
    void average(Student s[], int n);
    void printf(Student s[], int n);
    input(stu[3],3);
    average( stu[3],3);
    printf(stu[3],3);
   
return 0;
}
void input(student s[], int n)
{
    int i;
    printf("请输入学生的信息:\n");
   for(i=0;i<c;i++)
   {
    printf("请输入第%d个学生的信息:\n",i+1);
    printf("姓名:");
    scanf("%s",stu[i].name);
    printf("A课程成绩:");
    scanf("%d",&stu[i].A);
    printf("B课程成绩:");
    scanf("%d",&stu[i].B);
    printf("C课程成绩:");
    scanf("%d",&stu[i].C);
}
}
   void average(student s[], int n)
   {
       int i;
   for(i=0;i<3;i++)
{
    stu[i].average=(stu[i].A+stu[i].B+stu[i].C)/3.0;
}
   }
   void printf(student s[], int n)
   {
       int i;
   printf("学生成绩列表:\n");
for(i=0;i<3;i++)
{
    printf("姓名:%s,A课程成绩:%d,B课程成绩:%d,C课程成绩:%d,平均分:%f\n",stu[i].name,stu[i].A,stu[i].B,stu[i].C,stu[i].average);
}
   }
下面是调试的结果(让我很纠结啊,不知道怎么办,各位高手帮忙修改一下。怎样实现函数调用吧):
1>  源.cpp
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(17): error C2664: “input”: 不能将参数 1 从“Student”转换为“Student []”
1>          没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(18): error C2664: “average”: 不能将参数 1 从“Student”转换为“Student []”
1>          没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(19): error C2665: “printf”: 2 个重载中没有一个可以转换所有参数类型
1>          d:\window7\vc\include\stdio.h(271): 可能是“int printf(const char *,...)”[通过使用参数相关的查找找到]
1>          e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(16): 或       “void printf(Student [],int)”
1>          尝试匹配参数列表“(Student, int)”时
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(23): error C2065: “student”: 未声明的标识符
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(23): error C2146: 语法错误: 缺少“)”(在标识符“s”的前面)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(23): error C2182: “input”: 非法使用“void”类型
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(23): error C2059: 语法错误:“)”
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(24): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(24): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(40): error C2065: “student”: 未声明的标识符
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(40): error C2146: 语法错误: 缺少“)”(在标识符“s”的前面)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(40): error C2182: “average”: 非法使用“void”类型
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(40): error C2059: 语法错误:“)”
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(41): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(41): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(48): error C2065: “student”: 未声明的标识符
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(48): error C2146: 语法错误: 缺少“)”(在标识符“s”的前面)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(48): error C2182: “printf”: 非法使用“void”类型
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(48): error C2365: “printf”: 重定义;以前的定义是“函数”
1>          d:\window7\vc\include\stdio.h(271) : 参见“printf”的声明
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(48): error C2059: 语法错误:“)”
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(49): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>e:\users\lovecaiyun\documents\visual studio 2012\projects\consoleapplication9\consoleapplication9\源.cpp(49): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
搜索更多相关主题的帖子: 课程 信息 average include 课程 信息 average include 
2012-12-14 10:18
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
得分:0 
我看下先 ==
2012-12-14 10:25
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
得分:0 
楼主定义的3个函数都不需要参数,也不需要返回值(所要操作的结构体是全局可见的),所以用无参无返回就好了吧,而且n根本没用到,主函数里也没有定义这个n,传了也没有用
还有自己定义的函数不要用库函数的名字,这会造成很多麻烦最后的函数用print做名字就好了
形参的名字好像也不对Student s[]应该是struct Student stu[]吧

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-14 10:46
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
得分:0 
程序代码:
int main()
{
    void input(Student s[], int n);
    void average(Student s[], int n);
    void printf(Student s[], int n);
    input(stu[3],3);
    average( stu[3],3);
    printf(stu[3],3);
   
    return 0;
}

//函数声明请放在外面

void input(Student s[], int n);
void average(Student s[], int n);
void printf(Student s[], int n);

//结构体数组对象
struct Student stu[3];


int main()
{
    //传参时,直接给数组对象名

    input(stu,3);
    average(stu,3);

    printf(stu,3);
   
    return 0;
}

2012-12-14 10:49
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
得分:4 
#include<stdio.h>

#define MAXNUM 3//宏定义建议你大写

typedef struct Student//结构体这个建议你typedef
{
    char name[5];
    float A;//成绩还是用float吧
    float B;
    float C;
    float average;
}STU;

void input(STU s[]);//函数申明写main函数外面
void average(STU s[]);//一个参数就够了
void printf(STU s[]);

int main()
{
    STU stu[3];
   
    input(stu);
    average(stu);
    printf(stu);
   
return 0;
}

void input(STU stu[3])
{
    int i = 0;
    printf("请输入学生的信息:\n");
   for(i = 0;i < MAXNUM;i++)
   {
        printf("请输入第%d个学生的信息:\n",i+1);
        printf("姓名:");
        scanf("%s",&stu[i].name);
        printf("A课程成绩:");
        scanf("%f",&stu[i].A);
        printf("B课程成绩:");
        scanf("%f",&stu[i].B);
        printf("C课程成绩:");
        scanf("%f",&stu[i].C);
    }
}

void average(STU stu[3])
{
   int i = 0;
   for(i=0;i<3;i++)
  {
    stu[i].average=(stu[i].A+stu[i].B+stu[i].C)/3.0;
  }
}

void printf(STU stu[3])
{
   int i = 0;
   printf("学生成绩列表:\n");
  for(i = 0;i < 3;i++)
 {
    printf("姓名:%s\tA课程成绩:%3f\tB课程成绩:%3f\tC课程成绩:%3f\t平均分:%4f\n",stu[i].name,stu[i].A,stu[i].B,stu[i].C,stu[i].average);
 }
}
2012-12-14 10:52
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
得分:0 
回复 3楼 yaobao
支持3楼的

有一点想说的就是:没有规定实参跟形参要同名吧。。。
2012-12-14 10:52
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
得分:2 
回复 4楼 crystall
以前一直坚信函数声明在主函数外面,但是看到过几回在主函数里的声明,自己试了几回也确实没有报错,所以。。。。在里面就在里面吧。。
楼主定义的结构体数组stu[]在函数外,是全局的,是不是用无参无返回的函数就行啊

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-14 10:54
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
得分:0 
以下是引用crystall在2012-12-14 10:52:56的发言:

支持3楼的

有一点想说的就是:没有规定实参跟形参要同名吧。。。
形参和实参当然不需要同名,可是要同一类型啊,楼主定义的类型是struct Student,但是形参是struct,貌似不行吧,我试试

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-14 10:56
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
得分:0 
回复 7楼 yaobao
之所以把子函数分离出来,是为了简化main
你把子函数的声明也放里面。。。

等你遇到千行以上的程序就懂了
百万行的就先不提了
2012-12-14 11:01
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
得分:2 
回复 7楼 yaobao
每次看到函数声明在主函数内部,感觉怪怪的。
将来工作是一个团队(单枪匹马的就不说了),到时候被别人数落,还不如现在开始就养成一个好习惯。
2012-12-14 11:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-391220-1-1.html




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

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