ページ 11

質問です。よろしくおねがいします。

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;
}