编写一个程序来操纵温度细节,如下所示
- 输入要计算的天数。 - 主要功能
- 以摄氏度输入温度 - 输入功能
- 将温度从摄氏温度转换为华氏温度.-单独的功能
- 找到华氏温度的平均气温。
如何在没有数组初始大小的情况下制作这个程序?
#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;
}
}
答案 0 :(得分:25)
在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);
请记住 - 如果您在分配区域之外访问,则会产生未知效果。
答案 1 :(得分:5)
没有初始大小的数组基本上只是指针。为了动态设置数组的大小,您需要使用malloc()
或calloc()
函数。这些将分配指定数量的内存字节。
在上面的代码中,将temp
声明为int 指针
int *temp;
然后使用malloc()
或calloc()
为其分配空间。这些函数所采用的参数是要分配的内存的字节的数量。在这种情况下,您需要足够的d
整数空间。所以......
temp = malloc(d * sizeof(int));
malloc
返回指向刚分配的内存块中第一个字节的指针。常规数组只是指向分段的内存块中第一个字节的指针,这正是temp
现在正是如此。因此,您可以将temp
指针视为数组!像这样:
temp[1] = 10;
int foo = temp[1];
printf("%d", foo);
输出
10
答案 2 :(得分:2)
您需要将temp
声明为int
指针(而不是int
数组)。然后,您可以在malloc
中使用main
(在您的第一个scanf
之后):
temp = malloc(d * sizeof(int));
答案 3 :(得分:1)
如果你的编译器支持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()
内定义。
答案 4 :(得分:1)
在文件顶部添加#include<stdlib.h>
。然后修改conv()代码,如下所示:
2-修改temp声明如下(全局变量):
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]);
}
}
答案 5 :(得分:0)
在读取大小后,在堆上动态分配“数组”。
答案 6 :(得分: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;
}
}
答案 7 :(得分:0)
也许答案来晚了,但是...
如果使用小型嵌入式系统,则可能没有malloc和free函数。
因此,您必须牺牲366 * sizeof(your_type)
的内存,对其进行静态定义并用作循环缓冲区。然后,您始终可以根据需要计算平均值的天数对其进行切片。
当然,这是自然的约束。您可以自己定义。