ページ 1 / 1
質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 20:29
by しょしょしょしんしゃ
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
このようになりましたが、うまくできませんでした。
メモリの動的割り付けを使用に問題があるのでしょうか?
間違いや、勘違いしている点があれば、教えてください。
Re:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 20:41
by 御津凪
N の型はint 型にし、*N を N に直し、
N=(int*)calloc(*N,sizeof(int));
を、
ary=(int*)malloc(sizeof(int)*N);
とし、(aryは新しく int* 型変数として用意すること)
for 文内の処理を直せば、
正しく動くはずです。
# あと、<pre></pre>では無く、<printf></printf>でくくってませんか?
Re:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 20:48
by 初級者
>C言語の構造体の質問です。
構造体はどこに登場するのですか?
Re:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 21:09
by しょしょしょしんしゃ
すいませんでした 勘違いでした
#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:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 21:17
by 御津凪
実行時の表示上、配列に入っているように見えますが、
実際には代入されていません。
(for 文で単に i を出力しているのと同じ)
for 文をもう一つ用意し、そこで N = i; で代入し、
その後で配列 N に格納されている値を表示する処理にすれば、
問題文の条件に合います。
と、もう一つ。
while(1001<N);
だと、1001を入力すると通ってしまうので、
while(1000<N);
か、
while(N<1001);
に直してください。
Re:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 21:32
by 初級者
mallocで確保する領域の大きさが0以下だと、
なんだかまずいことになりそうです。
whileの条件を
1~1000でない
にする方がよいかもしれません。
>御津凪さん
N = i; で代入することはできません。
動的に確保したaryを使わないとまずいです。
Re:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 21:40
by 御津凪
> N = i; で代入することはできません。
あ、間違えました;;
ary = i; でしたね。すみません。
Re:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 23:12
by しょしょしょしんしゃ
>ary
= i; でしたね。すみません。
> 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:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 23:25
by 御津凪
#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:質問です。よろしくおねがいします。
Posted: 2008年11月07日(金) 23:38
by 初級者
作ったプログラムを、ちゃんとテストしていますか?
> }while(!(N>1&&N<1000));
これだと、2~999の場合に対応することになってしまいます。
Re:質問です。よろしくおねがいします。
Posted: 2008年11月08日(土) 00:10
by しょしょしょしんしゃ
このようになりました。
#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:質問です。よろしくおねがいします。
Posted: 2008年11月08日(土) 00:42
by 初級者
// 自分だったらこんな風に書く、という例です。
// 実質的な動きは同じです。
#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;
}