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

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

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

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

Q&A

7回答

1587閲覧

C言語 関数に関して

teratail398

総合スコア8

C++

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

0グッド

0クリップ

投稿2016/06/30 15:08

編集2016/07/02 18:38

関数プロトタイプが以下の通り
int point(int data[],int n);であり
point の引数は整数型配列データdataと中に入っているデータの数nであります。
pointの処理は、data内の先頭からn個のデータのうち奇数のみ合計し、その結果を整数で返すものであります。しかし、nが負の場合は0を返す。
これを条件分岐と繰り返し処理を使用し、求めるソースコードを教えてください!

#include <stdio.h>

int point(int data[], int n) {
int ans, i;

for (i = 1; i <= n; i++) { if (i % 2 == 1) ans = ans + i; return ans; else(n < 0) return 0; }

}

これで正解か否かすらも分からないのでどなたか教えてください。
また、間違っている部分があれば指摘してほしいです。

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

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

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

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

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

kei344

2016/06/30 16:55

回答が付いた質問の編集は慎重に行ってください。タイプミス程度なら修正する事もありますが、本文を削除するのはやめましょう。
kei344

2016/07/02 18:47

ご自身の環境で実行され、エラーは出ましたか?その場合はエラーの内容も書いてください。また、コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
archiver

2016/07/03 01:20

一つ確認ですが、point()の処理は「data内の先頭からn個のデータのうち奇数のみ合計」ですよね?「dataの奇数番目の要素の合計」ではないですよね?ここの解釈の違いで指摘内容が変わります。
teratail398

2016/07/03 05:01

data内の先頭からn個のデータのうち奇数のみ合計です。
PineMatsu

2016/07/04 07:56

