C语言编程求助啊.....
发布网友
发布时间:2022-05-22 07:45
我来回答
共3个回答
热心网友
时间:2024-03-29 11:00
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char judgment[20];
char singer[20];
float score;
}record;
typedef struct
{
record data[100];
int count;
}JudgTable;
typedef struct
{
char singer[20];
float score;
}Score;
typedef struct
{
Score data[100];
int count;
}ScoreTable;
void Add(JudgTable &T,record R)
{
if (T.count<100)
T.data[T.count++]=R;
}
void AddScore(ScoreTable &T,Score R)
{
if (T.count<100)
T.data[T.count++]=R;
}
void Create(JudgTable &T,ScoreTable &ST,int m,int n)
{ int i,j;
record R;
Score S;
float max,min,avaerg;
for (i=0;i<m;i++)
{
printf("输入歌手姓名");
gets(R.singer);
min=32767;
max=0;
avaerg=0;
for (j=0;j<n;j++)
{
printf("输入裁判姓名");
gets(R.judgment);
printf("输入成绩");
scanf("%f",&R.score);
getchar();
if (R.score<min) min=R.score;
if (R.score>max)max=R.score;
avaerg+=R.score;
Add(T,R);
}
strcpy(S.singer,R.singer);
avaerg=(avaerg-max-min)/(float)(n-2);
S.score=avaerg;
printf("%f",S.score);
AddScore(ST,S);
}
}
void Sortscore(ScoreTable &T)
{
int i,j,p;
Score S;
for (i=0;i<T.count;i++)
{
p=i;
for (j=i;j<T.count;j++)
if (T.data[p].score<T.data[j].score) p=j;
if (p!=i)
{
S=T.data[p];
T.data[p]=T.data[i];
T.data[i]=S;
}
}
}
void Save(ScoreTable T)
{
//
}
void ListScore(ScoreTable T)
{
int i;
for (i=0;i<T.count;i++)
printf("%s\t%5.2f\n",T.data[i].singer,T.data[i].score);
}
void ListJudgTable(JudgTable JT)
{
int i;
for (i=0;i<JT.count;i++)
printf("%s\t%s\t%5.2f\n",JT.data[i].judgment,JT.data[i].singer,JT.data[i].score);
}
void main()
{
int ch;
ScoreTable St;
St.count=0;
JudgTable JT;
JT.count=0;
do{
printf("1.输入 2.排序 3.输出歌手成绩 4.输出评分表 5. 保存0 exit");
scanf("%d",&ch);
getchar();
switch (ch)
{
case 1:Create(JT,St,10,5);break;
case 2:Sortscore(St);break;
case 3:ListScore(St);break;
case 4:ListJudgTable(JT);break;
case 5:Save(St);break;
case 0:exit(0);
}
}while (1==1);
}
保存文件很简单啦!自己解决 ,vc6.0,程序扩展名要用。cpp追问要C语言的啊、、
追答这个就是呀!只是编译环境不同而已!这里用来引用型变量,如果在TC上用,改为指针就OK了,超简单了
热心网友
时间:2024-03-29 11:01
你是在学编程吧,我觉得直接给出程序的话,这就没锻炼了。
(1)这种数据结构就算题目不说,也是用结构体比较简单明了。
我觉得定义机构体时可以定义姓名字符数组,一个score数组(包含5个评分),最终分数单独定义。
struct singer
{
char name[10];
float score[5],final;
}
(2)所谓的结构话设计,我觉得就是模块化,把打分、排序、输出文件等写成子函数。
(3)用户也就是裁判吧,所以打分程序应该有两个下属子程序,表示不同打分方式。根据用户选择进行不同程序调用,可以用指向函数的指针。
(4)也就是(3)中的两个子程序
(5)调用文件输出子程序。
计算最终分和排序,首先先将打分排序(这个简单),然后计算,接着根据最终成绩排序,也不难,冒泡或选择都行。追问我是文科生。。。这是选修课。。。最后的大作业。。。。为了学分。。。你懂得,能帮我编下吗??谢谢了啊。。
追答我用的是VS2005 ,如果你用的是VC6.0,请将int _tmain(int argc, _TCHAR* argv[])改为void main() 并去掉#include "stdafx.h" 长度超了,发不了。
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define SIZE 10
#define CPNUM 5
struct singer
{
long num; //编号
char name[10];
float score[CPNUM],final; //CPNUM个裁判的打分和最终成绩
}s[SIZE];
int _tmain(int argc, _TCHAR* argv[])
{ //这里应该加函数声明。长度有限,删了
char f[CPNUM][20]; //裁判的评分文件名
int t,i;
printf("请输入评分的方式,0为键盘输入,1为文件输入: ");
scanf("%d",&t);
if (t==0) keyin();
else
{printf("请输入各个裁判的评分文件名.\n");
for (int i=0;i<CPNUM;i++) {scanf("%s",f[i]);filein(f[i],i);}}
cal();
sort();
save();
return 0;
}
void keyin() //这个是键盘输入,每个都要输入10个歌手的信息
{}
void filein(char f[],int n) //这个是文件输入
{FILE *fp;
if((fp=fopen(f,"r"))==NULL)
{printf("文件打开出错.\n");exit(0);}
for( int i=0;i<SIZE;i++)
{ fscanf(fp,"%ld%s%f ",&s[i].num ,s[i].name ,&s[i].score[n]);
printf("%8ld %10s ",s[i].num ,s[i].name);
for( int j=0;j<CPNUM;j++) printf("%5.1f ",s[i].score[j]);
printf("\n");}
fclose(fp);
}
void save() //保存歌手文件
{}
void cal() //计算成绩
{}
void sort() //按成绩由高到低排序
{int i,j,k;
struct singer temp;
for(i=0;i<SIZE;i++)
{k=i;
for(j=i+1;j<SIZE;j++)
if (s[i].final<s[j].final) k=j;
temp=s[k];s[k]=s[i];s[i]=temp;
}
printf("按成绩由高到低输出各歌手成绩\n");
for(i=0;i<SIZE;i++)
{printf("%8ld号%8s 最终成绩: %5.1f 各裁判打分: ",s[i].num ,s[i].name,s[i].final);
for( int j=0;j<CPNUM;j++) printf("%5.1f ",s[i].score[j]);
printf("\n");
}
}
热心网友
时间:2024-03-29 11:01
void fun1()
{
//按照物理原理,亮度与距离的平方成反比,设 x_max为最亮点到灯1的基点的距离,x_min为最暗点到灯1的基点的距离。
double power1=2.0 ,power2=3.0;
double h1=5.0,h2=6.0;
double w=20.0;
double light,max_light,min_light;
double delta_x=0.0001;
double x,x_max,x_min;
max_light=min_light=power1/(h1*h1)+power2/(h2*h2+w*w);
for(x=0.0;x<w;x+=delta_x)
{
light=power1/(h1*h1+x*x)+power2/(h2*h2+(w-x)*(w-x));
if(light>max_light)
{
max_light=light;
x_max=x;
}
if(light<min_light)
{
min_light=light;
x_min=x;
}
}
cout<<"x_max="<<x_max<<"\nx_min="<<x_min<<"\n";
}
void fun2()
{
//有关缉私艇用_p表示,有关走私船用_c表示,r为两艇距离
//以缉私艇开始位置为坐标原点
double x_p,y_p,x_c,y_c,t;
double dt,r,dx_p,dy_p,dx_c,dy_c,v_p,v_c;
dt=0.001;
v_p=40.0; v_c=20.0;
x_p=0.0; y_p=0.0;
x_c=15.0; y_c=0.0;
t=0.0;
dx_p=v_p; dy_p=0.0;
dx_c=0.0; dy_c=v_c;
r=sprt((x_c-x_p)*(x_c-x_p)+(y_c-y_p)*(y_c-y_p));
for(t=0.0;r<0.0001;t+=dt)
{
dx_p=(x_c-x_p)/r;
dy_p=(y_c-y_p)/r;
//更新位置
x_p+=dx_p; y_p+=dy_p;
x_c+=dx_c; y_c+=dy_c;
r=sprt((x_c-x_p)*(x_c-x_p)+(y_c-y_p)*(y_c-y_p));
}
cout<<"相遇时间 t="<<t;
}
将每一时刻的位置打印或画出来就是航线了。
不过你要数学建模还是用Matlab方便,还可以画出图形来