C言語関係掲示板

過去ログ

No.185.1からNまでの総和を求めるプログラム


No.1181

プログラムを教えて下さい2
投稿者---Airin(2002/03/06 14:29:13)


自分では解くことができないので分かる方がいらしたら教えて下さい。

Nの値を入力し、1からNまでの総和を求めます。Nが0以下または10以上の値が入力されるとプログラムを終了します。

このプログラムでwhileがわからないので適当に入れて実行すると、1つ目の演算はちゃんとやってくれるのですが、2つ目を入れるとなぜか一つ目の和に足していってしまいます。ほかの場所も間違っているのでしょうか?

#include<stdio.h>
void main(void)
{
int n,i,sum;

sum=0;
printf("Nの値を入力してください:");
scanf("%d",&n);
while(****)
{
for(i=1;i<=n;i++)
{
sum=sum+i
;
}
printf("1から%dまでの値の総和は%dです\n",n,sum);
printf("Nの値を入力してください:");
scanf("%d",&n);
}
printf("おしまい\n");
}


Nの値を入力してください:5
1から5までの総和は15です。
Nの値を入力してください:7
1から7までの総和は28です。
Nの値を入力してください:-1
おしまい

↑の様に実行結果が出るようにしたいのです。お願いします。




No.1183

Re:プログラムを教えて下さい2
投稿者---ともじ(2002/03/06 14:43:11)


こんにちは。

>Nの値を入力し、1からNまでの総和を求めます。Nが0以下または10以上の値が入力されるとプログラムを終了します。
>
>このプログラムでwhileがわからないので適当に入れて実行すると、1つ目の演算はちゃんとやってくれるのですが、2つ目を入れるとなぜか一つ目の和に足していってしまいます。ほかの場所も間違っているのでしょうか?

これは、sumを初期化する位置が違いますね。
次のように、whileループの中で初期化するようにしてください。

#include<stdio.h>
void main(void)
{
	int n,i,sum;

	printf("Nの値を入力してください:");
	scanf("%d",&n);
	while(n>0 && n<10)
	{
		sum = 0;
		for(i=1;i<=n;i++)
		{
			sum=sum+i;
		}
		printf("1から%dまでの値の総和は%dです\n",n,sum);
		printf("Nの値を入力してください:");
		scanf("%d",&n);
	}
	printf("おしまい\n");
}


No.1185

Re:プログラムを教えて下さい2
投稿者---C職人(2002/03/06 15:37:55)


>こんにちは。
>
>>Nの値を入力し、1からNまでの総和を求めます。Nが0以下または10以上の値が入力されるとプログラムを終了します。
>>
>>このプログラムでwhileがわからないので適当に入れて実行すると、1つ目の演算はちゃんとやってくれるのですが、2つ目を入れるとなぜか一つ目の和に足していってしまいます。ほかの場所も間違っているのでしょうか?
>
>これは、sumを初期化する位置が違いますね。
>次のように、whileループの中で初期化するようにしてください。
>
>#include<stdio.h>
><pre>
void main(void)
{
int n,i,sum;

printf("Nの値を入力してください:");
scanf("%d",&n);
while(n>0 && n<10)
{
sum = 0;
for(i=1;i<=n;i++)
{
sum=sum+i;
}
printf("1から%dまでの値の総和は%dです\n",n,sum);
printf("Nの値を入力してください:");
scanf("%d",&n);
}
printf("おしまい\n");
}
</pre>

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

#define TRUE 0
#define FALSE 1

void check(char *);
int numChk(char *);

char buf[1+1];

void main(void)
{
int n,i,sum;

sum=0;
printf("Nの値を入力してください:");
gets(buf);
check(buf);
n=atoi(buf);

while(n >0 && n<10)
{
for(i=1;i<=n;i++)
{
sum = sum + i;
}
printf("1から%dまでの値の総和は%dです\n",n,sum);
sum=0;
printf("Nの値を入力してください:");
gets(buf);
check(buf);
n=atoi(buf);
}
}
void check(char *p)
{
int ret;

/*Numericチェック*/
ret=numChk(p);
if(ret==FALSE){
fprintf(stderr,"数字を入力してください。\n");
return;
}
}

int numChk(char *p)
{
int i=0;

for(i=0;strlen(p);i++){
if(*p < '0' || *p > '9'){
return FALSE;
}
p++;
}
return TRUE;
}
こんな感じですか。
エラー処理もつけてみました。


No.1189

Re:プログラムを教えて下さい2
投稿者---Airin(2002/03/06 17:14:35)


ともじさん、C職人さんお答えいただきありがとうございます。
C職人さんのは結構難しいですね。まだ知らない言葉がチラホラありました。
頑張って勉強しま。ともじさんにはもう3回もアドバイスしてもらっていますね。
毎回ありがとうございます。明日テストなので頑張ります。

No.1194

Re:プログラムを教えて下さい2
投稿者---ともじ(2002/03/06 21:06:12)


気になる点が数箇所ありました。

>char buf[1+1];

このbufは、もっと大きく取らないと、バッファオーバーの危険性が大です。
文字列を入力する場合は、最低でも80バイトは確保した方がいいのでは
ないでしょうか。

> check(buf);
> n=atoi(buf);

数値以外を入力した際にはcheck関数内でエラーを出力するようですが、
せっかくエラーチェックをするのなら、エラーの場合にはatoi変換
はしないで再入力を促した方がよいのではないでしょうか。

> for(i=0;strlen(p);i++){

ここは、strlenを使うより、
  while(*p) {
の方が関数呼び出しのオーバーヘッドが減る分よいように
思います。


No.1212

Re:プログラムを教えて下さい2
投稿者---C職人(2002/03/07 14:35:09)


>気になる点が数箇所ありました。
>
>>char buf[1+1];
>
>このbufは、もっと大きく取らないと、バッファオーバーの危険性が大です。
>文字列を入力する場合は、最低でも80バイトは確保した方がいいのでは
>ないでしょうか。


おっしゃる通りですね。
0から9までの入力値しか正常なものとしてみなさないということだったので
buf[1+1]のようにしてしまいましたが、標準入力からだと何桁入力するかわからないでもんね。

>
>> check(buf);
>> n=atoi(buf);
>
>数値以外を入力した際にはcheck関数内でエラーを出力するようですが、
>せっかくエラーチェックをするのなら、エラーの場合にはatoi変換
>はしないで再入力を促した方がよいのではないでしょうか。
>
>> for(i=0;strlen(p);i++){
>
>ここは、strlenを使うより、
>  while(*p) {
>の方が関数呼び出しのオーバーヘッドが減る分よいように
>思います。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved