平成21年 秋期 基本情報技術者試験 午後 問9、C言語

本ページは、平成21年 秋期 基本情報技術者試験 午後 問9、C言語の解説です。
問題文、解答、解説の順で掲載しております。

***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

***********************************************************************************************************

次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

C言語では整数型の変数に格納できる値には上限がある。これを超える正の整数 (以下,正の多倍長整数という)の入出力と加算を行うプログラムである。

(1) 正の多倍長整数は,次に示す MP型の構造体を用いて表現する。
typedef struct{
int length;
long data[ARRAY_MAX];
}MP;

正の多倍長整数を,下位から9けたずつに切り分けて,
構造体MPのメンバである配列dataの要素番号の小さい方から順番に値を格納する。 例えば46284059827463859201283844157134007652918723147641 という整数の場合, 図のとおりになる。

02_総合問題1
構造体のメンバー length には,実際に値を格納した要素数を入れる。図の場合は6である。

(2) 関数の仕様は,次のとおりである。
void set(MP *num, const char str[]);

 引数: num MP 型の構造体で表現された多倍長整数
    str 文字列で表現された多倍長整数であって,1~9の数字で始まる。

 機能:文字列で与えられた多倍長整数strを変換して,MP型の構造体numに、格納する。numのメンバdataは,変換後の数値を格納するのに十分な要素数が 確保されているものとする。

返却値:なし

void print(const MP *num);

引数: num MP 型の構造体で表現された多倍長整数
機能:多倍長整数を出力する。

返却値:なし

void add(const MP *a, const MP *b, MP *c);

引数:a, b, c MP型の構造体で表現された多倍長整数であり,c は,a 及び b ではないものとする。
機能:二つの多倍長整数a,bの和を多倍長整数cに格納する。cのメンバdataは,加算処理を行うのに十分な要素数が確保されているものとする。

返却値:なし

(3) 次のライブラリ関数を用いる。

size_t strlen(const char *s);

機能:s が指す文字列の長さを計算する。
返却値:終端を示すナル文字に先行する文字の個数を返す。

〔プログラム〕
#include
#include

#define ARRAY_MAX 100
#define NUM_DIGIT 9
#define NUM_DIGIT_TH_POWER_OF_TEN 1000000000

typedef struct{
int length;
long data[ARRAY_MAX];
}MP;

void set(MP*, const char[]);
void print(const MP*);
void add(const MP*, const MP*, MP*);

/* 文字列から多倍長整数を扱う構造体に変換 */
void set(MP *num, const char str[]){
int str_idx = strlen(str) - 1;
int num_idx = 0;
int i;
long mul;

while( { a } ){
num->data[num_idx] = 0;
mul = 1;
for(i = O; { b } ; i++){
num->data[num_idx] += mul * (str[str_idx--]‐'0');
mul { c } ;
}
num_idx++;
}
num->length = num_idx;
}

/* 多倍長整数の出力 */
void print(const MP *num){
int i;

printf("%ld", num->data[num->length - 1]);
for( { d } ){
/* ゼロ詰めして必ず9けたを表示する。 */
printf("%09ld", num->data[i]);
}
printf("\n");
}

/* 二つの多倍長整数の加算 */
void add(const MP *a, const MP *b, MP *c){
int i;
int i_max;

if(a->length > b->length){
i_max = a->length;
}else{
i_max = b->length;
}
c->data[0] = 0;

for(i = 0; i < i_max; i++){
if(i < a->length) c->data[i] += a->data[i];
if(i < b->length) c->data[i] += b->data[i];

if(c->data[i] >= NUM_DIGIT_TH_POWER_OF_TEN){ ←―α
c->data[i + 1] = 1; ←―β
c->data[i] -= NUM_DIGIT_TH_POWER_OF_TEN;
}else{
c->data[i + 1] = 0;
}
}
if(c->data[i] == 0){
c->length = i;
}else{
c->length = i + 1;
}
}

