C 回溯算法在最小毕业学期数求解中的应用
我从一个文件中获取输入,该文件包含C 回溯算法在最小毕业学期数求解中的应用,c,arrays,backtracking,C,Arrays,Backtracking,我从一个文件中获取输入,该文件包含 每学期的课程数量和最大允许课程数 所有课程名称(最多5个字母数字) 课程名称、提供的sem、资格预审数量、资格预审课程 -最后是1和-1 输出将是完成所有课程的最小学期数 这是我的代码,让你知道我已经完成了工作。我的代码正在编译和执行,但没有显示完成课程的SEM数量。 请告诉我哪里做错了 #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<ctype.h>
char garbage[12][6];
char courseIdentifier[12][6],prereqIdentifier[12][5][6];
char semOffered[12];
bool done[12];
bool allDone(int);
bool donePrereq(int,int);
int main(void)
{
FILE *fp;
fp = fopen("graduate.in","r");
int n,m,p;
int i,j,k;
for(i=0;i<12;i++)
{
strcpy(courseIdentifier[i],"");
}
for(i=0;i<12;i++)
{
for(j=0;j<5;j++)
{
strcpy(prereqIdentifier[i][j],"");
}
}
fscanf(fp,"%d %d",&n,&m);// take n,m
while(n != -1)
{
if( !(1<=n && n<=12) || !(2<=m && m<=6) )
{
printf("Wrong input");
}
for(i=0;i<n;i++) //the list of offered courses
{
fscanf(fp,"%s",garbage[i]);
}
for(i=0;i<n;i++)
{
fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered,&p);//the name of course, sem,no. of prereqs
for(j=0;j<p;j++)
{
fscanf(fp,"%s",prereqIdentifier[i][j]);
}
}
int sem=1;
char semNow = 'F';
for(i=0;i<n;i++)
{
done[i]=false;
}
while(!allDone(n))
{
int count=0;
//while(count<=m)
//{
for(i=0;i<n;i++)
{
if( (semOffered[i]==semNow || semOffered[i]=='B') && donePrereq(p,n))
{
done[i] = true;
count++;
}
}
//}
sem++;
if(semNow=='F')
{
semNow='S';
}
else if(semNow=='S')
{
semNow='F';
}
}
printf("minimum number of semesters = %d\n",sem);
fscanf(fp,"%d %d",&n,&m);// take n,m
}
return 1;
}
bool allDone(int n)
{
bool returnBool=true;
int i;
for(i=0;i<n;i++)
{
returnBool = returnBool && done[i];
}
return returnBool;
}
bool donePrereq(int p,int n)
{
bool returnBool=true;
int i,j;
for(i=0;i<p;i++)
{
for(j=0;j<n;j++)
{
if(strcmp(prereqIdentifier[i][j],courseIdentifier[j]) ==0 )
{
printf("prereq matched\n");
returnBool = (returnBool&&done[j]);
}
}
}
return returnBool;
}
#包括
#包括
#包括
#包括
#包括
煤焦垃圾[12][6];
char-courseIdentifier[12][6],prereqIdentifier[12][5][6];
提供了[12];
bool-done[12];
布尔-奥尔多内;
布尔·多内普里克(国际,国际);
内部主(空)
{
文件*fp;
fp=fopen(“毕业于”,“r”);
int n,m,p;
int i,j,k;
对于(i=0;i当您在此处扫描输入以获取有关每个课程的信息时:
fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered,&p);
&semOffered
参数不正确。您需要提供指向char
的指针。由于semOffered
是char
的数组,您可能打算将其存储到索引位置:
fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered[i],&p);
这不会修复您的程序,但它允许程序完成。当您在此处扫描输入以获取有关每个提供课程的信息时:
fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered,&p);
&semOffered
参数不正确。您需要提供指向char
的指针。由于semOffered
是char
的数组,您可能打算将其存储到索引位置:
fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered[i],&p);
这并不能修复你的程序,但它确实允许程序完成。
请考虑改变问题标题。@橡树,我不认为现在是否重要,这是否是一个家庭作业。问题是相当清楚的,并且代码显示,O/P在发布之前已经做出了合理的努力来解决他们的问题。你看到的是“它不产生输出”,你需要更多的信息。如果你熟练使用调试器,将一个调试器连接到你的代码上,并逐步完成。除此之外,还有一个更丑陋但更简单的解决方案-在代码中添加大量printf。具体来说,在程序流可能发生变化的任何地方添加它(即if
,for
,while
和switch
语句),并在每个函数的开始和结束处。您可以打印出感兴趣的变量或只是数字,以显示程序流程。这可能会帮助您找到问题,或至少为我们提供更多详细信息以帮助您。请不要在你能把这个问题归结为一个简单的问题吗?请考虑改变题目。“橡树,我不认为现在是否重要,这是一个家庭作业。问题是相当清楚的,并且贴出的代码显示O/P在发布之前已经做出了合理的努力来解决他们的问题。你看到的是“它不产生输出”,你需要更多的信息。如果你熟练使用调试器,将一个调试器连接到你的代码上,并逐步完成。除此之外,还有一个更丑陋但更简单的解决方案-向你的代码中添加大量printf。特别是,在程序流可能发生变化的任何地方添加它(即if
,for
,while
和switch
语句),并在每个函数的开始和结束处。您可以打印出感兴趣的变量或只是数字,以显示程序流程。这可能会帮助您找到问题,或至少为我们提供更多详细信息以帮助您。请不要在(你能把这一点归结为你所遇到问题的一个简明例子吗?