我构建了一个自动应用D' Hondt Law的C代码。所以我使用NetBeans 8.0.2在C语言上完成了它。我正在尝试编译它(没有错误)并且它给出了此消息RUN FAILED (exit value 1, total time: 4s)
。我检查了很多次没有结果,这就是我在这里问的原因。我很感激一些帮助。的解决
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int LerDeputados() {
int d;
printf("Indique o número de deputados a repartir: ");
scanf("%d",&d);
return d;
}
int LerPartidos() {
int n;
printf("Introduza o número de partidos: ");
scanf("%d",&n);
return n;
}
int main(void) {
int d, n, i, k, m, j, z, x, aleatorio, b, dip[1000];
float e[1000][1000], maximo[1000], v[1000];
d= LerDeputados();
n= LerPartidos();
srand(time(NULL));
aleatorio=rand();
do{
i++;
printf("Número de votos do %dº partido: ",i);
scanf("%f",&v[i]);
}while(i<n);
for(j=1;j<=d;j++){
for(k=1;k<=i;k++){
e[j][k]=v[k]/j;
}
}
for(x=1;x<=n;x++) {
dip[x]=0;
}
for(m=1;m<=d;m++){
maximo[m]=0;
for (j=1;j<=d;j++) {
for (k=1;k<=i;k++) {
if (e[j][k]>maximo[m]) {
maximo[m] = e[j][k];
z=j;
x=k;
}
else if (maximo[m]==e[j][k]) {
if(v[k]>v[x]) {
maximo[m] = e[j][k];
z=j;
x=k;
}
else if(v[k]<v[x]) {
}
else {
if(aleatorio%2==0){
maximo[m] = e[j][k];
z=j;
x=k;
}
}
}
}
}
dip[x]=dip[x]+1;
e[z][x]=0;
}
printf("\n");
for(b=1;b<=n;b++) {
printf("\nO partido %d acadou %d diputados.",b,dip[b]);
}
return 0;
}
如何将此代码实现为可在main上运行的函数?
for(m=1;m<=d;m++){
maximo[m]=0;
for (j=1;j<=d;j++) {
for (k=1;k<=i;k++) {
if (e[j][k]>maximo[m]) {
maximo[m] = e[j][k];
z=j;
x=k;
}
else if (maximo[m]==e[j][k]) {
if(v[k]>v[x]) {
maximo[m] = e[j][k];
z=j;
x=k;
}
else if(v[k]<v[x]) {
}
else {
if(aleatorio%2==0){
maximo[m] = e[j][k];
z=j;
x=k;
}
}
}
}
}
dip[x]=dip[x]+1;
e[z][x]=0;
}
答案 0 :(得分:0)
两个问题:
首先,main中有一些非常大的数组,它们在堆栈上分配。这可能会导致堆栈溢出问题。
将这些大型数组声明为全局变量,或使用malloc
动态分配它们。
第二个问题是,在进入第一个i
循环时,do...while
未初始化。此值可以是任何值,因此可能导致从数组v
的末尾开始索引,从而导致未定义的行为。这是导致程序崩溃的原因。改变阵列大小后它没有崩溃的事实就是运气。对代码的任何其他更改都可能导致崩溃重新出现。
将i
设为0,你应该没问题。
i=0;
do{
i++;
printf("Número de votos do %dº partido: ",i);
scanf("%f",&v[i]);
}while(i<n);
编辑:
关于创建一个函数块,你提到了一个函数,将main
中定义的仅在此块中使用的变量移动到该函数中,并传入main
使用的其余参数。 / p>