17

编写一个程序来操纵温度细节,如下所示。
- 输入要计算的天数。- 主要功能
- 以摄氏度输入温度 - 输入功能
- 将温度从摄氏温度转换为华氏温度。 - 单独功能
- 以华氏温度计算平均温度。

如何在没有数组初始大小的情况下制作这个程序?

#include<stdio.h>
#include<conio.h>
void input(int);
int temp[10];
int d;
void main()
{
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
        t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
}
void input(int d)
{
    int x=0;
    for(x=0;x<d;x++)
    {
        printf("Input temperature in Celsius for #%d day",x+1);
        scanf("%d",&temp[x]);
    }
}
void conv()
{
    int x=0;
    for(x=0;x<d;x++)
    {
        temp[x]=1.8*temp[x]+32;
    }
}
4

8 回答 8

28

在 C 中,数组和指针密切相关。事实上,按照设计,数组只是访问指向已分配内存的指针的语法约定。*(请参阅下面的注释了解更多详细信息)

所以在 C 中声明

 anyarray[n] 

是相同的

 *(anyarray+n)

使用指针算法。

您实际上不必担心细节以使其“工作”,因为它的设计有点直观。

只需创建一个指针,分配内存,然后像数组一样访问它。

这里有一些例子——

int *temp = null; // this will be our array


// allocate space for 10 items
temp = malloc(sizeof(int)*10);


// reference the first element of temp
temp[0] = 70;


// free the memory when done
free(temp);

请记住——如果您在分配区域之外访问,您将产生未知的影响。

  • 需要明确的是,索引运算符 ( [ ]) 被转换为指针算术。这不是现代意义上的类型数组。所涉及的指针是否(或是否)指向(动态)分配的内存与此运算符的工作方式无关。在更现代的语言中,您可以将数组作为抽象类型进行操作(例如,查看它有多大),而在 C 中则无法做到这一点。
于 2013-06-29T15:45:29.677 回答
5

没有初始大小的数组基本上只是一个指针。为了动态设置数组的大小,需要使用malloc()orcalloc()函数。这些将分配指定数量的内存字节。

在上面的代码中,声明temp为 int指针

int *temp;

然后使用malloc()or为其分配空间calloc()。这些函数采用的参数是要分配的内存字节数。在这种情况下,您需要足够的空间来存放d整数。所以...

temp = malloc(d * sizeof(int));

malloc返回指向刚刚分配的内存块中第一个字节的指针。常规数组只是指向分段内存块中第一个字节的指针,这正是temp现在的样子。因此,您可以将temp指针视为数组!像这样:

temp[1] = 10;
int foo = temp[1];
printf("%d", foo);

输出

10
于 2013-06-29T16:05:37.797 回答
2

如果您的编译器支持c99,那么只需使用VLA(可变长度数组)。像这样使用:

void input(int);

 int d;
 void main()
 {
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    int temp[d];
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
       t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
  }

现在temp[]main()在日期输入之后定义的。

于 2013-06-29T15:53:21.517 回答
2

您需要声明tempint指针(而不是int数组)。然后,您可以malloc在您的main(在您的第一个之后scanf)使用:

temp = malloc(d * sizeof(int));
于 2013-06-29T15:46:30.450 回答
1

1-#include<stdlib.h>在文件顶部添加。然后修改 conv() 代码如下:
2- 修改临时声明如下(全局变量):

int *temp;

3-修改input(int d)功能如下(在Visual Studio 2010上测试):

  void input(int d)
    {
        int x=0;
        temp=(int*)malloc(sizeof(int)*d);
        for(x=0;x<d;x++)
        {
            printf("Input temperature in Celsius for #%d day",x+1);
            scanf("%d",&temp[x]);
        }
    }
于 2014-11-03T17:21:12.910 回答
0

读取大小后,在堆上动态分配“数组”。

于 2013-06-29T15:43:13.617 回答
0

我没有更改任何其他内容,因此您可以清楚地看到它。

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>   //here
void input(int);
int *temp=0;  //here
int d;
void main()
{
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    temp=malloc(d * sizeof(int));  //here
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
        t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
}
void input(int d)
{
    int x=0;
    for(x=0;x<d;x++)
    {
        printf("Input temperature in Celsius for #%d day",x+1);
        scanf("%d",&temp[x]);
    }
}
void conv()
{
    int x=0;
    for(x=0;x<d;x++)
    {
        temp[x]=1.8*temp[x]+32;
    }
}
于 2013-06-29T16:12:18.567 回答
0

也许现在回答已经晚了,但是......如果您使用小型嵌入式系统,您可能没有 malloc 和 free 功能。所以你必须牺牲内存366 * sizeof(your_type),静态定义它并用作循环缓冲区。然后,您始终可以按需要计算平均值的天数对其进行切片。当然,这会产生自然约束。你可以自己定义。

于 2020-10-01T09:42:56.647 回答