C言語超初級質問

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

C言語超初級質問

#1

投稿記事 by CC » 13年前

C言語初心者です。つまづいたのでどなたかご教授いただければ幸いです。
いくつかの数字を入力して(-1が入力された時点で終了とする)そのなかから最大、最小を別の関数で求めてその結果を表示するというプログラムをつくろうとしています。(ホームページ苦しんで覚えるC言語の演習問題より)。どうしてもこのままではsegmentation fault(コアダンプ)というエラーがでてしまいます。どういう風に直せばいいのか教えてもらいたいです。またこのプログラムが根本的にダメな場合は考え方などもおしえていただきたいです。

コード:

#include<stdio.h>
int func();
int main(void)
{
	int data[10],i=0,max,min;
	printf("数字を入力してください、終了の場合は-1を入力\n");
	do{
	printf("%d;",i+1);
	scanf("%d",&data[i]);
	i++;
	}while(data[i-1]!=-1);
	func(data[10],&max,&min);
	printf("%d%d",max,min);
return;
}

int func(int array[],int *max, int *min)
{
	int num=0,i=0;
	*max=array[num];
	
	while(array[num]!=-1){
		if(*max>array[num+i+1]){
			*max=array[num];
			i++;
		}else{
			*max=array[num+i+1];
			i++;
		}
	}
	
	while(array[num+i+1]!=-1){
		if(*min<array[num+i+1]){
			i++;	
		}else{
			*min=array[num+i+1];
		}
	}
return;
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: C言語超初級質問

#2

投稿記事 by みけCAT » 13年前

func関数内でnumを変えていないので、array[0]!=-1なら(デバッガなどでメモリが書き変わらない限り)永遠にarray[num]!=-1です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

Re: C言語超初級質問

#3

投稿記事 by box » 13年前

CC さんが書きました:

コード:

int func();
プロトタイプ宣言を書くのであれば、引数の型を書きましょう。
CC さんが書きました:

コード:

	int data[10],i=0,max,min;
	func(data[10],&max,&min);
func関数の第1引数で配列全体を渡しているつもりかもしれませんが、
実際にはそうなっていません。
data[10]というのは、配列の1要素に過ぎません。しかも、定義範囲外の領域です。
func関数に配列全体を渡したい場合は、おそらく

コード:

	func(data,&max,&min);
のように書く必要があるでしょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: C言語超初級質問

#4

投稿記事 by みけCAT » 13年前

funcの戻り値の型がintなのに、returnで戻り値を返していないのもよくないです。

自分も組んでみました。

コード:

#include <stdio.h>
#include <stdlib.h>

typedef struct input_t_tag {
	int thisValue;
	struct input_t_tag* next;
} input_t;

void getMinMax(const input_t* first,int* min,int* max);

int main(void) {
	int count;
	input_t* first=NULL;
	input_t** nextInput;
	int min,max;
	nextInput=&first;
	printf("数字を入力してください、終了の場合は-1を入力\n");
	for(count=1;;count++) {
		int input;
		printf("%5d : ",count);
		scanf("%d",&input);
		if(input==-1)break;
		*nextInput=malloc(sizeof(input_t));
		if(*nextInput==NULL)return 1;
		(*nextInput)->thisValue=input;
		(*nextInput)->next=NULL;
		nextInput=&((*nextInput)->next);
	}
	if(first==NULL) {
		puts("入力された数字がありません。");
	} else {
		getMinMax(first,&min,&max);
		printf("最大値 : %d\n最小値 : %d\n",max,min);
	}
	while(first!=NULL) {
		input_t* next=first->next;
		free(first);
		first=next;
	}
	return 0;
}

void getMinMax(const input_t* first,int* min,int* max) {
	const input_t* now;
	if(first==NULL)return;
	*min=*max=first->thisValue;
	for(now=first;now!=NULL;now=now->next) {
		if(now->thisValue>*max)*max=now->thisValue;
		if(now->thisValue<*min)*min=now->thisValue;
	}
}
最後に編集したユーザー みけCAT on 2013年3月29日(金) 19:02 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

Re: C言語超初級質問

#5

投稿記事 by box » 13年前

サンプルコードです。過度な期待は禁物です。

コード:

#include <stdio.h>

#define SZ (10)

void getMaxMin(int *arr, int *max, int *min)
{
    int i;
    
    *max = *min = arr[0];
    for (i = 1; arr[i] != -1; i++) {
        if (arr[i] > *max) {
            *max = arr[i];
        }
        if (arr[i] < *min) {
            *min = arr[i];
        }
    }
}

int main(void)
{
    int data[SZ], max, min, i;
    
    for (i = 0; i < SZ; i++) {
        printf("%d個目のデータ(-1で終了):", i + 1);
        scanf("%d", &data[i]);
        if (data[i] == -1) {
            break;
        }
    }
    if (i != 0) {       // いきなり-1を入力したときは、何もしない
        getMaxMin(data, &max, &min);
        printf("最大値:%d, 最小値:%d\n", max, min);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

CC

Re: C言語超初級質問

#6

投稿記事 by CC » 13年前

みなさんありがとうございます。これらを参考に自分でもしらべてみます。ほんとうに感謝です。

閉鎖

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