お世話になります。最近文字列を勉強し始めたのですが、文字列になるとてんでダメになってしまいます・・・。お聞きしたいことは2つあります。

1.テキストファイルから英単語を読み込み、それらをアルファベット順に並べ、新たにテキストファイルに書き込むというものです。例えば、
january
February
march
April
Apple
と読み込んだなら、
Apple
April
February
january
march
と書き込みたいのです。文字列を配列に格納し、一文字一文字比較していきたいのですが、文字だとどのように比較して順番を変えればよいのでしょうか。数字の比較なら簡単に出来るんですが、文字だとわからなくなってしまいます。

2.これも同じく文字なのですが、テキストファイルから英単語、あるいは英語のフレーズを2つ読み込み、その2つの英語がアナグラムかどうかを判定するものです。
アナグラム→http://d.hatena.ne.jp/keyword/%A5%A2%A5ʥ%B0%A5%E9%A5%E0
例えば、「O, Draconian devil!」と「Leonardo da Vinci!」を読み込んでアナグラムか判定します。ちなみにこれはアナグラムです。これも一文字一文字比較していくと思うのですが、どのように比較すれればよいのかがわかりません。どなたか宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (10件)

#include <stdio.h>


#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int isanagram1(char *str1, char *str2)
{
int c1[256] = {0}, c2[256] = {0}, i;

while(*str1) c1[tolower(*str1 ++)] ++;
while(*str2) c2[tolower(*str2 ++)] ++;
for(i = 0; i < 256; i ++){
if(isalpha(i) && (c1[i] != c2[i])) return 0;
}
return 1;
}

void selectalpha(char *str)
{
char *c0, *c1;

for(c0 = c1 = str; *c0 = tolower(*c1); c1 ++) c0 += (isalpha(*c0) != 0);
}

void count(char *str, int *c)
{
char *al = "abcdefghijklmnopqrstuvwxyz", *p;

selectalpha(str);
while(*str){
if((p = strchr(al, *str ++)) != NULL) c[p - al] ++;
}
}

int isanagram2(char *str1, char *str2)
{
int c1[26] = {0}, c2[26] = {0}, i;

count(str1, c1);
count(str2, c2);
for(i = 0; i < 26; i ++){
if(c1[i] != c2[i]) return 0;
}
return 1;
}

int compc(const void *c1, const void *c2)
{
return *(char *)c1 - *(char *)c2;
}

int isanagram3(char *str1, char *str2)
{
selectalpha(str1);
selectalpha(str2);
qsort(str1, strlen(str1), sizeof(char), compc);
qsort(str2, strlen(str2), sizeof(char), compc);
return !strcmp(str1, str2);
}

int main(void)
{
char str1[32] = "O, Draconian devil!";
char str2[32] = "Leonardo da Vinci!";
char *result[2] = {"Not Anatram", "Anagram"};

puts(str1);
puts(str2);
printf("%s\n", result[isanagram1(str1, str2)]);
puts(str1);
puts(str2);
printf("%s\n", result[isanagram2(str1, str2)]);
puts(str1);
puts(str2);
printf("%s\n", result[isanagram3(str1, str2)]);
puts(str1);
puts(str2);
return 0;
}
    • good
    • 0
この回答へのお礼

悩んでいた所が一気に解決されました^^驚きました!
本当に感謝感謝です!ありがとうございます!!

お礼日時:2008/04/17 16:43

No4, 5 です。



>1つ目のプログラムは出来ました。皆様ありがとうございました!

よかったですね、「ソート」は一度習得すれば、あとは応用ですから。
-------------------------------------------------
>No.3 様が以前ご指摘されたように、まずO, Draconian devil!を
>昇順に並べ替え、次にLeonardo da Vinci!を同じく昇順に並べ替
>えようとしたのですが・・(投稿者一部修正)

★No4 で記しましたように、この方法では難しいと思います。

>それと、比較はcase-insensitiveなので大文字小文字は区別しません。

★このことの処理を、「昇順に並べ替え」る前にしないといけませんね。
-------------------------------------------------
>1つの文字列を昇順にする方法が見つかりません。

★以降に示します(「丸投げ」返球ですが、この方法では本来の目的が叶えられないことを示すため、ソース全文を投稿します)。

#include <stdio.h>
#include <string.h>