設問1 プログラム中の { } に入れる正しい答えを,解答群の中から選べ。

a に関する解答群
ア str_idx != 0       イ str_idx < 0       ウ str_idx <= 0
エ str_idx > 0       オ str_idx >= 0       

b に関する解答群
ア i < NUM_DIGIT
イ i < NUM_DIGIT && str_idx <= 0
ウ i < NUM_DIGIT && str_idx >= 0
エ i < NUM_DIGIT || str_idx <= 0
オ i < NUM_DIGIT || str_idx >= 0

c に関する解答群
ア %= 10       イ *= 10       ウ += 10       
エ -= 10       オ /= 10

d に関する解答群
ア i = 0; i <= num->length - 1; i++
イ i = 0; i <= num->length - 2; i++
ウ i = num->length - 1; i >= 0; i--
エ i = num->length - 2; i >= 0; i--

設問2 プログラムの動作について, 次の記述中の { } に入れる正しい答えを解答群の中から選べ。
 関数 add を用いて以下の (1) に示す二つの多倍長整数を加算する場合, プログラム中のα部分は { e } 回実行され, β部分は { f } 回実行される。 また,以下の (2) に示す二つの多倍長整数を加算する場合, β部分は { g } 回実行される。

e ~g に関する解答群
ア 0       イ 1       ウ 2       エ 3
オ 4       カ 5       キ 6       ク 7

***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

***********************************************************************************************************

********************************************************************************
設問1
答 aオ 答 bウ 答 cイ 答 dエ

設問2
答 eオ 答 fイ 答 gエ

参考:平成21年 秋期 基本情報技術者試験 午後 問09
******************************************************************
解説

#include
は、入出力に関する関数が定義されている。本問題ではprintfなどの関数が該当する。

#include
は、文字列操作に関する関数が定義されている。本問題ではstrlenなどの関数が該当する。

#define ARRAY_MAX 100
定数を定義している。
ここでは、"100"をARRAY_MAXと定義している。

struct{
int length;
long data[ARRAY_MAX];
};
構造体の定義をしている。この構造体は、lengthとdata[]という変数を持っている。

typedef
   ・・・・
    MP;
既存の型に新しい名前を付けることができる。ここでは、構造体名をMPと定義している。

strlen(str)
strの文字列の長さを取得している。本問の図では、"50"となる。str_idxは、文字列数に"1"を引いた数をセットしている。上から順にプログラムを追ってみていく場合に、ここではstr_idxが何を表しているかわからない。もう少し、プログラムを読み進める必要がある。

while( { a } )
ここだけでは、{ a }に入るものは何かわからない。引き続き、プログラムを読み進めるしかない。

num->data[num_idx] = 0;
numはポインタの構造体である。ポインタの構造体の場合、構造体の要素を示す場合には"->"を使う。

for(i = O; { b } ; i++)
ここだけでは、{ b }に入るものは何かわからない。さらに、プログラムを読み進める。

num->data[num_idx]
num->data[]には問題文の説明より図の例では、次のようなデータをセットする必要がある。
num->data[0]="723147641"
num->data[1]="7652918"
num->data[2]="844157134"
num->data[3]="859201283"
num->data[4]="59827463"
num->data[5]="46284"

num->data[num_idx]で、最初はnum_idxに"0"がセットされている。
num->data[num_idx] += mul * (str[str_idx--]‐'0')なので、、num->data[0]に何らかと値をセットしようとしていることがわかる。

str_idxは図の例では"49"となる。
str[str_idx--]は、まずstr[str_idx]をしてから"-1"する。
str[49]には、図の例では文字列のもっとも右側の数値である"1"がセットされる。
strはchr型(文字型)となっている。‐'0'するのは文字コードの引き算をすることで、
文字コードから数値に変換している。

以上より、
num->data[num_idx] += mul * (str[str_idx--]‐'0');
で、num->data[0]から順に、文字列の一番右側からセットしていこうとしていることが
わかる。

