该程序的目的是在一维数组中读取10个双精度值,然后在标准输出上搜索并打印出数组中的最大值和最小值。我尝试在纸上做一些伪代码,以帮助我更好地理解这个问题,到目前为止,我认为可行的是使用if
语句检查最小值和最大值的函数。由于我在C中缺乏知识,我不确定使用数组函数的正确格式。如果你能给我一个关于函数应该如何使用数组的框架,这将是很好的,因为我想学习和尝试该程序。
下面我已经附加了循环10次的主程序并将用户输入收集为数组:
#include<stdio.h>
// main program
int main() {
int i;
double num[10];
for (i = 1; i <= 10; i++) {
printf("Enter a number: ");
scanf("%lf",&num);
}
return 0;
}
答案 0 :(得分:2)
scanf("%lf",&num);
将调用未定义的行为,因为double(*)[10]
会在预期double*
的位置传递。
如果要使用数组,则应该读取每个元素。请注意,C中的数组索引从0开始,而不是1.您还应检查读取是否成功。
#include<stdio.h>
// main program
int main(void){
int i;
double num[10];
for (i=1;i<=10;i++){
printf("Enter a number: ");
if (scanf("%lf",&num[i - 1]) != 1){
puts("read error");
return 1;
}
}
// calculate max and minimum values and print them
return 0;
}
或此代码使用i
范围内更好的内容。
#include<stdio.h>
// main program
int main(void){
int i;
double num[10];
for (i=0;i<10;i++){
printf("Enter a number: ");
if (scanf("%lf",&num[i]) != 1){
puts("read error");
return 1;
}
}
// calculate max and minimum values and print them
return 0;
}
答案 1 :(得分:2)
如果除了其他答案之外,您打算编写/调用函数以查找 max 和 min 值你的双打数组,你的第一个挑战是克服只有一个单值(或指针)可以由C中的函数返回的公理。有几个选项可用于确定 max <函数(或函数)中的/ em>和 min 。
第一个也是显而易见的替代方案是同时编写 max 和 min 函数并调用每个函数。 (但这需要迭代你的数组两次 - 这将不是最佳的)。您的下一个选项是传递一个单独的数组(至少有2个双精度值)来存储您的 max 和 min 值,并更新值或返回指向该值的指针数组
(传递数组会自动使存储在 maxmin 数组中的值可用于您的调用函数(在您的情况下为main()
),但要立即使用同一调用中的值,为方便起见,您可以返回指向 max / min 数组的指针。您还可以在出错时返回NULL
以指示失败)
或者,由于只需要2个值,您可以将单个指针传递给 max 和 min 作为参数,并更新函数中每个指向的值。选择一些返回类型来指示成功/失败也是一个好主意。在这种情况下,int
与其他任何一种一样有效(从数字转换的角度来看更好)
考虑到这一点,一个简单的 maxmin 函数获取指向double值数组的指针,指向每个 max 和 min 的指针,最后数组中的值的数量可以写成:
/** find the max and min in array of 'n' doubles `ad`.
* update 'max' and 'min' pointers so values are available back
* in calling function.
*/
int maxmin_dbl (double *ad, double *max, double *min, size_t n)
{
if (!ad || !max || !min) return 0; /* validate parameters */
*max = (double)LLONG_MIN; /* initialize max/min to sufficiently */
*min = (double)LLONG_MAX; /* large negative/positive values. */
size_t i;
for (i = 0; i < n; i++) {
if (ad[i] > *max) *max = ad[i]; /* test for new max */
if (ad[i] < *min) *min = ad[i]; /* test for new min */
}
return 1;
}
(注意:如果您的数据值超出LLONG_MIN
和LLONG_MAX
的范围,则需要相应地调整初始值。)
一个简短的示例程序,从作为第一个参数(或默认情况下来自stdin
)的文件名中读取值,并写入数组值和最大和最小值 stdout
可以写成:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
enum { MAXD = 10 }; /* constant for no. of values */
int maxmin_dbl (double *ad, double *max, double *min, size_t n);
int main (int argc, char **argv) {
size_t i, n;
double max, min, tmp, ad[MAXD] = {0.0};
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
/* read double values from fp until at most 10 values read */
for (n = 0; n < MAXD && fscanf (fp, " %lf", &tmp) == 1; n++)
ad[n] = tmp;
if (fp != stdin) fclose (fp); /* close file if not stdin */
printf ("\narray values:\n\n"); /* output the values read */
for (i = 0; i < n; i++)
printf (" ad[%2zu] : %13.2lf\n", i, ad[i]);
if (maxmin_dbl (ad, &max, &min, n)) /* get max/min from array */
printf ("\n maximum : %.2lf\n minimum : %.2lf\n\n", max, min);
else {
fprintf (stderr, "error: maxmin_dbl failed.\n");
return 1;
}
return 0;
}
/** find the max and min in array of 'n' doubles `ad`.
* update 'max' and 'min' pointers so values are available back
* in calling function.
*/
int maxmin_dbl (double *ad, double *max, double *min, size_t n)
{
if (!ad || !max || !min) return 0; /* validate parameters */
*max = (double)LLONG_MIN; /* initialize max/min to sufficiently */
*min = (double)LLONG_MAX; /* large negative/positive values. */
size_t i;
for (i = 0; i < n; i++) {
if (ad[i] > *max) *max = ad[i]; /* test for new max */
if (ad[i] < *min) *min = ad[i]; /* test for new min */
}
return 1;
}
示例使用/输出
$ ./bin/arrdbl_maxmin <../dat/10int_nl.txt
array values:
ad[ 0] : 8572.00
ad[ 1] : -2213.00
ad[ 2] : 6434.00
ad[ 3] : 16330.00
ad[ 4] : 3034.00
ad[ 5] : 12346.00
ad[ 6] : 4855.00
ad[ 7] : 16985.00
ad[ 8] : 11250.00
ad[ 9] : 1495.00
maximum : 16985.00
minimum : -2213.00
查看所有答案,即直接解决错误的答案,如果您有任何其他问题,请告诉我们。
答案 2 :(得分:1)
如果您询问函数应该如何工作,请尝试理解这个伪代码:
您的功能可以这样定义:
double max(double arr[], int size) {
// have a variable that stores the current max number
double currmax = -1;
// loop over arr and for each element,
// compare if it's greater than the current max number
// if it is, replace the current max number to this element's value
// after you've gone through all the elements in arr, return the current max number
return currmax;
}
您可以像这样调用您的函数:
double the_biggest_number_ever = max(arr, 10);
你必须传递数组大小的原因是因为没有它,函数max
将不知道你的数组中有多少元素。您可以使用它来遍历max
函数中的元素。
答案 3 :(得分:0)
MikeCAT关于数组索引的东西是正确的。您希望在每个索引处读入num
。
此外,关于拥有一个带数组的函数,签名将是double arr[]
,其中arr是参数的名称。请注意,C数组不会存储大小,因此您经常需要将其与数组一起传递:
double max(double arr[], int size) { ... }
int main(int argc, char **argv) {
double arr[10];
/* ... fill arr ... */
double maximum = max(arr, 10);
/* ... */
return 0;
}
答案 4 :(得分:0)
#include <stdio.h>
int main()
{
int array[100], maximum, size, c, location = 1;
printf("Enter the number of elements in array\n");
scanf("%d", &size);
printf("Enter %d integers\n", size);
for (c = 0; c < size; c++)
scanf("%d", &array[c]);
maximum = array[0];
for (c = 1; c < size; c++)
{
if (array[c] > maximum)
{
maximum = array[c];
location = c+1;
}
}
printf("Maximum element is present at location %d and it's value is %d.\n", location, maximum);
return 0;
}
在这里,您可以制作数组长度并获取最高编号的位置
答案 5 :(得分:0)
感谢所有人提供的所有信息,我设法在不使用功能的情况下回答了这个问题。这是我的代码:
#include <stdio.h>
// main program
int main(void){
int i;
double num[10],max,min;
for (i=0;i<10;i++){
printf("Enter a number: ");
if (scanf("%lf",&num[i]) != 1){
puts("invalid input");
return 1;
}
}
// calculate max and minimum values and print them
min=num[0];
max=num[0];
for(int i=1;i<10;i++)
{
if(min>num[i])
{
min=num[i];
}
else if(max<num[i])
{
max =num[i];
}
}
printf("The max is %lf and the min is %lf",max,min);
return 0;
}
答案 6 :(得分:0)
最好的方法是按升序或降序对包含元素的数组进行排序,并将show first和last值作为最小值和最大值。
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(data[i]<data[j])
{
double temp;
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
}
答案 7 :(得分:0)
未来考虑的迂腐说明:许多系统允许double
可以采用not-a-number 值。在这种情况下,如果a > b
为NaN
,则NaN
将为false。通常,在查找包含NaN
的列表的最小值/最大值时,将忽略这些值。由于第一个数字可能是not <=
,因此最多使用>
代替#include <math.h>
#include <stdio.h>
#define N 10
int main(void) {
size_t i;
double num[N];
for (i = 0; i < N; i++) {
printf("Enter a number: ");
if (scanf("%lf",&num[i]) != 1) return -1;
}
double maximum = num[0];
double minimum = num[0];
for (i = 1; i < N; i++) {
if (isnan(num[i])) continue;
if (!(num[i] >= minimum)) minimum = num[i];
if (!(num[i] <= maximum)) maximum = num[i];
}
printf("min: %e\n", minimum);
printf("max: %e\n", maximum);
}
。
{{1}}