void Sort32( char cWork[] )
{
 int i, j, iLen;
 char cDummy;

 iLen = strlen( cWork );

 for( i = 0; i < iLen; i++ ){

  for( j = i; j < iLen; j++ ){

   if( cWork[i] < cWork[j] ) continue;

   cDummy = cWork[i];
   cWork[i] = cWork[j];
   cWork[j] = cDummy;
  }
 }
}
void main()
{
 char cDevil[32] = "O, Draconian devil!";
 char cVinci[32] = "Leonardo da Vinci!";

 Sort32( cDevil );
 Sort32( cVinci );

 printf( "%s\n", cDevil );
 printf( "%s\n", cVinci );
}
注:インデントに全角空白を用いています(タブに一括変換して下さい)。

☆実行すると、
「__!,DOaacdeiilnnorv」
「__!LVaacddeiinnoor」 となります。
(投稿表示のため、半角スペースの代わりに _ を使用)

No.3 さんの
>並べ替えた文字列を、先頭から1文字ずつ比べていきます。

★↑難しいどころか、できないですよね。

★「並べ替え」方式でなく、「26文字種の使用数をカウント」方式を
 お勧めします( case-insensitive 対応)。
 これですと、例のように文字列長が異なる場合にも使えます。
    • good
    • 0
この回答へのお礼

文字列をそれぞれ大文字に変換してソートし比較するようなプログラムを作りました。
しかしどちらか一方の文字列に!や,が含まれているとやはり比較してもアナグラムと判断できませんね・・・。
大文字変換の際、配列が!や,に当たると、その配列自体を削除してしまえば、と考えたのですが、その方法がわかりませんでした・・・。
yama5140様がご指摘したように、使用数をカウントする方法で考えたいと思います。本当にありがとうございました!

お礼日時:2008/04/17 16:37

> この方法を調べても、2つ以上の文字列を昇順にする方法(私の1つ目の質問のような)は沢山見つかるのですが、


> 1つの文字列を昇順にする方法が見つかりません。

ソートなどのアルゴリズムについて解説している書籍で
勉強なさることを強くおすすめします。
    • good
    • 0
この回答へのお礼

近いうちに探してみたいと思います。ありがとうございました。

お礼日時:2008/04/17 16:30

> fgetsはファイルを読み込むための関数でしたよね



fgets()の第3引数にstdinを指定すれば、標準入力(例:キーボード)からの
入力を受け取れます。
    • good
    • 0

> 「O, Draconian devil」のようにスペースを入れると、cDevilにO,が、cVinciにDraconianが入ってしまい、セグメンテーションエラーを起こしてしまいました。


> 私のこのやり方はまずかったでしょうか・・・?

scnaf()を使うと、スペースを受け取った時点で、例えばcDevilへの
入力を終了したものとみなします。
別の関数、例えばfgets()あたりを使ってみてはいかがでしょうか。

> 例えば単純に、erosとroseを入力してもアナグラムではないと表示されます。

どういったコードでですか?

> と、Count26が2つあるからでしょうか。

何をしたときに矛盾と出たのでしょうか?
行なったこととエラーメッセージを正確に教えてください。
なお、どの関数を何回呼び出しても全く問題ありません。

この回答への補足

メンテ終わりましたね^^ 初めの質問の所で誤りがありました。
アナグラムかどうか判断するプログラムは、テキストファイルから読み込むのではなく、キーボードから打ち込みます。
それと、比較はcase-insensitiveなので大文字小文字は区別しません。すみませんでした。
1つ目のプログラムは出来ました。皆様ありがとうございました!

>asuncion様
キーボードからの入力でscanfを使用したのですが、ご指摘されたようにスペースを使うと正しく入力されないですね。
fgetsはファイルを読み込むための関数でしたよね。これは私の誤りでした。申し訳ありません。
スペースを使っても正しく入力できる関数はありますでしょうか。

eros、roseを試したコードはyama5140様のコードで試させて頂きました。
以下、yama5140様のコードです。

