超初級質問

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

超初級質問

#1

投稿記事 by KKK » 13年前

こんにちはC言語初心者です。
以下のプログラムをつくのに少しいきづまったのでどなたかご教授いただけたら幸いです。

ある素数pが与えられたとし、元が{0、1、、、、、p-1}であり演算がModule-o(pを法とする乗余系)に従う場合を考える。たとえばp=5のとき群の元は{1、2,3,4}であり、2+4の演算結果は1となる。同様に3×4=2 加法の単位元は0乗法の単位元は1である。
ここでmodulo-pの加算および乗算の演算を考えるとき、元{0,1、、、、、p-1}に対する加法の逆元、および、乗法の逆元を表示するプログラム。

表示方法として以下のようにしたい。
---OP=ADD---
0 0
1 4
2 3
3 2
4 1
---OP=MUL---
0 *
1 1
2 3
3 2
4 1

コード:

#include <stdio.h>


int add_func(int p){
  int i, add_inv;
  printf("---OP==ADD---");
  for (i = 0; i < p; i++) {
    printf("%d  \n", i);
    add_inv = p - i;
    printf("&d\n", add_inv);
  }
  return (0);
}


int mul_func(int p){
  
  printf("---OP==MUL---\n");
  printf("0  *\n1  1\n"); //0  *  1  1を先に 表示()

  for (i=2; i < p; i++) {
    int mal_inv;
    for(mal_inv = 2; mal_inv < p; mal_inv++) {
      if(((mal_inv * i)%p) == 1) {
        printf("%d  %d\n", i, mal_inv );
	break;
        } 
    }
  }
  return(0);
}

int main(void)
{
  int p;
  printf("type the prime number\n");
  scanf("%d", &p);
  add_func(p);
  mul_func(p);
  
  return(void);
}

KKK

Re: 超初級質問

#2

投稿記事 by KKK » 13年前

できるだけこのプログラムを変えずにアドバイスいただけると嬉しいです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 超初級質問

#3

投稿記事 by h2so5 » 13年前

具体的にどこで行き詰まっているのでしょうか。

フリオ

Re: 超初級質問

#4

投稿記事 by フリオ » 13年前

ぱっと見て気になったところだけ、

>add_inv = p - i;
剰余をとらないといけないのでは?

>---OP=MUL---
>...
>4 1
4 4では?

non
記事: 1097
登録日時: 15年前

Re: 超初級質問

#5

投稿記事 by non » 13年前

自分で作っていないプログラムだから、どこをどうしてよいかわからないという課題の丸投げではないでしょうか。
non

kkk

Re: 超初級質問

#6

投稿記事 by kkk » 13年前

h2so5 さんが書きました:具体的にどこで行き詰まっているのでしょうか。
すみません大事なところを言ってなかったですね。
一応プログラム的には完成だと思ったのですがどうしてもコンパイルエラーが出てコンパイルできません。コンパイルエラーの内容は後述します。(今忘れてしまったので)

kkk

Re: 超初級質問

#7

投稿記事 by kkk » 13年前

フリオ さんが書きました:ぱっと見て気になったところだけ、

>add_inv = p - i;
剰余をとらないといけないのでは?

>---OP=MUL---
>...
>4 1
4 4では?
加法の場合はp-i で出るの出るのこうしました、が今考えるとI=0 の時は成り立たないですね。直します。
それと4 1も間違いで4 4 デスね。ありがとうございます

kkk

Re: 超初級質問

#8

投稿記事 by kkk » 13年前

non さんが書きました:自分で作っていないプログラムだから、どこをどうしてよいかわからないという課題の丸投げではないでしょうか。
課題の丸投げではありません一から自分でつくりましたこの単純なプログラムに3時間かけて

non
記事: 1097
登録日時: 15年前

Re: 超初級質問

#9

投稿記事 by non » 13年前

そうですか。失礼しました。あまりにも単純なC言語の文法間違い等があり、自分で作ったとは思えなくて失礼しました。

