ページ 1 / 1
calc関数
Posted: 2017年6月27日(火) 14:11
by acaa
C言語初心者です半分はできたんですがcalcの記述部分がわかりませんおしえてください
以下のプログラムは1つの整数をキーボードから入力し、その値に5を足してから3倍にした値を表示するプログラムです。
ただし、このプログラムでは整数の入力と結果の表示をmain関数内で行い、入力された値に5を足してから3倍にした値を求める作業は別の関数calc()を作成したものを利用しているこのプログラムが機能するよう関数calc()の部分をおしえてください
#include<stdio.h>
#include<math.h>
[
]
int main()
{
int x,y;
scanf(”%d”,&x);
y=calc(x);
printf(”Answer=%d”,y);
return(0);
}
Re: calc関数
Posted: 2017年6月27日(火) 15:19
by usao
C言語初心者なので,間違っているかもしれません.動作確認もしていません.
コード:
int add( int a, int b )
{
int i;
int d = ( b>0 ? 1 : -1 );
int n = ( b>0 ? b : -b );
for( i=0; i<n; ++i )
{ a += d; }
return a;
}
int mul( int a, int b )
{
int i;
int r = 0;
int n = ( b>0 ? b : -b );
for( i=0; i<n; ++i )
{ r = add( r, a ); }
return ( b>0 ? r : -r );
}
int calc( int x )
{
return mul( add( x, 5 ), 3 );
}
Re: calc関数
Posted: 2017年6月28日(水) 00:56
by purin52002
足し算と掛け算をするだけのプログラムにforループはいらないんじゃないかなー、
と思ったので改造してみました。
あってるかはわからないです^p^
コード:
int add(int a, int b,int c)
{
return b<=c ? a : add(b>0 ? a + 1 : a - 1, b, b>0 ? c +1 : c - 1);
}
int mul(int a,int b,int c)
{
return b<=c ? 0 : add(b>0 ? a : -a, mul(a, b, b>0 ? c + 1 : c - 1), 0);
}
int calc(int x)
{
return mul(add(x, 5, 0), 3, 0);
}
Re: calc関数
Posted: 2017年6月28日(水) 02:41
by box
コード:
// 最もシンプルと思われるコード
#include <stdio.h>
int calc(int n)
{
return (n + 5) * 3;
}
int main(void)
{
int n;
printf("input:"), scanf("%d", &n);
printf("answer:%d\n", calc(n));
return 0;
}
Re: calc関数
Posted: 2017年6月28日(水) 08:05
by かずま
a + b は、a に 1 を b回足したもの。
a * b は、a を b個足したもの。
そんなことをしたら、b が 10 の場合と、
10億の場合で、計算時間に大きな差が出ます。
CPUの設計者に申し訳なく思います。
計算時間が一定になるようにしてみました。
コード:
#include <stdio.h>
int full_adder(int a, int b, int c, int *sum)
{
*sum = a ^ b ^ c;
return a & b | b & c | c & a;
}
int add(int a, int b)
{
int sum = 0, carry = 0, s;
for (int i = 0; i < 32; i++) {
carry = full_adder(a >> i & 1, b >> i & 1, carry, &s);
sum |= s << i;
}
return sum;
}
int mul(int a, int b)
{
int sum = 0;
for (int i = 0; i < 32; i++)
if (b >> i & 1) sum = add(sum, a << i);
return sum;
}
int calc(int x)
{
return mul(add(x, 5), 3);
}
int main(void)
{
int n;
while (printf("n: "), scanf("%d", &n) == 1)
printf(" (n+5)*3: %d\n", calc(n));
}
ビット演算の and, or, exclusive or, shift と
整数の increment しか使っていません。
実行結果
コード:
n: 5
(n+5)*3: 30
n: 0
(n+5)*3: 15
n: -5
(n+5)*3: 0
n: -10
(n+5)*3: -15
n: .
Re: calc関数
Posted: 2017年6月28日(水) 08:11
by かずま
かずま さんが書きました:計算時間が一定になるようにしてみました。
mul の中で add を呼ばない時もあるので、一定とは言えませんね。
Re: calc関数
Posted: 2017年6月28日(水) 11:31
by purin52002
acaaさんへ
関数は以下のように書きます。
コード:
//最初のintは戻り値の型
//次のcalcは関数名
//次のintは引数の型
//次のxは変数名
int calc(int x)
{
int y;
//ここでいろいろな処理をかく
return y;
}
「5を足してから3をかける」というのはできると思うので説明はしません^^;
処理を関数にまとめるという作業は結構重要な作業だと思うので、早めにマスターできるといいですね^^