char cDevil[32], cVinci[32];
 int iCnt[26] = { 0 }, iCode, i;

 for( i = 0; i < 32; i++ ){ // cDevil

  if( 0x00 == cDevil[i] ) break; // 文字列終わり

  if( 0 == isalpha( cDevil[i] ) ) continue; // 「英文字」判定

  iCode = toupper( cDevil[i] ) - 0x41; // 大文字化(◆)

  iCnt[ iCode ]++; // 加算
 }
 for( i = 0; i < 32; i++ ){ // cVinci

  if( 0x00 == cVinci[i] ) break;

  if( 0 == isalpha( cVinci[i] ) ) continue;

  iCode = toupper( cVinci[i] ) - 0x41;

  iCnt[ iCode ]--; // 減算
 }
 for( i = 0; i < 26; i++ ){ // アナグラム判定
 
  if( 0 == iCnt[i] ) continue;

  printf( "アナグラムではありません\n" );

  break;
}

asuncion様が以前ご指摘されたように、まずO, Draconian devil!を昇順に並べ替え、次にLeonardo da Vinci!を同じく昇順に並べ替えようとしたのですが、
この方法を調べても、2つ以上の文字列を昇順にする方法(私の1つ目の質問のような)は沢山見つかるのですが、1つの文字列を昇順にする方法が見つかりません。
良い方法はありますでしょうか。

補足日時:2008/04/16 19:01
    • good
    • 0

No4 です。



>私は配列をs[256]と1つだけ用意し、
>テキストファイルから読み込んでいるのですが

テキストファイルが、
january
February
march
April
Apple
のようになっていると s[256] には最後の Apple だけが入り、
それ以前の行(レコード)のデータは上書きされてしまいます。
(まさか連結なんかしてないよね?←複雑そう)

★次のように、格納してからでないと・・・。

char cBuf[256], cStore[GYO][256];

while( NULL != fgets( cBuf, 256, fp ) ){

 strcpy( cStore[iLine++], cBuf ); // 格納
}

(ソート)
if( 0 < strcmp( cStore[i], cStore[j] ) ){
(入れ替え(別の配列に待避などで))
}
(出力)
☆ソートについては、検索すればいっぱい出てきます。
--------------------------------------------------
★前回の回答で、関数化できる部分がありました。

 ・
Count26( cDevil, iCnt, 1 ); // 関数呼び出し
Count26( cVinci, iCnt, -1 );
 ・
}
void Count26( char cWork[], int iCnt[], int iAdd )
{
 int i, iCode;

 for( i = 0; i < 32; i++ ){

  if( 0x00 == cWork[i] ) break; // 文字列終わり

  if( 0 == isalpha( cWork[i] ) ) continue; // 「英文字」判定

  iCode = toupper( cWork[i] ) - 0x41; // 大文字化にして

  iCnt[ iCode ] += iAdd; // 加減
 }
}

この回答への補足

ご返答ありがとうございます!
まず2つ目で質問です。
とりあえずキーボードから文字を入力し試しました。
printf("文字を入力\n");
scanf("%s", cDevil);
scanf("%s", cVinci);

そしてyama5140さんのおっしゃるようにプログラムを動かしてみたのですが、エラーが起きてしまいました。
「O, Draconian devil」のようにスペースを入れると、cDevilにO,が、cVinciにDraconianが入ってしまい、セグメンテーションエラーを起こしてしまいました。
私のこのやり方はまずかったでしょうか・・・?
2、スペースを入れなくても、どの文字を入力してもアナグラムではないと表示されてしまいます。
例えば単純に、erosとroseを入力してもアナグラムではないと表示されます。
3、関数ですが、矛盾と出てしまいました。
Count26( cDevil, iCnt, 1 );
Count26( cVinci, iCnt, -1 );
と、Count26が2つあるからでしょうか。

補足日時:2008/04/15 20:36
    • good
    • 0

★1.は文字列群を昇順にソートし、ソート結果をファイル出力。



 ・ソートでは strcmp() を用いる(戻り値、正負で大小判定)。
----------------------------------------------
☆質問者様の2.における例文字列、

 「O, Draconian devil!」と
 「Leonardo da Vinci!」を見ると、
 
  , が一方のみに使われ、文字列長が異なる。
  (プロポーショナルでの見かけの文字列長調整?)。

 ことから、2つの文字列内をソートし、結果どうしを「比較」する方法では難しいと思います。