プログラムソースを追記したのですね。コードは```で囲うと見やすくなります。具体的には</>ボタンをクリックするとコードブロックのテンプレが出るのでそこにソースを流し込めばOKです。
guest

回答7

0

こんばんは、

丸投げと言われてしまっていますね ^_^;
初めての質問なのにもう少し優しくしてくれればいいのにと思います。

推奨していない質問は、読んでると思いますが、読んでいなければ読んでみてください。

ざっくり言えば、人に全部考えてもらおうという感じの質問は嫌がられます。

自分ではこう考えて、このようにプログラムしてみたけど、どうしても分からないエラーが出てしまいます。という感じでソースコードを質問に載せれば皆さん進んで回答してくれますので、そのようにしてみてはいかがですか?

私もそのような質問には、自分がわからないことでも検索したりして答えたりすることもあります。
めんどくさいなと思うのであれば、teratailの考え方とは合わないので、無回答のまま忘れ去られるだけです。
なるほどと思ったら改めて質問を編集してみてくださいね ^^

投稿2016/06/30 15:28

Mr_Roboto

総合スコア2208

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

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

Mr_Roboto

2016/06/30 15:40

なんか悲しい気持ちになりました (TOT)
earnest_gay

2016/06/30 16:53

自分も最初こんな感じでマイナス評価ついてしまいました。(どーん) 削除できると思ってた←
Mr_Roboto

2016/06/30 16:59

コメントありがとうございます。 私が未熟なばかりに残念なことになってしまいました。 いきなりマイナスを付ける人もどうかと思いますので、 丁寧に説明したつもりだったんですが、 こういう反応をする質問者様もいるのかと勉強になりました。 今回は、誰も幸せになりませんでしたね。とても 残念 残しておくのも皆さん嫌な気持ちになると思うので、 削除の依頼は、一応出しておきました。
guest

0

タグがC++だったのでふざけてみた:

C++

1#include <iostream> 2#include <valarray> 3using namespace std; 4 5int point(int data[], int n) { 6 return valarray<int>(valarray<int>(data, n)[slice(1,n/2,2)]).sum(); // これでいいかな? 7} 8int main() { 9 const int n = 10; 10 int data[] = { 0, 1, 2, 3, 4, 5, 6 ,7 ,8, 9 }; 11 cout << point(data,n) << endl; 12}

投稿2016/07/01 03:11

episteme

総合スコア16614

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

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

archiver

2016/07/01 12:13

ほぉ、C++ではこう書きますか。これは思わぬ収穫です。
episteme

2016/07/01 15:48

いやこう書くってゆーか、「条件分岐と繰り返し処理を使用し」をはぐらかしてみたかったんでwww
mugicya

2016/07/01 23:53

質問者は意味わからないでしょうねw
archiver

2016/07/02 00:05

epistemeさん、「はぐらかしてみたかった」というのは一目見てわかりました(^ ^) それを踏まえて、こういう書き方があるんだなと感心した次第です。
guest

0

では、一つずつ。まずforループですが、このループの中でdata[]の中を見ていこうとしているのだと思います。が、ループカウンタであるiの初期値が1となっていますね。これでは、dataの2番目以降の要素しか見なくなります。なぜならば、C言語の配列の添字([]の中の数値)は"0"始まりだからです。したがって、data配列の先頭要素から見るのであれば、iの初期値は0でなくてはなりません。ということで、ループの終了条件も…(ここは自分で考えてみてください)。
二つ目。forループ内の条件文ですが、

C

1if (i % 2 == 1)

としていますね。iがdata配列の添字になるとすれば、この判定では「data配列の添字が奇数か」という判定になってしまいます。問題とは違ってきますね。「data配列の要素が奇数であれば」というのが問題で意図しているものなので、ここの判定文も変わります。

ロジックでの明らかな間違いとして、forループの中で

C

1ans = ans + i; 2return ans;

としていますが、これでは最初の要素だけ判定して、残りは見ないで処理を抜けますよ。それと、ansの中身も期待しているものではないです。

それとは別に文法的な間違いの指摘ですが、else節の後には条件式は付きません。さらに条件判断するのであればelse if(条件式)となります(コンパイルしてないのが見え見えですね。これはコンパイラでエラーにします)。ということで、コンパイルもかけましょう。文法間違いはそこでわかります。ここのelse節にはもう一つ言いたいことがありますが、動作上問題にはならないので、特に指摘には挙げません。気になるようでしたら、考えてみてください。

投稿2016/07/03 07:58

archiver

総合スコア1557

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

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

0

data内の先頭からn個のデータのうち奇数のみ合計し
これを条件分岐と繰り返し処理を使用し、

この文は理解できてますか?つまり、for文などを用いて配列の先頭からn個分のデータを走査することが繰り返し処理です。そして、奇数データかどうかを判断するのが条件分岐(if文)です。
合計はわかりますよね?
for文とif文、習ってますよね?それを使ってプログラムを書くわけです。

こんなプログラム、ここに出入りしている回答者なら簡単すぎる問題です。
初めてプログラミングに触れてどうして良いのかわからない、という状態かもしれません。そもそもプログラムって何?とかというレベルなのかもしれません。

たぶん学校の課題だと思うのですが、ここは宿題の解答を教える場ではなく、プログラム中に行き詰まってどうしてもわからない場合にどうしたら良いか教えてもらう場所です。なので、自分の書いたプログラムを載せて、エラーが出るのならエラー・メッセージを一緒に載せて、それについてコメントを貰う。そういう風にしないと「問題丸投げ」の指摘を受けることになるし、回答者も答えてやろうという気が起きません。

どこかで答えを教えてもらってそれをコピペして、などと「ええかっこ」はせず、宿題ができないのなら、できませんでしたと正直に先生に言って、もっと一から教えてもらうような態度を先生に示すべきです。それが、学習に対する正しい態度だと私は思います。

投稿2016/07/01 08:24

PineMatsu

総合スコア3579

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

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

Mr_Roboto

2016/07/01 08:31

回答ご苦労さまです。 人として成長中のかたのようです、私がなぜこんなコメントを書いているのか 右上の編集履歴も見てあげてください。 2016/07/01 00:08 投稿 2016/07/01 11:54 編集 ← ここ いろいろあると思いますが、頑張って欲しいと思いますね。
PineMatsu

2016/07/01 08:55

何ですか?この「うよゃ。なたまひかたま、さかだやひかたよなあまやらはさなやわりなま」って?暗号文?
archiver

2016/07/01 12:12

運営さんが元に戻したみたいですね。でも質問者もあんな事するくらいだから、見返すことはしないんじゃないかなぁ。 epistemeさんみたいな思わぬ別解が出てきて面白いですけど。
guest

0

何が正しくて何がまちがっているかはっきりさせるためにテストデータを用意しましょう。
分野によっては、
テストケースの作成と、テストの実行の方に
コードを書くよりも時間/手間をかけることもあります。

充分なテストデータを使って、調べればコードが間違っているかどうか一目だと思います。
充分なテストデータとは、
一般的なデータだけではなく、
変則的な正しいデータ、たとえばデータの個数が0、
間違ったデータ、ポインタが配列をさしていないもの、データの個数が負
などを使う必要があります。

投稿2016/07/05 07:57

gm300

総合スコア580

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

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

0

ひねくれた回答してみる。動作未確認

C++

1int point(int data[], int n) 2{ 3return 0 < n ? (data[0] * (data[0] & 1) + point(&data[1], n - 1) : 0); 4}

投稿2016/07/03 08:12

HogeAnimalLover

総合スコア4830

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

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

0

偶数奇数の判定は簡単にできます。入力がnとして、

if(n & 1) で trueなら奇数です。

この辺りがわからないのであれば、2進数をちゃんと見て考えましょう。

投稿2016/07/01 23:47

mugicya

総合スコア1046

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問