程序应该去掉所有重复的数字,并将剩下的数字按升序排序。我知道如何打印唯一的数字,但我不知道如何从它们创建一个新的向量,我可以稍后排序。
#include <stdio.h>
void unique(double arr[], int n) {
int i, j, k;
int ctr = 0;
for (i = 0; i < n; i++) {
printf("element - %d : ",i);
scanf("%lf", &arr[i]);
}
for (i = 0; i < n; i++) {
ctr = 0;
for (j = 0, k = n; j < k + 1; j++) {
if (i != j) {
if (arr[i] == arr[j]) {
ctr++;
}
}
}
if (ctr == 0) {
printf("%f ",arr[i]);
}
}
}
int main() {
double arr[100];
int n;
printf("Input the number of elements to be stored in the array: ");
scanf("%d", &n);
unique(arr, n);
}
你总是可以把大问题分解成小问题。
首先创建一个函数,检查一个值是否已经存在于数组中。
然后创建一个用值填充数组的函数。在添加该值之前,请检查该值是否在数组中。如果是,你跳过它。
然后创建一个对数组排序的函数。另外,qsort
是一个库函数,通常用于对数组进行排序。
这远不是有效的,但应该相当容易理解:
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUMS 256
int find(double *arr, size_t length, double val)
{
for (size_t i = 0; i < length; i++)
if (val == arr[i])
return 1;
return 0;
}
size_t fill_with_uniques(double *arr, size_t limit)
{
size_t n = 0;
size_t len = 0;
while (n < limit) {
double value;
printf("Enter value #%zu: ", n + 1);
if (1 != scanf("%lf", &value))
exit(EXIT_FAILURE);
/* if value is not already in the array, add it */
if (!find(arr, len, value))
arr[len++] = value;
n++;
}
return len;
}
int compare(const void *va, const void *vb)
{
double a = *(const double *) va;
double b = *(const double *) vb;
return (a > b) - (a < b);
}
int main(void)
{
double array[MAX_NUMS];
size_t count;
printf("Input the number of elements to be stored in the array: ");
if (1 != scanf("%zu", &count))
exit(EXIT_FAILURE);
if (count > MAX_NUMS)
count = MAX_NUMS;
size_t length = fill_with_uniques(array, count);
/* sort the array */
qsort(array, length, sizeof *array, compare);
/* print the array */
printf("[ ");
for (size_t i = 0; i < length; i++)
printf("%.1f ", array[i]);
printf("]n");
}
上面我们从stdin
读取值。或者,fill_with_uniques
可以取两个数组,一个source
和一个destination
,并将前者的值复制到后者,只有当它们是唯一的。
记住永远不要忽略scanf
的返回值,它是发生的成功转换的次数(换句话说,变量赋值)。否则,如果用户输入了一些意想不到的东西,你的程序可能会对不确定的值进行操作。