1 21行:変数iの宣言がない。
2 41行:returnの引数がおかしい。
3 6行、8行 改行の位置がおかしい。
4 10行 &dが間違い
non

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

Re: 超初級質問

#10

投稿記事 by box » 13年前

main関数の最後にある

コード:

    return(void);
は、何がしたいのか不明です。

add_func(), mul_func()の戻り値を
呼び出し側で全く使っている気配がないので、
戻り値の型をintにする必然性がないように思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

KKK

Re: 超初級質問

#11

投稿記事 by KKK » 13年前

non さんが書きました:そうですか。失礼しました。あまりにも単純なC言語の文法間違い等があり、自分で作ったとは思えなくて失礼しました。

1 21行:変数iの宣言がない。
2 41行:returnの引数がおかしい。
3 6行、8行 改行の位置がおかしい。
4 10行 &dが間違い
申し訳ないです、全く駄目初心者なんです、、ありがとうございます。
一応指摘いただいたところを直しましてあと少しだと思うんですがまだこの二つのエラーがでます
24:5: error: stray '\201' in program
24:5: error: stray '@' in program
あともう少しアドバイスを頂けたらとおもいます。
変更後のプログラムは以下です。

コード:

 
#include <stdio.h>


int add_func(int p){
  int i, add_inv;
  printf("---OP==ADD---\n");
  printf("0  0\n");
  for (i = 0; i < p; i++) {
    printf("%d  \n", i);
    add_inv = p - i;
    printf("%d\n", add_inv);
  }
  return (0);
}


int mul_func(int p){
  int i;
  printf("---OP==MUL---\n");
  printf("0  *\n1  1\n"); //0  0  1  1 表示

  for (i=2; i < p; i++) {
    int mal_inv;
    for(mal_inv = 2; mal_inv < p; mal_inv++) {
      if(((mal_inv * i)%p) == 1) {
        printf("%d  %d\n", i, mal_inv );
	break;
      } 
    }
  }
  return(0);
}

int main(void)
{
  int p;
  printf("type the prime number\n");
  scanf("%d", &p);
  add_func(p);
  mul_func(p);
  
  return(0);

}

kkk

Re: 超初級質問

#12

投稿記事 by kkk » 13年前

box さんが書きました:main関数の最後にある

コード:

    return(void);
は、何がしたいのか不明です。

add_func(), mul_func()の戻り値を
呼び出し側で全く使っている気配がないので、
戻り値の型をintにする必然性がないように思います。
なるほどご指摘ありがとうございます。これはint の方で関数を指定しておいてそれを使わなければerrorの原因になるのでしょうか?

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

Re: 超初級質問

#13

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

KKK さんが書きました:24:5: error: stray '\201' in program
24:5: error: stray '@' in program
全角のスペースがないかチェックしてください。
全角文字が含まれていいのは、文字列の中か、コメントだけです。
written by へにっくす

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

Re: 超初級質問

#14

投稿記事 by box » 13年前

25行目のfor文の中に全角の空白があります。取り除いてください。
kkk さんが書きました: これはint の方で関数を指定しておいてそれを使わなければerrorの原因になるのでしょうか?
何をおっしゃりたいのか今ひとつわかりませんが、要するに、
関数の戻り値の型がvoid以外である、ということは、
その戻り値を呼び出し元で使うからこそそうしているのであって、
今回のコードではadd_func()やmul_func()は0を戻していますが
呼び出し元のmain()ではそれを使っていないので、
使わないんだったらそもそもvoidでいいのでは?ということです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

kkk

Re: 超初級質問

#15

投稿記事 by kkk » 13年前

へにっくす さんが書きました:
KKK さんが書きました:24:5: error: stray '\201' in program
24:5: error: stray '@' in program
全角のスペースがないかチェックしてください。
全角文字が含まれていいのは、文字列の中か、コメントだけです。
ありがとうございました。とてもたすかりました

閉鎖

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