ページ 11

ポインタの理解が不十分なようです。助けてください。

Posted: 2016年4月17日(日) 20:13
by bennkyou
偶数の桁の数字をそれぞれ2倍し足したものをeven
二桁になる場合はそれぞれの桁を足す。11なら2のようにする
奇数桁の数字をたしたものをoddとする
even + odd は10 で必ず割り切れるとする。
その場合に例えば174987634726437xのように打ち込んだ場合xは何かというプログラムを作っています。

if(*(number[j]+je)<=4){
で間違ったことをやっているのは分かったのですが、なぜ間違っているのか分かる方教えてください。よろしくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>
int main(void){
    int N;
    int i;
    int j,je,jo,x;
    int even=0;
    int odd=0;
    int goukei,goukeix;
    scanf("%d",&N);
    
    char *number[100];
    for(i=0;i<N;i++){
        scanf("%s",number[i]);
    }
    for(j=0; j<N; j++){
    	
        for(je=1;je<=13;je=je+2){
            if(*(number[j]+je)<=4){
            	exit(1);
                even=even+*(number[j]+je)*2;
            }else{
                even=even+(*(number[j]+je)*2-10+1);
            }
            
        }
        
        for(jo=0;jo<=14;jo=jo+2){
            odd=odd+*(number[j]+jo);
        }
    }
    goukei=even+odd;
        
    for(x=0;x<10;x++){
        if(x<=4){
            goukeix=goukei+(x*2);
        }else{
            goukeix=goukei+((x*2)-10+1);
        }

        if(goukeix%10==0){
            printf("%d\n",x);
            break;
        }
    
    }
    return 0;
}

Re: ポインタの理解が不十分なようです。助けてください。

Posted: 2016年4月17日(日) 20:26
by みけCAT
このプログラムは10行目で正の値が読み込まれてNに書き込まれた場合、14行目で不定である初期化されていない自動変数の値を使用し、undefined behaviorとなります。
bennkyou さんが書きました:if(*(number[j]+je)<=4){
で間違ったことをやっているのは分かったのですが、なぜ間違っているのか分かる方教えてください。
なぜ間違っているかがわからないのに、どうしてここで間違ったことをやっているのが分かったのですか?
オフトピック
C言語 チェックディジットの問題。こんにちは。... - 数学 | Yahoo!知恵袋
似た質問がありましたが、約1年前なのでマルチポストとは言えないでしょう。

Re: ポインタの理解が不十分なようです。助けてください。

Posted: 2016年4月17日(日) 20:54
by bennkyou
exit(1)で1行ずつ調べました。
その行で強制終了しました。

Re: ポインタの理解が不十分なようです。助けてください。

Posted: 2016年4月17日(日) 20:57
by bennkyou
1年前の投稿はおそらく問題の出典が同じです。

Re: ポインタの理解が不十分なようです。助けてください。

Posted: 2016年4月17日(日) 21:10
by みけCAT
bennkyou さんが書きました:exit(1)で1行ずつ調べました。
その行で強制終了しました。
undefined behaviorが出ている時点でその検証は意味が無いでしょう。
まずはnumberの要素を使う前に有効な十分大きい領域へのポインタで初期化してください。
また、Nがテストケースの数を表すと仮定すると、そのまわりのフロー制御もおかしいでしょう。

Re: ポインタの理解が不十分なようです。助けてください。

Posted: 2016年4月17日(日) 22:07
by へにっくす
コメントを全く書いていないので、なぜそのような処理になったのか全然伝わりません。
// の後改行まではコメント扱いになるので、逐一どのような処理か書きましょうね。

とりあえず思いつくツッコミ。

コード:

char* number[100];

コード:

char number[100][100] = {0};
の違いが分かりますか?
また、ループに入る前に別の変数に入れた方がよいかと。

コード:

for(j=0; j<N; j++){
    char *tmp = number[j]; // 別の作業用変数に代入
    // あとはtmpをうんたらかんたら

Re: ポインタの理解が不十分なようです。助けてください。

Posted: 2016年4月17日(日) 22:55
by box
bennkyou さんが書きました: その場合に例えば174987634726437xのように打ち込んだ場合xは何かというプログラムを作っています。
コンピューターを使わずに手で計算する場合にどういう手順を踏むか、日本語で書き出してみてください。