#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
typedef unsigned char uchar_t;
/* printline : 表を一段出力する。
* @param stream 出力先ストリーム。
* @param head サブフォーマット。
* @param min カウント最小値。
* @param max カウント最大値。
* @param mul 出力するカウント変数と乗算する整数。
* @param fmt メインフォーマット。
* @param end 段落末尾に出力する文字。
*/
static void printline( FILE* stream, const char* head, int min, int max, int mul, const char* fmt, char end )
{
int i;
for( i=min; i<=max; ++i )
}
/* strpad : memsetのラップ。
* @param s 文字配列。
* @param size sのサイズ。
* @param pad セットする文字。
* @param end 配列末尾-2 にセットする文字。
*/
static void strpad( char* s, int size, char pad, char end )
{
if( size < 2 ){
*s = '\0' ;
return ;
}
s[ size - 2 ] = end ;
s[ size - 1 ] = '\0';
}
int main( int argc, char* argv[] )
{
uchar_t nketa;// max * max で得られる桁数。
char* fmt;
char* head1;
char* head2;
char tmp[8];
int min = 0;
int max = 0;
int i;
FILE* stream;
// 入力。
fprintf( stdout
, "九九の表の開始と終了の値を入れて下さい(例:\"1 9\") >" ); fscanf( stdin
, "%d %d", &min
, &max
);
// 最大値(max)から桁数を得る。
snprintf( tmp
, sizeof tmp
, "%d", max
*max
);
// 桁数の調整。
// 入力値(min,max)どちらかがマイナスの場合は、'-'用にインクリメント。
if( nketa <= 1 )
nketa = 2;
if( min < 0 || max < 0 )
nketa++;
// メモリ確保。
fmt
= (char* )malloc( nketa
+ 4 ); head1
= (char* )malloc( nketa
+ 2 ); head2
= (char* )malloc( nketa
+ 2 );
// 表のフォーマットを整形。
snprintf( fmt
, nketa
+ 4, "%%%dd|", nketa
); strpad( head1, nketa + 2, ' ', '|' ) ;
strpad( head2, nketa + 2, '-', '+' ) ;
// 出力用ストリームの準備。
stream = stdout;
// 表を出力。
printline( stream, head1, min, max, 1, fmt, '\n' );
printline( stream, head2, min, max, 1, head2, '\n' );
for( i=min; i<=max; ++i )
{
printline( stream, fmt, min, max, i, fmt, '\n' );
printline( stream, head2, min, max, 1, head2, '\n' );
}
// 終了時の処理。
if( stream )
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCnR5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcl90OwoKLyogcHJpbnRsaW5lIDog6KGo44KS5LiA5q615Ye65Yqb44GZ44KL44CCCiAqIEBwYXJhbSBzdHJlYW0J5Ye65Yqb5YWI44K544OI44Oq44O844Og44CCCiAqIEBwYXJhbSBoZWFkCQnjgrXjg5bjg5Xjgqnjg7zjg57jg4Pjg4jjgIIKICogQHBhcmFtIG1pbgkJ44Kr44Km44Oz44OI5pyA5bCP5YCk44CCCiAqIEBwYXJhbSBtYXgJCeOCq+OCpuODs+ODiOacgOWkp+WApOOAggogKiBAcGFyYW0gbXVsCQnlh7rlipvjgZnjgovjgqvjgqbjg7Pjg4jlpInmlbDjgajkuZfnrpfjgZnjgovmlbTmlbDjgIIKICogQHBhcmFtIGZtdCAJCeODoeOCpOODs+ODleOCqeODvOODnuODg+ODiOOAggogKiBAcGFyYW0gZW5kIAkJ5q616JC95pyr5bC+44Gr5Ye65Yqb44GZ44KL5paH5a2X44CCCiovCnN0YXRpYyB2b2lkIHByaW50bGluZSggRklMRSogc3RyZWFtLCBjb25zdCBjaGFyKiBoZWFkLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgbXVsLCBjb25zdCBjaGFyKiBmbXQsIGNoYXIgZW5kICkKewoJaW50IGk7CglmcHJpbnRmKCBzdHJlYW0sIGhlYWQsIG11bCApOwoJZm9yKCBpPW1pbjsgaTw9bWF4OyArK2kgKQoJCWZwcmludGYoIHN0cmVhbSwgZm10LCBpKm11bCApOwoJZnByaW50Ziggc3RyZWFtLCAiJWMiLCBlbmQgKTsKfQoKLyogc3RycGFkIDogbWVtc2V044Gu44Op44OD44OX44CCCiAqIEBwYXJhbSBzIAnmloflrZfphY3liJfjgIIKICogQHBhcmFtIHNpemUgCXPjga7jgrXjgqTjgrrjgIIKICogQHBhcmFtIHBhZCAJ44K744OD44OI44GZ44KL5paH5a2X44CCCiAqIEBwYXJhbSBlbmQgCemFjeWIl+acq+Wwvi0yIOOBq+OCu+ODg+ODiOOBmeOCi+aWh+Wtl+OAggoqLwpzdGF0aWMgdm9pZCBzdHJwYWQoIGNoYXIqIHMsIGludCBzaXplLCBjaGFyIHBhZCwgY2hhciBlbmQgKQp7CglpZiggc2l6ZSA8IDIgKXsKCQkqcyA9ICdcMCcgOwoJCXJldHVybiA7Cgl9CgltZW1zZXQoIHMsIHBhZCwgc2l6ZSAtIDIgKTsKCXNbIHNpemUgLSAyIF0gPSBlbmQgOwoJc1sgc2l6ZSAtIDEgXSA9ICdcMCc7Cn0KCmludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkKewoJdWNoYXJfdCBua2V0YTsvLyBtYXggKiBtYXgg44Gn5b6X44KJ44KM44KL5qGB5pWw44CCCgljaGFyKiBmbXQ7CgljaGFyKiBoZWFkMTsKCWNoYXIqIGhlYWQyOwoJY2hhciB0bXBbOF07CglpbnQgbWluID0gMDsKCWludCBtYXggPSAwOwoJaW50IGk7CglGSUxFKiBzdHJlYW07CgkKCS8vIOWFpeWKm+OAggoJZnByaW50Ziggc3Rkb3V0LCAi5Lmd5Lmd44Gu6KGo44Gu6ZaL5aeL44Go57WC5LqG44Gu5YCk44KS5YWl44KM44Gm5LiL44GV44GEKOS+izpcIjEgOVwiKSA+IiApOwoJZnNjYW5mKCBzdGRpbiwgIiVkICVkIiwgJm1pbiwgJm1heCApOwoJZnB1dGMoICdcbicsIHN0ZG91dCApOwoJCgkvLyDmnIDlpKflgKTvvIhtYXjvvInjgYvjgonmoYHmlbDjgpLlvpfjgovjgIIKCXNucHJpbnRmKCB0bXAsIHNpemVvZiB0bXAsICIlZCIsIG1heCptYXggKTsKCW5rZXRhID0gc3RybGVuKCB0bXAgKTsKCQoJLy8g5qGB5pWw44Gu6Kq/5pW044CCCgkvLyDlhaXlipvlgKTvvIhtaW4sbWF477yJ44Gp44Gh44KJ44GL44GM44Oe44Kk44OK44K544Gu5aC05ZCI44Gv44CBJy0n55So44Gr44Kk44Oz44Kv44Oq44Oh44Oz44OI44CCCglpZiggbmtldGEgPD0gMSApCgkJbmtldGEgPSAyOwoJaWYoIG1pbiA8IDAgfHwgbWF4IDwgMCApCgkJbmtldGErKzsKCQoJLy8g44Oh44Oi44Oq56K65L+d44CCCglmbXQgPSAoY2hhciogKW1hbGxvYyggbmtldGEgKyA0ICk7CgloZWFkMSA9IChjaGFyKiApbWFsbG9jKCBua2V0YSArIDIgKTsKCWhlYWQyID0gKGNoYXIqICltYWxsb2MoIG5rZXRhICsgMiApOwoJCgkvLyDooajjga7jg5Xjgqnjg7zjg57jg4Pjg4jjgpLmlbTlvaLjgIIKCXNucHJpbnRmKCBmbXQsIG5rZXRhICsgNCwgIiUlJWRkfCIsIG5rZXRhICk7CglzdHJwYWQoIGhlYWQxLCBua2V0YSArIDIsICcgJywgJ3wnICkgOwoJc3RycGFkKCBoZWFkMiwgbmtldGEgKyAyLCAnLScsICcrJyApIDsKCQoJLy8g5Ye65Yqb55So44K544OI44Oq44O844Og44Gu5rqW5YKZ44CCCglzdHJlYW0gPSBzdGRvdXQ7CgkKCS8vIOihqOOCkuWHuuWKm+OAggoJcHJpbnRsaW5lKCBzdHJlYW0sIGhlYWQxLCBtaW4sIG1heCwgMSwgZm10LCAnXG4nICk7CglwcmludGxpbmUoIHN0cmVhbSwgaGVhZDIsIG1pbiwgbWF4LCAxLCBoZWFkMiwgJ1xuJyApOwoJZm9yKCBpPW1pbjsgaTw9bWF4OyArK2kgKQoJewoJCXByaW50bGluZSggc3RyZWFtLCBmbXQsIG1pbiwgbWF4LCBpLCBmbXQsICdcbicgKTsKCQlwcmludGxpbmUoIHN0cmVhbSwgaGVhZDIsIG1pbiwgbWF4LCAxLCBoZWFkMiwgJ1xuJyApOwoJfQoJCgkvLyDntYLkuobmmYLjga7lh6bnkIbjgIIKCWlmKCBzdHJlYW0gKQoJCWZjbG9zZSggc3RyZWFtICk7CglmcmVlKCBmbXQgKTsKCWZyZWUoIGhlYWQxICk7CglmcmVlKCBoZWFkMiApOwoJcmV0dXJuIDA7Cn0=