如何看懂c语言程序_想请懂c语言的朋友帮帮忙,看看这段程序怎么改。
运行了下运行不完善。不知道哪里错了。帮忙改改,能运行出结果就好。
#include<stdio.h>
#include <conio.h>
#include <windows.h>
void main( )
{
int P1,P2,P3;
int n1,n2,n3,N;
double Q1,Q2,Q3;
int cnt=4;
int flag1,flag2,flag3;
printf("请输入A,B,C三个系的学生人数:");
scanf("%d%d%d",&P1,&P2,&P3);
printf("请输入代表的总人数(>=4):");
scanf("%d",&N);
n1=1,n2=1,n3=1;
printf("第 1 个席位给 A.\n");
printf("第 2 个席位给 B.\n");
printf("第 3 个席位给 C.\n");
while(n1+n2+n3<N)
{
flag1=0;
flag2=0;
flag3=0;
Q1= double(P1*P1)/(n1*(n1+1));
Q2= double(P2*P2)/(n2*(n2+1));
Q3=( doubleP3*P3)/(n3*(n3+1));
printf("相对不公平值: %6.1lf,%6.1lf,%6.1lf;",Q1,Q2,Q3);
if(Q1>=Q2 & Q1>=Q3)
{
flag1=1;
n1++;
}
else
if(Q2>=Q1 & Q2>=Q3)
{
flag2=1;
n2++;
}
else
if(Q3>=Q1 & Q3>=Q2)
{
flag3=1;
n3++;
}
if(flag1==1)
{
printf("第 %d 个席位给 A.\n",cnt);
}
if(flag2==1)
{
printf("第 %d 个席位给 B.\n",cnt);
}
if(flag3==1)
{
printf("第 %d 个席位给 C.\n",cnt);
}
cnt++;
}
printf("\n总结: A 系占 %d 席, B 系占 %d 席, C 系占 %d 席.\n",n1,n2,n3);
}
最佳答案
#include <stdio.h>
//#include <conio.h>
//#include <windows.h>
int main()
{
intP1, P2, P3;
intn1, n2, n3, N;
doubleQ1, Q2, Q3;
int cnt = 4;
int flag1, flag2, flag3;
printf( "请输入A,B,C三个系的学生人数:" );
scanf( "%d%d%d", &P1, &P2, &P3 );
printf( "请输入代表的总人数(>=4):" );
scanf( "%d", &N );
n1 = 1, n2 = 1, n3 = 1;
printf( "第 1 个席位给 A.\n" );
printf( "第 2 个席位给 B.\n" );
printf( "第 3 个席位给 C.\n" );
while ( n1 + n2 + n3 < N )
{
flag1 = 0;
flag2 = 0;
flag3 = 0;
Q1 = (double)(P1 * P1) / (n1 * (n1 + 1) );
Q2 = (double)(P2 * P2) / (n2 * (n2 + 1) );
Q3 = (double)(P3 * P3) / (n3 * (n3 + 1) );
printf( "相对不公平值: %6.1lf,%6.1lf,%6.1lf;", Q1, Q2, Q3 );
if ( Q1 >= Q2 && Q1 >= Q3 )
{
flag1 = 1;
n1++;
}
else if ( Q2 >= Q1 && Q2 >= Q3 )
{
flag2 = 1;
n2++;
}else if ( Q3 >= Q1 && Q3 >= Q2 )
{
flag3 = 1;
n3++;
}
if ( flag1 == 1 )
{
printf( "第 %d 个席位给 A.\n", cnt );
}
if ( flag2 == 1 )
{
printf( "第 %d 个席位给 B.\n", cnt );
}
if ( flag3 == 1 )
{
printf( "第 %d 个席位给 C.\n", cnt );
}
cnt++;
}
printf( "\n总结: A 系占 %d 席, B 系占 %d 席, C 系占 %d 席.\n", n1, n2, n3 );
return 0;
}
运行结果如下:

追问:
你知道要增加到9个系要怎么改吗?除了int后面和后面printf里那些。后面的算法怎么改?
要写适应m方的分配程序,可考虑把定义一个m行2列的二维数组(比如n[m][2]),每个系占一行,每一行里2个元素分别代表:该系的人数,该系分配的席位数。然后写一个函数:参数:为上一轮分配的结果(可传入数组指针,比如n)功能:每次调用分配一个席位返回:本轮分配席位给哪个系的数组的一维下标(比如返回3,就代表本轮席位分配给第4个系)。当然要是感觉下标和第几个系差1不舒服的话,可以定义m+1行2列数组,第0行放弃不用就是了。下边是我在网上找到的一个Q值分配的算法,请对照写出语句就行了:当新分配1席时计算:Qi=(pi*pi)/ni(ni+1) ,i=1,2,3,…,m。增加的1席分配给Q值大的一方。
其他回答
暂无其它回答!