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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しょしょしょしんしゃ

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

#1

投稿記事 by しょしょしょしんしゃ » 16年前

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:質問です。よろしくおねがいします。

#2

投稿記事 by 御津凪 » 16年前

N の型はint 型にし、*N を N に直し、
N=(int*)calloc(*N,sizeof(int)); 
を、
ary=(int*)malloc(sizeof(int)*N); 
とし、(aryは新しく int* 型変数として用意すること)

for 文内の処理を直せば、
正しく動くはずです。
# あと、<pre></pre>では無く、<printf></printf>でくくってませんか?

初級者

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

#3

投稿記事 by 初級者 » 16年前

>C言語の構造体の質問です。

構造体はどこに登場するのですか?

しょしょしょしんしゃ

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

#4

投稿記事 by しょしょしょしんしゃ » 16年前

すいませんでした 勘違いでした
#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:質問です。よろしくおねがいします。

#5

投稿記事 by 御津凪 » 16年前

実行時の表示上、配列に入っているように見えますが、
実際には代入されていません。
(for 文で単に i を出力しているのと同じ)
for 文をもう一つ用意し、そこで N = i; で代入し、
その後で配列 N に格納されている値を表示する処理にすれば、
問題文の条件に合います。

と、もう一つ。
while(1001<N);
だと、1001を入力すると通ってしまうので、
while(1000<N);
か、
while(N<1001);
に直してください。

初級者

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

#6

投稿記事 by 初級者 » 16年前

mallocで確保する領域の大きさが0以下だと、
なんだかまずいことになりそうです。
whileの条件を
1~1000でない
にする方がよいかもしれません。

>御津凪さん
N = i; で代入することはできません。
動的に確保したaryを使わないとまずいです。

御津凪

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

#7

投稿記事 by 御津凪 » 16年前

> N = i; で代入することはできません。
あ、間違えました;;
ary = i; でしたね。すみません。

しょしょしょしんしゃ

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

#8

投稿記事 by しょしょしょしんしゃ » 16年前

>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:質問です。よろしくおねがいします。

#9

投稿記事 by 御津凪 » 16年前

#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:質問です。よろしくおねがいします。

#10

投稿記事 by 初級者 » 16年前

作ったプログラムを、ちゃんとテストしていますか?

> }while(!(N>1&&N<1000));

これだと、2~999の場合に対応することになってしまいます。

しょしょしょしんしゃ

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

#11

投稿記事 by しょしょしょしんしゃ » 16年前

このようになりました。
#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:質問です。よろしくおねがいします。

#12

投稿記事 by 初級者 » 16年前

// 自分だったらこんな風に書く、という例です。
// 実質的な動きは同じです。

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

閉鎖

“C言語何でも質問掲示板” へ戻る