mul { c } ;
では、解答は*=10となり、イとなる。
mul *=10 は
mul =mul*10のことで、
mul=1のとき、mul=10となり、
さらにmul=10のとき、mul=100となり
さらにmul=100のとき、mul=1000となる。
つまり、この式で、mulがカウントアップしていく形となっている。

よって、
num->data[num_idx] += mul * (str[str_idx--]‐'0')の部分は次のような処理となる。
1回目のループで
num->data[0]="1"
がセットされる。
2回目のループで
num->data[0]=10*4
となり、num->data[0]=41となる。
3回目のループで
num->data[0]=100*6
となり、num->data[0]=641となる。

{ b }
は、ループの終了条件である。
i
str_idxは、文字列の配列数を表しており、配列数は"0"以上の数値であることから解答はウかオとなる。data[5]のとき、dataの最大値9になる前にセットする文字列がなくなることから、str_idx>=0は必須の条件となる。よって解答はウとなる。

{ a }
解答群をみるとstr_idxの条件のみとなっている。str_idxは文字列の配列数を表しているから、str_idx>=0となる。

以上よりプログラムは上から順に解読していかなければならないが、本問題のようにある程度プログラムを我慢して読み進めないとプログラムは解読できない。また、問題も上から順に解けるわけではないことに注意する。

{ d }
問題文より図の場合にはnum->lengthは"6"が入っている。
num->dataはnum->data[0]からnum->data[5]となるので、
printf("%ld", num->data[num->length - 1])で"1"を引いている。

num->dataは配列の要素数が大きいものから表示している。
また、num->data[num->length - 1]はすでに表示済となるので、if文の初期条件は、
i = num->length - 2となる。

さらにデータは配列の要素数の大きいものから小さいものにかけて表示するので、繰り返し条件はi--となる。

よって、解答はエとなる。

{ e }
(1)の場合、i_maxが"4"になる。よってαは4となり、解答はオとなる。

{ f }{ g }
βはdata[]が9桁を超えた場合に実行される。
よって、(1)の上部の数列と下部の数列が9桁を超えるのは、1回なので、解答はイとなる。
同様に(2)の上部の数列と下部の数列が9桁を超えるのは、3回なので、解答はエとなる。

***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

***********************************************************************************************************




平成21年 春期 基本情報技術者試験 午後 問9、C言語

本ページは、平成21年 春期 基本情報技術者試験 午後 問9、C言語の解説です。
問題文、解答、解説の順で掲載しております。

***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

***********************************************************************************************************

次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

 与えられたパスを絶対パスに変換する関数 convert である。

 階層構造をもつファイルシステムにおいて,ファイルやディレクトリを 特定する文字列をパスという。ルートディレクトリを基準としたパスを絶対パスと呼び, “/”から始まり,各階層を“/”で区切っていく。与えられたパスがディレクトリのとき, 最後の“/”はあってもなくてもよい。例えば,図のディレクトリ e の絶対パスは “/a/d/e”又は“/a/d/e/”で示す。

 一方,カレントディレクトリを基準としたパスを相対パスと呼び,相対パスを 指定するときに階層を一つ上にたどる場合は“..”を用いる。 例えば,図においてディレクトリ c をカレントディレクトリにした場合, ファイル file1.txt の相対パスは“../file1.txt”,ディレクトリ e の相対パスは “../../d/e”又は“../../d/e/”となる。また,カレントディレクトリ自身は “.”又は“./”で示す。

01_総合問題1
関数の仕様は,次のとおりである。
void convert(const char *path,const char *base, char *result);

引数:path 変換前のパス
   base カレントディレクトリの絶対パス
   result 変換後の絶対パス

機能:path が相対パス表記であれば,base を基準にした絶対パス表記に変換し, result に格納する。path が絶対パス表記であれば,result には base に関係なく path をそのまま格納する。

返却値:なし。

 ただし,result が参照する領域は,変換後の文字列を格納するのに十分であるとする。 また,冗長なパス又はパスとして認識できない文字列が引数として与えられることはないものとする。

