教えてください2
初心者なのでわかりやすくお願いします。
問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
- 次の回答10件
- |
回答(16件中1~10件)
- 最新から表示
- |
- 回答順に表示
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
};
}
}
えぇと,
std::ifstream ifs("data.txt");
と文字列を使ってますが
「文字列は配列だよん」
と突っ込んでおくべきでしょうか>#13.
しかし, さすがに「配列もポインタも使えない」となるときついなぁ.... C の範囲でできるとは到底思えない.
こんなのもありかも?
--- 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文)も使っています。
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 じゃないけど条件は全部満たしてる... かな? ちゃんと制御文も入れたし.
アセンブラの話が出ていたのでついでに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
> あれ? C++ なら「関数名を使った関数呼び出し」は OK だ. 「左辺値に対する関数呼び出しでは『関数からポインタへの変換』を行わない」って書いてある....
言葉遊びのようなものですが、確かにそうですね。
# 配列の添字付けの方はポインタになるのに...
あぁ, 別のところで同様の指摘を既にされていたのですね>#6. 了解です. で, っと. 確かにメンバ関数経由なら「ポインタは使っていない」といえなくもないけど, それはそれでなんか詭弁みたい....
あれ? C++ なら「関数名を使った関数呼び出し」は OK だ. 「左辺値に対する関数呼び出しでは『関数からポインタへの変換』を行わない」って書いてある....
- 最新から表示
- |
- 回答順に表示