★大文字・小文字を同じとして、26文字種の使用数をカウントし、
 双方の使用数が同じかどうかで判定すれば、と思います。

 a と A の使用数が iCnt[0] に入ります(◆)。

 char cDevil[32], cVinci[32];
 int iCnt[26] = { 0 }, iCode, i;

 for( i = 0; i < 32; i++ ){ // cDevil

  if( 0x00 == cDevil[i] ) break; // 文字列終わり

  if( 0 == isalpha( cDevil[i] ) ) continue; // 「英文字」判定

  iCode = toupper( cDevil[i] ) - 0x41; // 大文字化(◆)

  iCnt[ iCode ]++; // 加算
 }
 for( i = 0; i < 32; i++ ){ // cVinci

  if( 0x00 == cVinci[i] ) break;

  if( 0 == isalpha( cVinci[i] ) ) continue;

  iCode = toupper( cVinci[i] ) - 0x41;

  iCnt[ iCode ]--; // 減算
 }
 for( i = 0; i < 26; i++ ){ // アナグラム判定
 
  if( 0 == iCnt[i] ) continue;

  printf( "アナグラムではありません\n" );

  break;
 }
注:インデントに全角空白を用いています。

参考URL:http://e-words.jp/p/r-ascii.html

この回答への補足

皆様ご回答本当にありがとうございます!
皆様のいうstrcmp関数を始めて知りました。全然勉強不足です。頑張ります!
さて、1つ目ですが、strcmpの使い方を調べ数時間粘ったのですが、躓いてしまいました。
strcmpを使う場合、2つの配列が必要となりますよね。
しかしこの場合、私は配列をs[256]と1つだけ用意し、テキストファイルから読み込んでいるのですが、これだと比較をどうすればいいのかがわかりません。
配列を2つ用意しようとすると、今度はどうテキストファイルから文字を読み込み2つの配列に格納すればいいのかがわからなく躓いてしまいました。
これを解決する方法はありますでしょうか?

補足日時:2008/04/15 17:47
    • good
    • 0

> 「O, Draconian devil!」と「Leonardo da Vinci!」



双方の文字列をそれぞれ昇順または降順に並べ替えます。
並べ替えた文字列を、先頭から1文字ずつ比べていきます。
途中に食い違いがあればアナグラムではありません。
最後まで同じであればアナグラムです。
    • good
    • 0

文字列の比較の仕方ですね。



strcmp などの関数を使うと大小関係が得られます。
a<b<・・・<z です。アスキーコードだったら
a=31 b=32 となっています。

御自分で比較する場合は、文字として比較します。

str1[0] < str2[0]

といった具合ですが、文字列の数だけ行う必要が
あります。
    • good
    • 0

 


 1、strcmp

 2、それぞれの文字数を比較
 
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q歯を削るときなんで痛く感じるのですか? 歯を削るだけなら痛くないのに

歯を削るときなんで痛く感じるのですか?
歯を削るだけなら痛くないのに

Aベストアンサー

歯は基本的に硬組織と呼ばれる硬い結晶で出来ています。一番表面はエナメル質と呼ばれ この硬い結晶成分のみでできています。この部分は削っても痛みは全くありません。
2層目は象牙質(dentin)と呼ばれやや硬い組織で出来ています。そして歯の中央・最深部は歯髄・いわゆる神経と呼ばれる軟組織(普通の神経・血管組織)となっています。
この2層目の象牙質には 歯髄から細い繊維が入り込んでいてエナメル質直下まで 神経組織が伸びています。従って 歯を削る時にこの象牙質を削ると いっしょに神経組織まで削ってしまう事になり 強い痛みを発する事になるんです。普通 象牙質だけを削るよりも、この神経繊維の末端・つまりエナメル質と象牙質の境目を削る時の方がはるかに強く痛みを感じますねぇ~ 痛みを感じない部分から突然痛みを感じる部分に入った瞬間に急激な痛み・あの独特の痛みがあるわけです。
もちろん 歯を削る時の痛みは、神経だけの問題ではありません。タービンと呼ばれる機器・ドリルによって削る事が多いですが、この切削具の振動・回転する摩擦熱等が歯の知覚組織に伝わる事も痛みの原因となります。最近では、タービンを使わないレーザー光線による切削も多くなり、削る時の痛みは大幅に軽減されています。また、機器の振動を抑える工夫もなされており、機器の振動と似た振動を他の箇所に与える事により、痛みの閾値を上げてしまう(わかりやすく言うと 振動で神経を麻痺させて痛みを感じにくくする事)方法も行われています。

