質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1397閲覧

自身が作ったプログラムを関数化したい

chocopon

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/18 08:23

前提・実現したいこと

10000以下の完全数を探す簡単なプログラムを作成しました、そのままプログラムを実行するのではなくそれを関数にしてから実行したいです。

発生している問題・エラーメッセージ

最初にあるのが完全数を探すプログラムです。
2つ目がそれを関数にしようとして失敗したものです。関数の戻り値がよくわかっていない状態です。

エラーメッセージ

#include <stdio.h> int main(void) { int i, j, amari; /*1~10000まで探す*/ for (i = 1; i < 10000; i ++){ int sum = 0; for (j = 1; j < i; j ++){ amari = i % j; /*約数だけ足す*/ if (amari == 0){ sum = sum + j; } } /*完全数かどうか判定*/ if (sum == i){ printf("%dは完全数です\n", sum); } } } /*関数化しようとしたもの*/ #include <stdio.h> /*完全数を探す関数*/ int kanzen(int kanzen) { int i, j, amari; /*1~10000まで探す*/ for (i = 1; i < 10000; i ++){ int sum = 0; for (j = 1; j < i; j ++){ amari = i % j; /*約数だけ足す*/ if (amari == 0){ sum = sum + j; } } } return kanzen; } int main(void) { int kanzen; printf("%dは完全数です\n", kanzen); } ```c言語です ### 試したこと いろいろ書き替えたりしましたが以下の出力が返ってくるだけでした。 「0は完全数です」 1つ目のプログラムは10000万以下の完全数がしっかりと出力されます。 ### 補足情報(FW/ツールのバージョンなど) https://replit.com/languages/c こちらのサイトでプログラミングをしています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/05/18 08:26

完全数は「1つ」返せばいいのでしょうか?それとも、元のコードと同じ動作にしたいのでしょうか?
fana

2021/05/18 08:37

関数の仕様を明確にしてください. > int kanzen(int kanzen) (とりあえずこの関数を呼んですらいない様子ですが,仮に呼ぶのだとして) 引数には何を与えればよいのですか? 戻り値は何なのですか?
chocopon

2021/05/18 08:44

10000以下の完全数をすべて返したいです
chocopon

2021/05/18 08:54

引数はiとjとamariにしたいです、 int kanzen(int i, int j, int amari)こんな感じでしょうか? 戻り値は10000以下の完全数にしたいです
guest

回答4

0

そもそもなのですが、私だったら指定した数値が完全数か?を判定する関数を作ります。
そのほうが便利じゃないでしょうか?

C

1// 指定した数値nが完全数か?を返す。1=完全数 2int is_kanzen( int n) 3{ 4 : 5} 6int main(void) 7{ 8 for( int i = 1; i <= 123; i++){ 9 if( is_kanzen(i)){ 10 printf("%dは完全数です\n", i); 11 } 12 } 13}

投稿2021/05/18 09:09

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chocopon

2021/05/18 09:11

その視点はありませんでした、そっちのほうが便利ですね、試してやってみたいと思います。 ありがとうございます!
guest

0

ベストアンサー

まず,どんな関数を作るのかをちゃんと決めましょう.

関数の機能は何か? どう使うのか? 入力は何で,出力は何なのか?
関数内で複数の完全数が求まる場合,それをどうやって呼び出し側に返すのか? etc...

例えば,下記コード例の(1)みたいに,
「ある値nが完全数かどうかを判定する」処理を関数にして,1~10000のループについてはmain側でやる,という形もあり得るでしょうし,
(2)や(3)のように,ループまで関数内に含めるような形もあり得るでしょうし.

とにかく決めねばならない事柄が決まってないのに何となくコードを書いても意味ないです.

C++

