こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

教えてください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

投稿日時 - 2009-06-14 15:47:35

QNo.5043282

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

15人が「このQ&Aが役に立った」と投票しています

回答(16)

ANo.16

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

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

投稿日時 - 2009-06-16 21:38:33

ANo.15

zwi

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
};
}
}

投稿日時 - 2009-06-16 18:50:22

ANo.14

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

投稿日時 - 2009-06-16 18:30:34

ANo.13

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

投稿日時 - 2009-06-16 17:31:41

ANo.12

こんなのもありかも?

--- 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文)も使っています。

投稿日時 - 2009-06-16 17:30:07

ANo.11

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 じゃないけど条件は全部満たしてる... かな? ちゃんと制御文も入れたし.

投稿日時 - 2009-06-16 12:37:48

ANo.10

アセンブラの話が出ていたのでついでに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

投稿日時 - 2009-06-15 23:20:12

ANo.9

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

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

投稿日時 - 2009-06-15 17:48:26

ANo.8

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

投稿日時 - 2009-06-15 11:25:26

ANo.7

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

投稿日時 - 2009-06-15 01:28:07

ANo.6

> 「文字列が使えない」のは文字でひたすら逃げることが可能だけど, 関数呼び出しすら使えないような気がします>#4.

別の質問(質問番号:5043290)のところでその件は指摘したので、今回は割愛しました。

> じゃあマクロはどうかというと, 結局のところ出力に stdout なんかを使わないとダメだと思う.

putchar等がマクロで実装されているなら可能かもしれませんが、しょせんは詭弁にすぎません。

最後に残された手段は、インラインアセンブラを使うことぐらいですね。
その場合、処理系不明の状況ではどうしようもありません。

投稿日時 - 2009-06-15 00:55:55

ANo.5

「文字列が使えない」のは文字でひたすら逃げることが可能だけど, 関数呼び出しすら使えないような気がします>#4.
じゃあマクロはどうかというと, 結局のところ出力に stdout なんかを使わないとダメだと思う.

投稿日時 - 2009-06-15 00:18:29

ANo.4

> ただし配列、ポインタは用いない。

無理です。
文字列が配列であることをお忘れなく。

投稿日時 - 2009-06-14 19:55:19

ANo.3

また、勝ち組の方ですか?
http://questionbox.jp.msn.com/qa5011736.html

投稿日時 - 2009-06-14 18:36:13

ANo.2

zwi

少なくとも配列もポインタも使ってません。
void sub(int a);
int main(void)
{
sub(2);
}
void sub(int a)
{
if( (a%2)==0 ) {
printf( "num=%d\n", a+1 );
} else {
printf( "num=%d\n", a-1 );
}
if( a < 21 ) {
sub(a+1);
}
}

投稿日時 - 2009-06-14 16:05:46

ANo.1

> 初心者なのでわかりやすくお願いします。
なにをお願いしているのですか?
「私のかわりにプログラムを書いてください」ですか?

投稿日時 - 2009-06-14 15:49:53

あなたにオススメの質問