我正在尝试写一个使用Luhn算法来验证安全代码的程序。程序需要:
从文件中读取安全代码并将其输入到数组中
使用一个函数读取安全代码
使用另一个函数来验证它们
为了验证它们,奇数位中的数字将被加在一起。偶数位的数字将乘以2;一旦乘以2,如果数字小于10,则将其添加到偶数的和中;如果大于10,则将该数字的数字的和添加到偶数的和中。因此,如果数组中第二个位置的数字是8,则将其乘以2得到16,然后将1+6=7加到evens的和上。还有更多的代码需要验证,但这是我现在正在做的部分。
我遇到的问题:我不认为我从文件中扫描代码的函数是正确的。文件中的每个代码都有20位数,所以当我声明数组变量时,我这样做了: int sc20。然而,有超过一个20位数的安全代码,我不确定如何解决它。
第二点:我不知道如何计算evens的第二部分(如果数字乘以2大于10,那么它的数字就会加到evens的和上)。
这是文件的前几行(整个文件非常长,所以我只列出了前几行):
0 7 6 1 1 6 6 2 6 8 5 1 5 5 7 7 7 8 0 2
2 5 1 6 2 1 8 2 4 3 0 9 1 9 1 1 3 1 3 8
1 3 3 4 5 4 5 2 8 6 1 8 9 3 7 6 2 2 0 5 这是我到目前为止的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
ReadSecurityCode(FILE* codes, int sc[]);
int main(void) {
int sc[20], i;
FILE* codes;
codes = fopen("SecurityCodes.txt", "r");
while (fscanf(codes, "%c\n", &sc) != EOF) {
ReadSecurityCode(codes, sc[20]);
}
fclose(codes);
return(0);
}
int ReadSecurityCode(FILE* codes, int sc[]) {
int i;
for (i = 0; i < 20; i++) {
fscanf(codes, "%d", &sc[i]);
}
return(sc[20]);
}
int isCodeValid(int sc[]) {
int i, sumodds = 0, sumevens = 0, sumtotal;
for (i = 1; i < 20; i = i + 2) {
sumodds = sumodds + sc[i];
}
for (i = 0; i < 20; i = i + 2) {
sc[i] = sc[i] * 2;
if (sc[i] < 10) {
sumevens = sumevens + sc[i];
}
else {
}
}
return(sumtotal);
}发布于 2021-10-17 04:47:24
最简单的选择是边走边读取并验证每一行。在您发布的代码中,这意味着在while循环中调用isCodeValid(),您可以在其中读取记录:
while (fscanf(codes, "%c\n", &sc) != EOF) {
ReadSecurityCode(codes, sc);
isCodeValid(sc);
}考虑使用char而不是int来存储每个数字(即char sc[20])。
我不确定为什么ReadSecurityCode返回第一个元素,但是scanf()可能会失败,所以您可能希望返回一个错误代码并检查它。另外,我建议您使用ReadSecurityCode()来读取包含换行符的行。
您可能还想根据isCodeValid()的返回值执行一些操作。is命名建议您返回一个布尔值,但您返回的是一个sum。
有了上述建议,它将是:
while (!ReadSecurityCode(codes, sc)) {
if (!isCodeValid(sc)) {
printf("%s is invalid\n", sc);
}
}https://stackoverflow.com/questions/69601296
复制相似问题