新しく質問する

教えてください2

役に立った:15件
  • 質問者:kansai223
  • 投稿日時:2009/06/14 15:47
  • 困り度:すぐに回答が欲しいです

初心者なのでわかりやすくお願いします。
問3
制御文を用いて、以下の実行結果を実現せよ。
ただし配列、ポインタは用いない。

<実行結果>
num=3
num=2
num=5
num=4
num=7
num=6
num=9
num=8
num=11
num=10
num=13
num=12
num=15
num=14
num=17
num=16
num=19
num=18
num=21
num=20

この質問に回答する
このQ&Aは役に立ちましたか?(役に立った:15件)
  • 参考になった:0件
  • 回答者:jacta
  • 回答日時:2009/06/16 21:38

> 「文字列は配列だよん」
> と突っ込んでおくべきでしょうか>#13.

はい、書いた後で気づきました。

通報する

  • 参考になった:0件
  • 回答者:zwi
  • 回答日時:2009/06/16 18:50

VC++x86限定。無理やり感満載コード。
関数はインラインアセンブラで呼んでいるのでポインタじゃないよ的な処理。
void numsub(int a);
int putchar(int c);
int main(void)
{
int a=2;
__asm {
push a
call numsub
add esp,4
};
return 0;
}
void numsub(int a)
{
int y,y10,y1,c;
__asm {
push 'n'
call putchar
add esp,4
push 'u'
call putchar
add esp,4
push 'm'
call putchar
add esp,4
push '='
call putchar
add esp,4
};
if( (a%2)==0 ) {
y=a+1;
} else {
y=a-1;
}
y1 = y % 10;
y10 = y / 10;
if( y10 != 0 ) {
c = '0'+y10;
__asm {
push c
call putchar
add esp,4
};
}
c = '0'+y1;
__asm {
push c
call putchar
add esp,4
push '\n'
call putchar
add esp,4
};
if( a < 21 ) {
a+=1;
__asm {
push a
call numsub
add esp,4
};
}
}

通報する

  • 参考になった:0件
  • 回答者:Tacosan
  • 回答日時:2009/06/16 18:30

えぇと,
std::ifstream ifs("data.txt");
と文字列を使ってますが
「文字列は配列だよん」
と突っ込んでおくべきでしょうか>#13.
しかし, さすがに「配列もポインタも使えない」となるときついなぁ.... C の範囲でできるとは到底思えない.

通報する

  • 参考になった:0件
  • 回答者:jacta
  • 回答日時:2009/06/16 17:31

しまった!
rdbufの返却値がポインタだった。

通報する

  • 参考になった:0件
  • 回答者:jacta
  • 回答日時:2009/06/16 17:30

こんなのもありかも?

--- data.txt ---
num=3
num=2
num=5
num=4
num=7
num=6
num=9
num=8
num=11
num=10
num=13
num=12
num=15
num=14
num=17
num=16
num=19
num=18
num=21
num=20

--- foo.cpp ---
#include <fstream>
#include <iostream>

int main()
{
 std::ifstream ifs("data.txt");
 if (ifs.is_open())
  std::cout << ifs.rdbuf();
}

一応、制御文(if文)も使っています。

通報する

  • 参考になった:0件
  • 回答者:Tacosan
  • 回答日時:2009/06/16 12:37

C++ なら関数が呼び出せることが分かったので
#include <iostream>
void printnum(char a)
{
std::cout.put('n').put('u').put('m').put('=').put(a).put('\n');
}

void printnum(char a, char b)
{
std::cout.put('n').put('u').put('m').put('=').put(a).put(b).put('\n');
}

int main()
{
goto num3;
num2: printnum('2'); goto num5;
num3: printnum('3'); goto num2;
......(中略)
num20: printnum('2', '0'); goto fin;
num21: printnum('2', '1'); goto num20;
fin: return 0;
}
C じゃないけど条件は全部満たしてる... かな? ちゃんと制御文も入れたし.

通報する

  • 参考になった:0件
  • 回答者:Quant
  • 回答日時:2009/06/15 23:20

アセンブラの話が出ていたのでついでにZWIさんのソースをML64用に移植。
Windows XP x64で動作確認。
フルアセンブラだが一応画面出力にCのライブラリを使っているのでC言語?

includelib libcmt
extrnprintf:proc
.data
FORMATdb'num=%d', 0aH, 00H
.code
recursive proc
movqword ptr [rsp+8], rbx
pushrdi
movedi, ecx
leaebx, dword ptr [rcx-1]
TOP:moveax, edi
cdq
andeax, 1
xoreax, edx
cmpeax, edx
leaedx, dword ptr [rbx+2]
je@F
movedx, ebx
@@:learcx, offset FORMAT
callprintf
cmpebx, 20
jge@F
incedi
incebx
jmpTOP
@@:movrbx, qword ptr [rsp+48]
poprdi
ret0
recursive endp

mainproc
learcx, offset FORMAT
movedx, 3
callprintf
movecx, 3
callrecursive
xoreax, eax
ret0
mainendp
end

通報する

  • 参考になった:0件
  • 回答者:jacta
  • 回答日時:2009/06/15 17:48

> あれ? C++ なら「関数名を使った関数呼び出し」は OK だ. 「左辺値に対する関数呼び出しでは『関数からポインタへの変換』を行わない」って書いてある....

言葉遊びのようなものですが、確かにそうですね。
# 配列の添字付けの方はポインタになるのに...

通報する

  • 参考になった:0件
  • 回答者:Tacosan
  • 回答日時:2009/06/15 11:25

あぁ, 別のところで同様の指摘を既にされていたのですね>#6. 了解です. で, っと. 確かにメンバ関数経由なら「ポインタは使っていない」といえなくもないけど, それはそれでなんか詭弁みたい....
あれ? C++ なら「関数名を使った関数呼び出し」は OK だ. 「左辺値に対する関数呼び出しでは『関数からポインタへの変換』を行わない」って書いてある....

通報する

  • 参考になった:0件
  • 回答者:jacta
  • 回答日時:2009/06/15 01:28

さっき気づきましたが、std::coutで1文字ずつ出力するのであれば、配列もポインタもいらないかもしれませんね。

通報する

   1  2 次の回答→
このQ&Aは役に立ちましたか?(役に立った:15件)

このページのトップへ