这是我的FCFS CPU调度算法代码。当我替换j = 1时,输出会改变。
#include<stdio.h>
#include<string.h>
#include<conio.h>
main()
{
char pn[10][10],t[10];
int arr[10],bur[10],star[10],finish[10],tat[10],wt[10],i,j,n,temp;
int totwt=0,tottat=0;
//clrscr();
printf("Enter the number of processes:");
scanf("%d",&n);
for(i=0; i<n; i++)
{
printf("Enter the ProcessName, Arrival Time& Burst Time:");
scanf("%s%d%d",&pn[i],&arr[i],&bur[i]);
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(arr[i]<arr[j])
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
temp=bur[i];
bur[i]=bur[j];
bur[j]=temp;
strcpy(t,pn[i]);
strcpy(pn[i],pn[j]);
strcpy(pn[j],t);
}
}
}
for(i=0; i<n; i++)
{
if(i==0)
star[i]=arr[i];
else
star[i]=finish[i-1];
wt[i]=star[i]-arr[i];
finish[i]=star[i]+bur[i];
tat[i]=finish[i]-arr[i];
}
printf("\nPName Arrtime Burtime WaitTime Start TAT Finish");
for(i=0; i<n; i++)
{
printf("\n%s\t%3d\t%3d\t%3d\t%3d\t%6d\t%6d",pn[i],arr[i],bur[i],wt[i],star[i],tat[i],finish[i]);
totwt+=wt[i];
tottat+=tat[i];
}
printf("\nAverage Waiting time:%f",(float)totwt/n);
printf("\nAverage Turn Around Time:%f",(float)tottat/n);
getch();
return 0;
}
问题专栏:
for(j=0; j<n; j++)
据我所知,当我改变j = 1时,输出不应该改变。因为条件arr[i]<arr[j]
无论如何都将是假的,并且将跳过该步骤。
您可以自己运行程序并查看带有和不带更改值的输出。
答案 0 :(得分:1)
第一个也是最严重的问题是
scanf("%s%d%d",&pn[i],&arr[i],&bur[i]);
请注意,您在每次调用时都会将指针传递给下一个字符,此代码也是不确定的,因为n
的值根本不受限制,并且值为n
这将导致缓冲区溢出,但您的代码不会检查它。
此外,自
scanf("%s%d%d",&pn[i],&arr[i],&bur[i]);
对于pn[9]
读取和存储的字符数没有限制,那么您肯定会确保溢出pn
。
你可能想要不同的东西,例如
char pn[10][10];
和
scanf("%s%d%d", pn[i], &arr[i], &bur[i]);
// ^ note that you don't need the & for this
您可能已将char
与字符串混淆,char
类型只是一个整数类型而字符串 是 / 可以由char
类型的值组成。
所以回答你问题的标题:
现在您可能会问那么我该如何解决这个问题?
那么,
答案 1 :(得分:-1)
据我所知,当我改变j = 1时,输出不应该改变。如 条件arr [i]&lt;无论如何,arr [j]将会是假的,那一步 将被跳过。
没有。当i = j时,该条件仅保证为假。是的,在外部循环的第一次迭代中,i = j = 0.但是在外部循环的所有其他迭代中,无论j是从0还是1开始,它都会有所不同。例如,在外部循环的第二次迭代中,i = 1.如果j = 0,则条件可能为真。另一方面,从j = 1开始跳过j = 0的迭代,可能产生不同的结果。这适用于外循环的所有其他迭代。
您面临的问题与未定义的行为无关。