我对这个程序的目标是让用户确定数组的大小,并为他们选择的任何大小动态分配内存。一旦用户定义了数组的大小,不超过数组大小的随机数就会被放入所有分配的位置。我遇到问题的地方是从数组中删除重复项并将其替换为未使用的值,
例如:
Please enter the size of the array:
User Input: 5
Output of code: 5, 3, 3, 1, 2
我需要它是这样的:
Please enter the size of the array:
User Input: 3
Output of program: 3, 1, 2
目前正在阅读K.N.的“C编程 - 现代方法”。国王(第二版)。
如果有人能指出我如何处理这个问题,那将非常感激。到目前为止,这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef int bool;
int main() {
int *UserData;
int TempPost;
int replace;
int UserInput;
int i;
int result;
bool digit_seen[UserInput];
int digit;
srand ((unsigned) time(NULL));
printf("Please enter the size of the array using a whole number: \n");
scanf("%d", &UserInput);
UserData = malloc(sizeof(int) * (UserInput ) +1);
for(i=0; i < UserInput; i ++) {
result = (( rand() % UserInput) + 1);
}
// check for duplicate values while putting values in array
while(UserInput>0){
digit = UserInput % UserInput;
if(digit_seen[digit])
break;
digit_seen[digit] = true;
UserInput /= UserInput;
if(UserInput > 0)
printf("Repeated digit \n");
else
printf("No repeated digit \n");
}
// Sorting the array using a Bubble sort
while(1){
replace = 0;
for (i=0; i<(UserInput - 1); i++){
if(UserData[i]>UserData[i+1]){
TempPost = UserData[i];
UserData[i] = UserData[i+1];
UserData[i+1] = TempPost;
replace = 1;
}
}
if(replace==0){
break;
}
}
printf("%d \n", result);
return 0;
}
答案 0 :(得分:0)
这不是最有效的方式,但您可以在生成随机数时执行此操作。当您选择一个随机数时,请浏览该数组的所有先前元素,看看它是否已被使用。保持循环,直到你选择一个未使用的号码。
for (i = 0; i < UserInput; i++) {
do {
result = ( rand() % UserInput) + 1;
} while (in_array(result, UserData, i-1));
UserData[i] = result;
}
int in_array(int val, int* array, int array_size) {
for (int i = 0; i < array_size; i++) {
if (array[i] == val) {
return 1;
}
}
return 0;
}
更有效的方法是将数组初始化为0
。然后,不是选择随机数,而是选择一个随机索引来填写,然后重复此操作,直到您选择包含0
的索引。
UserData = calloc(UserInput, sizeof(int));
for (i = 1; i <= UserInput; i++) {
int index;
do {
index = rand() % UserInput;
} while (UserData[index] != 0)
UserData[index] = i;
}
答案 1 :(得分:0)
你可以做的是改变阵列。只需使用简单的for循环按顺序填充数组中的所有数字,然后使用以下内容对其进行洗牌:
//read user input
//create array and fill with all the numbers in order
//[0,1,2,3,4,5 .. ... ]
int index, temp;
// size is the size of the array
for(int i = 0; i < size; i++)
{
index = rand()%size;//random place to pick from
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
与现有方法相比,这更有效 - 并且更不容易出错。