以下に示すように、温度の詳細を操作するプログラムを作成します。
-計算する日数を入力します。 - メイン機能
-摂氏温度での入力温度-入力関数
-温度を摂氏から華氏に変換します。-別の機能
-華氏の平均気温を見つけます。
配列の初期サイズなしでこのプログラムを作成するにはどうすればよいですか?
#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;
}
}
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);
覚えておいてください-割り当てられた領域の外側にアクセスすると、未知の影響があります。
初期サイズのない配列は、基本的にポインタです。配列のサイズを動的に設定するには、malloc()
またはcalloc()
関数を使用する必要があります。これらは、指定された量のメモリを割り当てます。
上記のコードで、temp
をintとして宣言しますpointer
_int *temp;
_
次に、malloc()
またはcalloc()
を使用してスペースを割り当てます。これらの関数が取る引数は、割り当てるメモリのbytesの数です。この場合、d
intsに十分なスペースが必要です。そう...
_temp = malloc(d * sizeof(int));
_
malloc
は、割り当てられたばかりのメモリブロックの最初のバイトへのポインタを返します。通常の配列は、メモリのセクション化されたブロックの最初のバイトへの単なるポインタです。これは、まさにtemp
になりました。したがって、temp
ポインターを配列として扱うことができます!そのようです:
_temp[1] = 10;
int foo = temp[1];
printf("%d", foo);
_
出力
_10
_
(temp
配列ではなく)int
ポインターとしてint
を宣言する必要があります。次に、malloc
でmain
を使用できます(最初のscanf
の後)。
temp = malloc(d * sizeof(int));
コンパイラが_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();
}
_
日付入力後、main()
内で_temp[]
_が定義されるようになりました。
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]);
}
}
_
あなたがそれをはっきりと見ることができるように、私は何も変更しませんでした。
#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;
}
}
サイズを読み取った後、ヒープに「配列」を動的に割り当てます。