(2) ファイルシステム上に,指定されたディレクトリやファイルが実際に存在するかどうかのチェックは行わない。

(3) 変換例を表1に示す。

(4) 次のライブラリ関数を用いる。

unsigned int strlen(const char *s);
  機能:文字列 s の長さを計算する。
  返却値:終端を示すナル文字に先行する文字の個数を返す。
int strcmp(const char *s1, const char *s2);
  機能:文字列 s1 と文字列 s2 を比較する。
  返却値: s1 と s2 が同一文字列の場合は0,それ以外の場合は0以外を返す。

int strncmp(const char *s1, const char *s2, int n);
  機能:文字列 s1 と文字列 s2 を先頭から n 文字,又はナル文字までを比較する。
  返却値:比較した n 文字が同一の場合は0を, それ以外の場合(比較が途中で終了した場合も含む)は0以外を返す。

char *strcpy(char *s1, const char *s2);
  機能:文字列 s1 に文字列 s2 をナル文字まで複写する。
  返却値:s1

char *strncpy(char *s1, const char *s2, int n);
  機能:文字列 s1 に文字列 s2 を n 文字複写する。s2 の長さが n 以上の場合は n 文字目までを複写し,n 未満の場合は残りをナル文字で埋める。
  返却値:s1


〔プログラム〕
#include
void convert(const char*, const char*, char*);

void convert(const char *path, const char *base, char *result){

const char *pp, *bp;
char *rp;
int length;

/* pathが絶対パス表記の場合 */
if(*path == '/'){
{ a };
return;
}
/* pathがカレントディレクトリの場合 */
if(!strcmp(path, ".") || !strcmp(path, "./")){
{ b };
return;
}

length = strlen(base);
bp = base + length; /* bpは文字列baseの終端を指す。*/
if(*(bp - 1) == '/')
--bp;

/* pathの先頭部にある".."又は"../"を解析することで,
baseのパス表記のうち,どこまでresultと共通になるかを調べる。*/
for(pp = path; *pp != '\0' && *pp == '.';){
if(!strncmp(pp, "../", 3)){
pp += 3;
while(bp > base && *--bp != '/');
}else if(!strncmp(pp, "./", 2)){
pp += 2;
}else if(!strncmp(pp, "..\0", 3)){
pp += 2;
while(bp > base && *--bp != '/');
}else{
break;
}
}
/* baseのパス表記と共通な部分をresultに複写する。*/
length = { c };
strncpy(result, base, length);

rp = { d };
*rp++ = '/';

/* pathの文字列のうち,先頭部分の"./"や".."を除いた残りの
部分(ppが指す文字列)を,resultの文字列に追加する。 */
strcpy(rp, pp);
return;
}

設問1 プログラム中の{ }に入れる正しい答えを, 解答群の中から選べ。

a,b に関する解答群
ア strcpy(base, path)     イ strcpy(base, result)
ウ strcpy(path, base)      エ strcpy(path, result)
オ strcpy(result, base)     力 strcpy(result, path)


c に関する解答群
ア bp ‐base     イ bp - path
ウ pp - base     エ pp - path

d に関する解答群
ア base + length       イ bp + length
ウ path + length       エ pp + length
オ result + length

設問2 表2の引数列で関数 convert を呼んだときのプログラムの動作について,表2中の{ }に入れる正しい答えを,解答群の中から選べ。ただし, プログラム中の{ a }~{ d }には 正しい答えが入っているものとする。

e に関する解答群
ア ../d/       イ ../../../../d/
ウ /         エ /../d/
オ /d/        力 d/

f,g に関する解答群
ア /a/b/c/d      イ /a/b/c/d/
ウ /a/b/cd       エ /a/b/cd/
オ d          力 d/

***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

***********************************************************************************************************
********************************************************************************
解答
問1
答 aカ 答 bオ 答 cア 答 dオ

問2
答 eオ 答 fイ 答 gア