さて、通常の治療で歯を削る時は、神経のある歯(虫歯が小さい場合)や 神経を取る処置の場合、麻酔を使うことがほとんどでしょう。
えまく麻酔が効けば 痛みは全く感じなくなります。ただ、歯科の麻酔は歯の神経を麻痺させねばなりません。歯の神経の出口は 歯の根の先端・つまり骨の中にあるんです。
これを麻酔することはなかなかに難しい事なんです。普通 顎の骨は硬く厚い骨が多く なかなか麻酔薬が内部に浸潤してくれません。かなりの力を入れて圧力をかけないと 硬い骨を通り越してくれませんので、歯科の麻酔はそれだけでも痛いのです(^o^;...この時 骨の厚さによって麻酔が効く効かないが別れますね~
実は同じように 歯のエナメル質の厚さによっても削る時の痛みに差があるのです。例えば同じ歯でも、切端部・先っぽの方はエナメル質が厚いので少々削っても痛みません。逆に根元に近い部分はエナメル質が薄く 象牙質がすぐ直下にあるために痛みが感じやすいと言えます。
また、年齢によっても痛み方に大きな差があります。歯は生えたばかりはまだ幼弱で 歯髄が大きく象牙質が薄いのです。それだけ削る時に神経に近くなってしまい痛みが出やすいですねぇ~
逆に生えてから何十年も経った歯は・・・・つまり老人の歯は 多少削っても痛みません。これは長い間に神経が退化したり象牙質が石灰化して硬化したために 痛みを感じる神経が退化して・あるいは無くなってしまったからです。麻酔を使わずにどんなに削っても 全く痛まないことも しばしばあります。

いずけにしても痛みの感じ方には大きな個人差があります。痛いと感じたなら 左手を挙げて・・・・・ヽ(;^^)/ まぁ、歯科医師にお伝え下さい。

歯は基本的に硬組織と呼ばれる硬い結晶で出来ています。一番表面はエナメル質と呼ばれ この硬い結晶成分のみでできています。この部分は削っても痛みは全くありません。
2層目は象牙質(dentin)と呼ばれやや硬い組織で出来ています。そして歯の中央・最深部は歯髄・いわゆる神経と呼ばれる軟組織(普通の神経・血管組織)となっています。
この2層目の象牙質には 歯髄から細い繊維が入り込んでいてエナメル質直下まで 神経組織が伸びています。従って 歯を削る時にこの象牙質を削ると いっしょに神経組織...続きを読む

Q文字列中からある文字列とある文字列の間にある文字列を取得

表題にあるとおり間の文字列をどうやって取得するべきかと悩んでいます・・
abcdefghijklmn・・・
となっているとき
bとe、aとkなど間の間隔が不定なときはどのようにして文字列を取得したらよいのでしょうか?
最初の2文字は与えられているとして考えています。
インターネットのURLで言うなら/から/までの間の文字列と言うことになります。
今私が考えているのは
strchrで位置のアドレスを取得してそこからfor文かwhile文で指定の2文字目が出るまでまわすのかなぁ・・と思っています。
ですが具体的にどのような感じに書けばいいのかがわかりません。どなたかご教授ください。

Aベストアンサー

2文字の間でいいのなら strchr() を2回使えばいいと思います。



char *p, *q;

if ((p = strchr(s, 'b')) != NULL) {
 if ((q = strchr(p + 1, 'e')) != NULL) {
  /* p + 1 ~ q - 1 が 'b' から 'e' の間の文字列 */
  size_t len = q - p - 1; /* これがバイト数 */
  printf("%-.*s\n", len, p + 1); /* 出力 */
 }
}

複数の文字の中のいずれかの文字が出現した所で区切りたいなら strpbrk() か strtok() を使えばいいと思います。

Q歯を削る(レーザー、カリソルブ、水流、ドリル)比較について

【質問・要点】
昨日、インレーが取れました。そこで、少し削って新しいインレーを入れると思うのですが、以下4つを考えたのですが、いったい、どれが最も良い治療法なのでしょうか?

レーザー
カリソルブ
水流で削る
ドリルで削る

【一応私が考える判断基準】
最も歯を削る体積が小さい治療法、
術後、2次齲蝕が最も少ない治療法
最も痛くない治療法

他に、もっと良い治療法やアドバイスがあれば、ご教示、何卒、宜しくお願い致します。

Aベストアンサー

歯科医です。
>レーザー
>カリソルブ
>水流で削る
>ドリルで削る
沢山質問されていますが
ここでまとめて。
まず、レーザーでインレーが入れられるほど削るのはできないです。削除量が圧倒的にすくなくて、綺麗な形態に削ることができないから。
カリソルブも同様です。
水流で削るのは歯に対して現在そういう器具はありません。
ドリルで削る・・・・ドリルというのは恐らくエアタービンもしくはエンジンのどちらかをさしておられる
のでしょうか。タービンで削ることが一番でしょうね。

インレーがはずれたのではなく
新しい虫歯であるのなら削除量のことを考える余地があります。しかし
何分にもすでにインレーの体積分は歯が失われているので
削除量を少なくする事に意義は見出せません。
さらに虫歯になっていなければ大抵の場合はほとんど削らなくてもよいでしょう。
取れたところがさらに虫歯になっているのであれば
削除量云々言う前に
虫歯をとりさることが肝要です。二次カリエスにならないためにはこれがもっとも大切なことです。
痛くない治療法・・・は麻酔を的確に使用して治療することでしょう。

それから
インレーはわりと易しい技工物ですので
一般的なレベルの技工士さんであれば
十分な適合の良いきれいなインレーを作りますよ。

異種金属が口腔内にあることの是非は討論の余地があるのですが
一般的に言って
接しているところでなければ
大きな問題はおきないです。
接するところではそこに小さな電池ができるようなものなので
電流が流れます。

それよりなにより
一日も早く治療を受けてください。
放置しておくことに良い点は一つもありません。

歯科医です。
>レーザー
>カリソルブ
>水流で削る
>ドリルで削る
沢山質問されていますが
ここでまとめて。
まず、レーザーでインレーが入れられるほど削るのはできないです。削除量が圧倒的にすくなくて、綺麗な形態に削ることができないから。
カリソルブも同様です。
水流で削るのは歯に対して現在そういう器具はありません。
ドリルで削る・・・・ドリルというのは恐らくエアタービンもしくはエンジンのどちらかをさしておられる
のでしょうか。タービンで削ることが一番でしょうね。

イン...続きを読む

Q最近c言語を勉強し始めたのですが解決できない問題が出来たので質問です。

最近c言語を勉強し始めたのですが解決できない問題が出来たので質問です。 入力された整数nに対して Σ{i=0→n} 1/i! を計算するプログラムなんですがわかる方がいたらよろしくお願いします。

Aベストアンサー

プログラムというより、どちらかというと数学の問題ですね。

Σ{i=0→n} 1/i! の値はよく知られているように、nが無限大の時にネイピア数(自然対数の底)eになります。

nがある値以上の場合には有効桁数が溢れて演算が無効になりますからその時はeを返せばよいということです。
有効桁数が溢れて演算が無効になるnをn_MAXとおくと、

#include <math.h>

if (n > n_MAX) return(M_E);

となります。M_Eはコンパイラが提供するネイピア数です。n_MAXは処理系固定なので予めプリプロセッサで計算しておくか、定義しておきます。

つぎに計算量を小さくする工夫が必要です。上記のようにn_MAXを求めておいた場合には
nがn_MAXに近い場合には減算した方が速いので処理を分離します。

// n_MAX!は予め計算しておくこと
#define fact_MAX = 1.0/(double)(n_MAX!);

if (n > (n_MAX - n)) {
double s, fact;
int i;

// s = Σ{i=n+1 → n_MAX} 1/i! の計算
s = fact = fact_Max;
for (n += 1, i = n_MAX; i > n ; i--) {
fact *= (double)i;
s += fact;
}
return(M_E - s);
}

以下は他の回答者の方を参考にしてみてください。

プログラムというより、どちらかというと数学の問題ですね。

Σ{i=0→n} 1/i! の値はよく知られているように、nが無限大の時にネイピア数(自然対数の底)eになります。

nがある値以上の場合には有効桁数が溢れて演算が無効になりますからその時はeを返せばよいということです。
有効桁数が溢れて演算が無効になるnをn_MAXとおくと、

#include <math.h>

if (n > n_MAX) return(M_E);

となります。M_Eはコンパイラが提供するネイピア数です。n_MAXは処理系固定なので予めプリプロセッサで計算しておくか、定義...続きを読む

Q勉強の為に睡眠削るのは確かにダメですが 勉強スケジュール上、このままでは間に合わないという状況では、

勉強の為に睡眠削るのは確かにダメですが
勉強スケジュール上、このままでは間に合わないという状況では、削るのは仕方なくないですか?エナジードリンクなり、使って

Aベストアンサー

まあその前に 遊びの時間は削るはな
その上で足りなければ トイレの時間中や バスや電車の移動中 そして場合によると食事中なども勉強する。
それでも足りない時は 睡眠5時間とかになるかな。

コーヒー 音楽 エナジードリンク ハーブ 辛い食べ物 いろいろ使いながら。
最低必要な睡眠時間ってのは人によっても違うが 短期的なら4時間睡眠でも案外行けると思う。
ただ 何というか 考え方が狭くなるように思う。
ヒラメキが出ないのだな。

別に問題はないと思うのだ。
こういう経験も大切だし 焦りさえしなければ十分得るものはある。
脳にも緩急は必要だし 時にフルスロットルも良い・・が あまり長くやると痛む。

よほど深く眠らないと4時間で2週間以上続けるのは難しかった。
そして6時間程度寝ないと 自律神経系は慣れでなんとかなるみたいなんだが どうもホルモンバランスが悪くなる感じ。
そこは注意すべきかと。

Qいつもお世話になっております。以下のようなプログラムで現在時刻の表示を

いつもお世話になっております。以下のようなプログラムで現在時刻の表示をしているわけですが、

#include <stdio.h>
#include <time.h>

int main(void)
{
//日付
time_t tmp;
struct tm date;

time(&tmp);
date = *(localtime(&tmp));

printf("現在の時刻:%d-%d-%d %d:%d\n", date.tm_year + 1900 , date.tm_mon + 1 , date.tm_mday , date.tm_hour , date.tm_min);

return 0;
}

このプログラムで動いているので問題は無いのですが、
例えば月・日・時・分が1桁の場合に出力画面が「2010-5-20 14:7」となってしまいます。
個人的には「2010-05-20 14:07」とYYYY-MM-DD HH:MM←(この書き方であってるか不安…)
方式にしたいのですがどのようにすれば良いでしょうか?

いつもお世話になっております。以下のようなプログラムで現在時刻の表示をしているわけですが、

#include <stdio.h>
#include <time.h>

int main(void)
{
//日付
time_t tmp;
struct tm date;

time(&tmp);
date = *(localtime(&tmp));

printf("現在の時刻:%d-%d-%d %d:%d\n", date.tm_year + 1900 , date.tm_mon + 1 , date.tm_mday , date.tm_hour , date.tm_min);

return 0;
}

このプログラムで動いているので問題は無いのですが、
例えば月・日・時・分が1桁の場合に出力...続きを読む

Aベストアンサー

%d-%d-%d %d:%d

%4d-%02d-%02d %02d:%02d
とかにするとか。

Q固定された木材を削る道具は?

部屋のドアを、内開きから外開きに変える計画を立てています。上、左右のドア枠は内側と外側のサイズが同じなのですが、下側のドア枠は削る必要があります。ドアと枠は共に木製です。
そこで質問なのですが、ドア枠のように固定された木材を削る道具は、どういったものが最適でしょうか?
回答、よろしくお願いします。

Aベストアンサー

こんにちは。
どれくらい削るかにもよりますが。

ごくわずかであれば、電動〈仕上げ)サンダーっていう、電動紙やすりみたいな機械があります。
レンタルしてるかもしれないですね。

