質問です。よろしくおねがいします。
質問です。よろしくおねがいします。
C言語の構造体の質問です。
問題は、
外部から正の整数Nを入力したとき、
N個のint型配列を確保して、
i番目の要素をiで初期化するプログラムの作成で、
プログラムを実行する際にはNは1000以下にすること。
自分なりに考えてみましたが、
printf/
#include<stdio.h>
#include<stdlib.h>
int main(void){
int *N;
int i;
printf("1000以下の整数Nを入力してください\n");
scanf("%d",&N);
N=(int*)calloc(*N,sizeof(int));
for(i=0;i<*N;i++){
printf("N[%d]=%d\n",i,N);
}
free(N);
return 0;
}/printf
このようになりましたが、うまくできませんでした。
メモリの動的割り付けを使用に問題があるのでしょうか?
間違いや、勘違いしている点があれば、教えてください。
問題は、
外部から正の整数Nを入力したとき、
N個のint型配列を確保して、
i番目の要素をiで初期化するプログラムの作成で、
プログラムを実行する際にはNは1000以下にすること。
自分なりに考えてみましたが、
printf/
#include<stdio.h>
#include<stdlib.h>
int main(void){
int *N;
int i;
printf("1000以下の整数Nを入力してください\n");
scanf("%d",&N);
N=(int*)calloc(*N,sizeof(int));
for(i=0;i<*N;i++){
printf("N[%d]=%d\n",i,N);
}
free(N);
return 0;
}/printf
このようになりましたが、うまくできませんでした。
メモリの動的割り付けを使用に問題があるのでしょうか?
間違いや、勘違いしている点があれば、教えてください。
Re:質問です。よろしくおねがいします。
N の型はint 型にし、*N を N に直し、 N=(int*)calloc(*N,sizeof(int)); を、 ary=(int*)malloc(sizeof(int)*N); とし、(aryは新しく int* 型変数として用意すること) for 文内の処理を直せば、 正しく動くはずです。# あと、<pre></pre>では無く、<printf></printf>でくくってませんか?
Re:質問です。よろしくおねがいします。
すいませんでした 勘違いでした
#include<stdio.h> #include<stdlib.h> int main(void){ int N; int i; int *ary; do{ printf("1000以下の整数Nを入力してください\n"); scanf("%d",&N); }while(1001<N); ary=(int*)malloc(sizeof(int)*N); for(i=0;i<N;i++){ printf("N[%d]=%d\n",i,i); } free(ary); return 0; }とすることができましたが、これでよろしいのでしょうか?
Re:質問です。よろしくおねがいします。
実行時の表示上、配列に入っているように見えますが、
実際には代入されていません。
(for 文で単に i を出力しているのと同じ)
for 文をもう一つ用意し、そこで N = i; で代入し、
その後で配列 N に格納されている値を表示する処理にすれば、
問題文の条件に合います。
と、もう一つ。
while(1001<N);
だと、1001を入力すると通ってしまうので、
while(1000<N);
か、
while(N<1001);
に直してください。
実際には代入されていません。
(for 文で単に i を出力しているのと同じ)
for 文をもう一つ用意し、そこで N = i; で代入し、
その後で配列 N に格納されている値を表示する処理にすれば、
問題文の条件に合います。
と、もう一つ。
while(1001<N);
だと、1001を入力すると通ってしまうので、
while(1000<N);
か、
while(N<1001);
に直してください。
Re:質問です。よろしくおねがいします。
mallocで確保する領域の大きさが0以下だと、
なんだかまずいことになりそうです。
whileの条件を
1~1000でない
にする方がよいかもしれません。
>御津凪さん
N = i; で代入することはできません。
動的に確保したaryを使わないとまずいです。
なんだかまずいことになりそうです。
whileの条件を
1~1000でない
にする方がよいかもしれません。
>御津凪さん
N = i; で代入することはできません。
動的に確保したaryを使わないとまずいです。
Re:質問です。よろしくおねがいします。
>ary = i; でしたね。すみません。
> for 文をもう一つ用意し、そこで ary = i; で代入し、
その後で配列 N に格納されている値を表示する処理にすれば、
問題文の条件に合います。
とありますが、どこに入れればいいのですか?
よろしくお願いします。
> for 文をもう一つ用意し、そこで ary = i; で代入し、
その後で配列 N に格納されている値を表示する処理にすれば、
問題文の条件に合います。
とありますが、どこに入れればいいのですか?
#include<stdio.h> #include<stdlib.h> int main(void){ int N; int i; int *ary; for(){ //ここにいれればいいのですか? } do{ printf("1000以下の整数Nを入力してください\n"); scanf("%d",&N); }while(!(N>1&&N<1000)); ary=(int*)malloc(sizeof(int)*N); for(i=0;i<N;i++){ printf("a[%d]=%d\n",i,ary); } free(ary); return 0; }
よろしくお願いします。
Re:質問です。よろしくおねがいします。
#include<stdio.h> #include<stdlib.h> int main(void){ int N; int i; int *ary; do{ printf("1000以下の整数Nを入力してください\n"); scanf("%d",&N); }while(!(N>1&&N<1000)); ary=(int*)malloc(sizeof(int)*N); for(i=0;i<N;i++){ //ここですね。 } for(i=0;i<N;i++){ //ここでもいいですが。 printf("a[%d]=%d\n",i,ary); } free(ary); return 0; }
Re:質問です。よろしくおねがいします。
作ったプログラムを、ちゃんとテストしていますか?
> }while(!(N>1&&N<1000));
これだと、2~999の場合に対応することになってしまいます。
> }while(!(N>1&&N<1000));
これだと、2~999の場合に対応することになってしまいます。
Re:質問です。よろしくおねがいします。
このようになりました。
ご丁寧な回答ありがとうございます。
他に間違いがあれば 教えてください。
#include<stdio.h> #include<stdlib.h> int main(void){ int N; int i; int *ary; do{ printf("1000以下の整数Nを入力してください\n"); scanf("%d",&N); }while(!(N>0&&N<1001)); ary=(int*)malloc(sizeof(int)*N); for(i=0;i<N;i++){ ary=i; printf("a[%d]=%d\n",i,ary); } free(ary); return 0; }
ご丁寧な回答ありがとうございます。
他に間違いがあれば 教えてください。
Re:質問です。よろしくおねがいします。
// 自分だったらこんな風に書く、という例です。 // 実質的な動きは同じです。 #include <stdio.h> #include <stdlib.h> int main(void) { int N, i, *ary; // 字下げのメリハリを付ける // do, if, forなどの勢力範囲が一目瞭然になるように書く do { printf("1000以下の整数Nを入力してください\n"); scanf("%d", &N); } while (!(1 <= N && N <= 1000)); // 「1~1000以外はダメ」が直感的にわかる ary = (int *) malloc(sizeof(int) * N); // メモリー確保に失敗したときの記述は必須 if (!ary) { fprintf(stderr, "out of memory\n"); exit(1); } for (i = 0; i < N; i++) { ary = i; printf("a[%d]=%d\n", i, ary); } free(ary); return 0; }