********************************************************************************
解説
#include
#includeは別のファイルで宣言されている関数をファイルに埋め込むことができる。
string.hではstrcpyなど文字列操作に関する関数が定義されている。

void convert(const char*, const char*, char*);
関数の定義は宣言している。

const char *pp, *bp;
const修飾子は指定した変数が定数であるを示す。定数であるということは、変数のように中身が変更できなくなる。これによって人為的なミスを防ぐことが出来る。

if(*path == '/')
*pathの一文字目に'/'が入っているか確認している。問題文にある通り絶対パスの場合は “/”から始まるから、c言語のコメントの通り、pathが絶対パス表記であるかを確認している。

{ a }
関数の仕様により、絶対パス表記であれば,result には base に関係なく path をそのまま格納する。よって、{ a }は「カ」となる。

strcmp(path, ".")
ライブラリ関数の通り、pathという文字列全体と"."を比べて、pathが"."と同一であれば、”0”となる。If文は0以外であれが真として扱われ、0であれば偽と扱われる。よってそのままでは同一の時に偽と判断されてしまう。そこで、!strcmp(path, ".")の!で否定を行う。否定は、偽の場合「真」となり、真の場合「偽」となる。

if(!strcmp(path, ".") || !strcmp(path, "./"))
ではコメントにある通り、pathがカレントディレクトリである場合の処理を行う。関数の仕様により、baseには カレントディレクトリの絶対パスが入っているよって、結果、*result
に*baseをセットしてやればよいことがわかる。よって、{ b }は、「オ」となる。

bp = base + length
lengthには”base”の文字列数が入っている。
base は、文字列ポインタで最初のアドレスが入っている。文字列のアドレスは下図のように連番になっている。例えば、下図のような文字列の時、lengthは文字列が”abc””であることから”3”となる。baseに先頭のアドレス”100”が入っているとすると、base + lengthは103となり、終端文字である\0が入る。*(bp - 1)することにより、文字列の最終文字が入る。
アドレス 値
100 a
101 b
102  c
103 \0

for(pp = path; *pp != '\0' && *pp == '.';)以下
ロジックを解析する場合には具体的な値を想定していけば、わかりやすい。
例えば、path=../../b/c/ 、base=/a/d/e/とする。

