我不太了解模块化,除非它基本上将您的代码划分为更小的函数组(这个问题适用于C语言)。
我正在执行一项任务,我只能在" main"中看到我的源代码使用一个巨大的嵌套循环。 (如果转让允许,则不予处理)。换句话说,如果我尝试使用函数来剪切代码,我就不会看到必要的嵌套循环是如何工作的。但这项任务需要尝试模块化。
因此,任何人都可以告诉我如何将以下代码分解成更小的模块而不会弄乱它的实际执行情况吗?
#include <stdio.h>
int main(void)
{
int counter = 0;
int marknum = 0;
int sectioncode, studentnumber;
int dummyvariable = 0;
int index;
int marks;
int total = 0;
do
{
printf("Enter a Section Code: ");
scanf("%d", §ioncode);
while(sectioncode > 4 || sectioncode < 1)
{
printf("Invalid value entered. Must be 1 to 4, please re-enter: ");
scanf("%d", §ioncode);
}
do
{
printf("Enter the Student's ID: ");
scanf("%d", &studentnumber);
while (studentnumber < 1 || studentnumber > 999999999)
{
printf("Invalid value entered. Must be 1 to 999999999. Please re-enter: ");
scanf("%d", &studentnumber);
}
while (sectioncode != 0)
{
while (counter < 5)
{
counter++;
marknum++;
printf("Enter mark%d: ", marknum);
scanf("%d", &marks);
total = total + marks;
}
printf("%09d's total mark is %d\n", studentnumber, total);
counter = 0;
marknum = 0;
sectioncode = 0;
}
dummyvariable = 1;
} while (dummyvariable = 0);
} while (sectioncode != 0);
return 0;
}
另外,我如何为这一个提出模块化(基本上是同一个问题):
#include <stdio.h>
int main(void)
{
int num; //User inputted number
int i; //Increment variable
char ch; //Check for characters variable
do //Begin "do while" loop
{
printf("\nEnter a number:"); //User prompt
scanf ("%d", &num); //Scan for user inputted integer
while ( (ch = getchar()) != '\n') //Scan for character, check for non-numeric input
{
printf("Invalid number entered. Please re-enter: "); //Error message and prompt for invalid user input
scanf ("%d", &num); //Scan for user inputted integer
} //Repeat loop if condition becomes true again
for (i=0; i<num; i++) //Begin "for" loop; condition prints asterisks equal to user number; increment i by 1
{
printf("*"); //Prints a single asterisk each loop until i is less than num
}
} while (num!=0); //Stop "do while" loop if user enters 0
return 0;
}
答案 0 :(得分:0)
通常我建议你问教练而不是在这里询问作业问题,但丹尼尔在评论中指出,使用循环和额外的变量只是为了避免在代码中使用if语句是愚蠢的,而我我不确定地告诉你从一位教练那里得到建议,他认为这是一个好主意,对我来说是完全负责任的行为。所以,说完了:
在这种情况下你想要寻找的是多个类似代码的块,或者在概念上做一件事的代码块。然后看看你是否可以将这些块分成一个函数。
在第一个示例中,您显示提示,读取用户输入,并验证sectioncode
和studentnumber
的输入。该过程可以分成一个单独的功能。 (从printf("Enter ...")
到while循环结束的所有内容。)然后在main函数中,你只需要像
sectioncode = readval("Enter a Section Code: ", 1, 4);
studentnumber = readval("Enter the Student's ID: ", 1, 999999999);
对于第二个例子,输入/验证代码没有重复,但它仍然可能值得拆分成一个函数,因为它做了一个明确定义的东西,并且跨越足够的行将它分成一个函数可能有助于使剩余代码的逻辑更清晰。但在这种情况下,它不如第一次重要。
另外,一个不相关的问题:在其中一个做法结束时,你有while (dummyvariable = 0);
。注意单个等号。你将0分配给dummyvariable,而不是比较。
在这种特殊情况下,无论如何它都可以工作,因为整个表达式的计算结果为0(即假),就像(dummyvariable == 0)
一样。但是如果那个常量是其他任何东西,或者如果你还没有在循环结束之前将dummy变量设置为1那么这就是一个bug。
我强烈建议总是将常量放在类似表达式的左侧,以便在编译时捕获那种类型的错误。 while (dummyvariable = 0)
默默地做出意想不到的事情; while (0 = dummyvariable)
会在编译时发出错误,您可以修复它。