カンナを使うなら、角は(何種類かの目の粗さの)木工ヤスリを使って、仕上げは紙やすりで。

ところで、ドアの方を削るわけにはいかないんでしょうか?
大工さんが間違えてドア枠を作って取り付けてしまった時に、ドア下部を削ってましたよ。(^^;
問題がなければ、ドアを削った方が得策かと思いますが。

QC++を勉強し始めたばかりの初心者なのですが、クラスの継承に関して・・・

Visual C++ 2008で、新しいwindowsフォームアプリケーションを作成したら、Form1.hの上の方に

public ref class Form1 : public System::Windows::Forms::Form

という行がありました。これは開発環境に実装されている
System::Windows::Forms::Formクラスを継承し、Form1クラスを新たに作成しますという意味なのですよね?

このとき、2つ目のpublicは、継承の仕方、この場合結果的にはSystem::Windows::Forms::Formクラスに含まれるメンバの、private以外がそのまま受け継がれる、という事になりますよね?

それで、このref classというのは、ポインタみたいな意味でしょうか?refは書かないと別の継承方法になるのでしょうか?
また、最初のpublicはどういう意味なのでしょう?

もしかして、この2つについては、System::Windows::Forms::Formクラスを継承して新規フォームを作る場合の、定型みたいなものなのでしょうか?

Visual C++ 2008で、新しいwindowsフォームアプリケーションを作成したら、Form1.hの上の方に

public ref class Form1 : public System::Windows::Forms::Form

という行がありました。これは開発環境に実装されている
System::Windows::Forms::Formクラスを継承し、Form1クラスを新たに作成しますという意味なのですよね?

このとき、2つ目のpublicは、継承の仕方、この場合結果的にはSystem::Windows::Forms::Formクラスに含まれるメンバの、private以外がそのまま受け継がれる、という事になりますよ...続きを読む

Aベストアンサー

最初のpublicはこのプロジェクトにForm1クラスを公開するのに必要です
refは一般的なC++の構文にはありません
これは C++/CLIという特殊な環境で使う構文です
C++/CLIでは オブジェクトをポインタ扱いで使いますのでForm1クラスの実体をオブジェクトのを ^記号付で表します

Form1^ obj;
などといった宣言をします

一般的なC++のクラス宣言なら

public class Form1 : pulic System::Windows::Forms::Form
といった具合に記述します
Form1のオブジェクトを宣言する場合
Form1 obj, *pObj;
といった具合になります objは実体、pObjはポインタ といった具合です

Q歯を削る時痛かったを英語で?

教えて頂きたいのですが、歯医者さんで虫歯を削る時に痛かったと英語で言いたいのですが
I was pain when I shave bat tooh.
であってますか?
削るというのもshaveでいいのかわからないのですが、いい単語があれば教えて頂きたいです!

Aベストアンサー

こんにちは。4/11のご質問ではお礼のお返事を有難うございまして。

ご質問:
<I was pain when I shave bat tooh.であってますか?>

以下の点で訂正を要します。

1.I=painではないのでbe動詞はここでは不適です。

2.動詞はhadなどを使って、
I had a pain「痛みがあった」→「痛かった」
とするのが自然です。

3.shaveはどちらかというと「削ぎ落とす」「削ぐ」の意味に近くなります。歯医者でいう「削る」とは、「穴をあけること」ですから、ここはdrillが適切です。

4.I shave:「私が削る」のではないので、ここでは使役動詞haveなどを使って「削ってもらう」にします。
例:
I have my tooth drilled.
「私の歯を、削らせる」→「削ってもらう」

ここでdrilledと過去分詞になっているのは、目的語Oであるmy toothと、補語Cであるdrilledの関係が、受動の関係になるからです。
例:
my tooth is drilled「歯が、削られる」

5.虫歯はbad toothと綴りを正します。

6.以上を踏まえて原文に忠実な訂正例は
I had a pain when I had my tooth drilled by dentist.
「歯医者に歯を削ってもらった時、痛かった」
となります。

7.他にも以下のような表現もあります。
I felt some pain when I had my tooth drilled.
「歯医者に歯を削ってもらった時、少し痛かった」

以上ご参考までに。

こんにちは。4/11のご質問ではお礼のお返事を有難うございまして。

ご質問:
<I was pain when I shave bat tooh.であってますか?>

以下の点で訂正を要します。

1.I=painではないのでbe動詞はここでは不適です。

2.動詞はhadなどを使って、
I had a pain「痛みがあった」→「痛かった」
とするのが自然です。

3.shaveはどちらかというと「削ぎ落とす」「削ぐ」の意味に近くなります。歯医者でいう「削る」とは、「穴をあけること」ですから、ここはdrillが適切です。

4.I shave...続きを読む

Qいつもお世話になっております。

いつもお世話になっております。

VC++ 2008を使用してexeファイルの実行(デバッグ→デバッグなしで開始の順で)を行っているのですが、
上記の順で行うとプロンプトのデフォルトがSJISだと思うんですが、それをEUCに変える設定ってありますでしょうか?

Aベストアンサー

なんでEUCに変えたいのかは分からないのですが・・・

http://fine.ap.teacup.com/hepo/23.html

http://blog.kumacchi.com/2009/01/utf-8.html

コマンドプロンプトのリンク全て変えれば表示出来るような気はしますが。


人気Q&Aランキング

おすすめ情報