for(pp = path;・・・・・
でppに“../../b/c/“に文字の先頭アドレスをセットする。
if(!strncmp(pp, "../", 3))でppの最初の3つの文字が"../"かどうかを判別している。
この例であると、最初の3つの文字が"../"であるから、ifの中に入ってくる。

pp += 3
で3つアドレスを移動する。よって、ppに“../「.」./b/c/“の「」の部分のアドレスが設定される。

while(bp > base && *--bp != '/');
でbpは文字列“base=/a/d/e「/」”の「」のアドレスが設定されている。--bpでbpは一つ前の文字のアドレスである文字列 “base=/a/d/「e」/”の「」の文字アドレスが設定される。
--bp != '/'までループするということなので、文字列“base=/a/d「/」e/”の「」の文字アドレスが入る。

ここで何をしているかという相対パスをたどりながら、絶対パスを求めていることがわかる。ここまでの処理で、相対パスの“../b/c/は、絶対パスの/a/d/であることがわかる。

For文でループするので、この例の最終結果は、
ppに文字列“../../「b」/c/“の「」の部分のアドレスが設定され、
bpに文字列“base=/a「/」d/e/」” の「」の部分のアドレスが設定される。

{ c }
では、resultに”/a/”の部分をセットしたい。baseは文字列”「/」a/”の「」の文字アドレスが入っており、bpには文字列” /a「/」”の文字アドレスが入っている。よって、lengthは、
bp- baseで求めらるので、解答はアとなる。

厳密には、下表のようになっているとすると、bp- baseは2となる。

アドレス  値
100 /
101 a
102 /

strncpy(result, base, length)
で2文字をコピーすることから、resultには” /a/”ではなく、” /a”の文字が入っている。よって、*rp++ = '/'でresultに” /a/”が入ることになる。

これは、設問2にも関わることであるが、baseの最終文字が”/”で終わってなくても、rusultを求める過程で、”/”という文字が必ずセットされる。

{ d }
strcpy(rp, pp)で、resultにセットされている”/a/”にppの”b/c/”をセットしたいので、rpには、resultをセットしてその文字列アドレスを最終文字にしておく必要がある。
よって、result+lengthを行う必要があるので、解答はオとなる。

***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

***********************************************************************************************************

設問2

{ e }
pathを順に遡っていくと以下のようになる。
path=../../../../d/  base=/a/b/c/
path=../../../d/  base=/a/b/
path=../../d/  base=/a/
path=../d/  base=/

path=../d/  base=/のとき、
for(pp = path; *pp != '\0' && *pp == '.';)のループ条件「*pp != '\0' && *pp == '.'」は満たしているので、ループの中に入ってくる。
if(!strncmp(pp, "../", 3))もif文を満たしているので、ifの中に入ってくる。よって、pp += 3となり、path=d/となる。
while(bp > base && *--bp != '/');でbase=””となる。

設問1より、resultの結果は*rp++ = '/'で”/”が足され”/d/”となる。よって、解答はオとなる。

{ f }{ g }
設問1で解説した通り、baseの文字が”/a/b/c”であっても必ず、”/”は文字が足されるので、解答のウとかエになることはない。また、pathの文字はstrcpy(rp, pp)で、そのまま足されているので、fの解答は/a/b/c/d/となり解答はイであり、gの解答は/a/b/c/d       となり解答はアとなる。

参考:平成21年 春期 基本情報技術者試験 午後 問09

adwords

外部リンク

カテゴリーメニュー 改
カテゴリ
検索フォーム
広告
最新記事
月別アーカイブ
Lc.ツリーカテゴリー
全記事表示リンク

全ての記事を表示する

リンク
各種タグ
キーワードをクリックすると該当のページに移動

中小企業診断士 情報システム  基本情報技術者のC言語 「レスリスバーガーの人間関係論(社会体系論) 「バーナードの協働体系論 「経営の階層 経営組織の体系 「官僚的組織」 「ITパスポートの徹底研究、通信講座」 「基本情報処理技術者試験の徹底研究、通信講座」 「当社のシステム開発サービスのご説明」 「マトリックス組織」 組織の活性化 「テイラーの科学的管理法 マズローの欲求5段階説 経営基本管理(コンティンジェンシー理論) 経営基本管理(SL理論) 経営基本管理(技術システムの高度化と組織) 経営基本管理(分化と統合の理論) 経営基本管理(意思決定論) 経営基本管理状況(適応的リーダーシップ理論) 経営基本管理(システム4理論) 行動科学理論(マネジリアル・グリッド) 動機づけ・衛生理論 行動学理論(ホーソン実験) 行動科学理論(フォードシステム) 経営基本管理(期待理論) XY理論 

当社のシステム開発の詳細
当社はaccess-excelでの小規模システム開発を中心に年間に50社以上の開発実績がございます。詳細は06-6599-8890ないしinfo@ai-light.comまで今すぐお問合せください
プロフィール

itkeieinews

Author:itkeieinews
ITと経営ニュースへようこそ!
アイライトIT経営研究会
株式会社アイライト
電話でのお問合せは06-6599-8890
Email:info@ai-light.com

メールフォーム
こちらからも簡単にメールを送付できます。当社のサービスに関してご質問がございましたら、よろしければ、ご利用ください。直接お電話の場合は06-6599-8890までご連絡ください。

名前:
メール:
件名:
本文:

お気に入り
本サイトをそのまま消してしまうと、もう探せなくなってしまうかもしれません。 当社はいずれお役に立てることがあるかと思いますので、よろしければお気に入りにご登録ください。
リンクツリーV1.1a
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
QRコード
QR
最新コメント
最新トラックバック
フリーエリア