1//引数の値nが完全数かどうかを判定する. 2bool IsPerfectNumber( int n ) 3{ 4 int sum = 0; 5 for( int j=1; j<n; ++j ) 6 { 7 int mod = n % j; 8 if( mod == 0 )sum += j; 9 } 10 return (sum == n); 11} 12 13//値域 first~last の中にある完全数を返す 14std::vector<int> EnumPerfectNumbers_1( int first, int last ) 15{ 16 std::vector<int> result; 17 for( int i=first; i<=last; ++i ) 18 { 19 if( IsPerfectNumber( i ) )result.push_back( i ); 20 } 21 return result; 22} 23 24//値域 first~last の中にある完全数を探す. 25//完全数が見つかる毎に,その値を引数としてコールバック関数 callback が呼び出される. 26//戻り値は見つけた完全数の個数. 27int EnumPerfectNubers_2( int first, int last, void (*callback)(int) ) 28{ 29 int n = 0; 30 for( int i=first; i<=last; ++i ) 31 { 32 if( IsPerfectNumber( i ) ){ callback( i ); ++n; } 33 } 34 return n; 35} 36 37//main 38int main(void) 39{ 40 {//(1) 関数 IsPerfectNumber だけを使い,ループはこっちでやる 41 for( int i=1; i<=10000; ++i ) 42 { 43 if( IsPerfectNumber( i ) ){ std::cout << i << std::endl; } 44 } 45 } 46 47 //(2) 関数 EnumPerfectNumbers_1 を使う 48 auto PNs = EnumPerfectNumbers_1( 1, 10000 ); 49 for( auto i : PNs ){ std::cout << i << std::endl; } 50 51 //(3) 関数 EnumPerfectNumbers_2 を使う 52 EnumPerfectNubers_2( 1, 10000, [](int i)->void{ std::cout << i << std::endl; } ); 53 54 return 0; 55}

投稿2021/05/18 09:04

編集2021/05/18 09:08
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chocopon

2021/05/18 09:10

何をすべきか目的意識が甘かったと思います、ありがとうございます。 例にあるように、様々な探し方があるのですね、もう一度目的意識をもって考え直してみます。
episteme

2021/05/18 11:14

僕ならこうするかな template<typename OutIter> OutIter EnumPerfectNumbers_3( int first, int last, OutIter out) { for( int i=first; i<=last; ++i ) { if( IsPerfectNumber( i ) ) *out++ = i; } return out; }
guest

0

10000以下の完全数をすべて返したいです

C言語で「いくつになるかわからない個数の値」を扱うには、自分でメモリを確保する必要が出てきて、かなり煩雑な仕事になります。関数の切り出し方で悪戦苦闘しているところから、もう1段階以上進まないといけません。

なお、int kanzen(int i, int j, int amari)という関数では、int1つしか返せません。

投稿2021/05/18 08:59

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chocopon

2021/05/18 09:05

ありがとうございます、ということは今の自分ではできそうにない感じですね。
maisumakun

2021/05/18 09:07

C++なら、比較的容易に扱う方法もあります。
chocopon

2021/05/20 04:37

なるほど、丁寧にありがとうございます。 とりあえず今はCを勉強しているので頑張ってみます!
guest

0

関数呼び出しがされていません。
関数呼び出しは
kanzen(100);
等のようにカッコで引数を与えて実行します。
実行結果はkanzen(100)の値を参照して取得します。
int kekka = kanzen(100);
とするとkanzen関数の値がkekka変数に代入されます。
定義されているkanzen関数ですが引数をそのまま返すものとなっていますの
実現したい仕様は満たしていないと思います。

「0は完全数です」と出力されるのは

int kanzen;
printf("%dは完全数です\n", kanzen);

printf関数にてkanzen変数の内容を%dの部分に埋め込んで出力されていますが
kenzen変数は初期化されておらず、たまたま0が入っていたので「0は完全数です」と出力されたのだと思います。

投稿2021/05/18 08:31

yasushi_sapporo

総合スコア61

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chocopon

2021/05/18 09:06

もっと勉強します、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問