C重复编程数组

  • 本文关键字:数组 编程 arrays c
  • 更新时间 :
  • 英文 :


我写了一个程序,检查序列中的一个数字如果重复2次,是否重复2次(应该重复多少次("如果"是";,如果不是";否";。我认为这可以用一种更简单更好的方式来写,所以我对比我更有经验的人的建议和更正感兴趣。
如果数组的每个成员只重复一次,则程序应打印YES,否则应打印NO:

Enter the number of array: 8
Enter the sequence: 1 2 2 1 3 3 4 4
YES
Enter the number of string members: 7
Enter the string: 1 2 1 2 1 3 4
NO

这是我的代码:

#include <stdio.h>
#define arr 100
int main() {
int n, i, p = 1, j, a;
double array[arr];
int num[100];
do {
printf("Enter the number of array: ");
scanf("%d", &n);
} while (n < 1 || n > 100);
printf("Enter array: ");
for (i = 0; i < n; i++) {
scanf("%lf", &array[i]);
num[i] = -1;
}
for (i = 0; i < n; i++) {
a = 1;
for (j = i + 1; j < n; j++) {
if (array[i] == array[j]) {
a++;
num[j] = 0;
}
}
if (num[i] != 0)
num[i] = a;
}
for (i = 0; i < n; i++) {
if (num[i] == 0)
continue;
if (num[i] != 2) {
p = 0;
break;
}
}
if (p == 1)
printf("YES");
else
printf("NO");
return 0;
}

我将在这里提供一个代码审查,因为代码不起作用,这使它偏离了代码审查的主题。

代码的优点:

  • 没有全局变量
  • 有人试图为数组大小定义一个符号常量

可以改进的地方:

  • 根据需要声明变量。在20世纪70年代和80年代的C的原始版本中,变量必须在函数的顶部声明。现在已经不是这样了,建议编程实践根据需要声明变量。在C语言中,该语言不提供变量的默认初始化,因此变量应作为声明的一部分进行初始化。为了可读性和可维护性,每个变量都应该在自己的行中声明和初始化
  • 将常量大写,arr应为ARR
  • ARR应用于num的声明以及array的声明
  • 在该语句while (n < 1 || n > 100)中应该使用ARR而不是100
  • 由于程序一次只允许读取一个数字,因此array应该是整数数组,而不是双精度数组
  • 对用户输入只有一个错误检查

程序的简化版本,它确实可以工作:

在编程中,首先需要学习的是如何编写函数和子例程。这一点很重要,因为它可以让你把问题分解成越来越小的部分,直到问题很容易解决。这涉及到许多编程原则,其中2个是单一责任原则状态:

每个模块、类或函数都应该对软件提供的功能的单个部分负责,并且该责任应该完全由该模块、类或者函数封装。

和KISS原理(保持简单(。

#include <stdio.h>
#include <stdbool.h>
#define ARR 100
static int get_user_input(int array[ARR])
{
int count = 0;
do {
printf("Enter the number of array: ");
scanf("%d", &count);
} while (count < 1 || count > ARR);
printf("Enter array: ");
for (int i = 0; i < count; i++) {
scanf("%1d", &array[i]);
}
return count;
}
static bool find_first_repetition(int count, int array[ARR])
{
bool repetition = false;

for (int i = 1; i < count; i++)
{
if (array[i - 1] == array[i])
{
return true;
}
}
return repetition;
}
int main() {
int n;
int num[ARR];
n = get_user_input(num);
if (find_first_repetition(n, num))
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}  

您的代码可以工作,但存在一些问题:

  • 您应该测试scanf()中的转换失败:返回值必须是1,因为每个scanf()调用都有一个转换。

  • 计数循环太复杂了:只计算2个嵌套循环的出现次数要简单得多,时间复杂度也相当,并且在大多数架构上使用a += (array[i] == array[j]);可能会产生快速的无分支代码。

  • 用换行符完成程序输出是一种很好的风格。

这是一个修改后的版本:

#include <stdio.h>
int main() {
int n;
do {
printf("Enter the length of the array: ");
if (scanf("%d", &n) != 1)
return 1;
} while (n < 1 || n > 100);
double array[n];
printf("Enter array: ");
for (int i = 0; i < n; i++) {
if (scanf("%lf", &array[i]) != 1)
return 1;
}
int p = 1;
for (int i = 0; i < n; i++) {
int a = 0;
for (int j = 0; j < n; j++) {
a += (array[i] == array[j]);
}
if (a != 2) {
p = 0;
break;
}
}
if (p == 1)
printf("YESn");
else
printf("NOn");
return 0;
}

最新更新