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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bennkyou
記事: 3
登録日時: 8年前

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

#1

投稿記事 by bennkyou » 8年前

偶数の桁の数字をそれぞれ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;
}

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

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

#2

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

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

bennkyou
記事: 3
登録日時: 8年前

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

#3

投稿記事 by bennkyou » 8年前

exit(1)で1行ずつ調べました。
その行で強制終了しました。

bennkyou
記事: 3
登録日時: 8年前

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

#4

投稿記事 by bennkyou » 8年前

1年前の投稿はおそらく問題の出典が同じです。

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

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

#5

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

bennkyou さんが書きました:exit(1)で1行ずつ調べました。
その行で強制終了しました。
undefined behaviorが出ている時点でその検証は意味が無いでしょう。
まずはnumberの要素を使う前に有効な十分大きい領域へのポインタで初期化してください。
また、Nがテストケースの数を表すと仮定すると、そのまわりのフロー制御もおかしいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

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

#6

投稿記事 by へにっくす » 8年前

コメントを全く書いていないので、なぜそのような処理になったのか全然伝わりません。
// の後改行まではコメント扱いになるので、逐一どのような処理か書きましょうね。

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

コード:

char* number[100];

コード:

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

コード:

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

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

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

#7

投稿記事 by box » 8年前

bennkyou さんが書きました: その場合に例えば174987634726437xのように打ち込んだ場合xは何かというプログラムを作っています。
コンピューターを使わずに手で計算する場合にどういう手順を踏むか、日本語で書き出してみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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