C言語で以下のプログラムを作らなくてはなりません。
どなたかご教授くださるようお願いいたします。
1 入力された値を階乗するプログラム
<表示>
値を入力してください。
答え:XXXXX
2 パスワード作成ツール
<使用方法>
./mypasswd [user ID][パスワード文字数]
<機能>
下記の条件にあった任意の文字列を標準出力に返す。
条件1 引数[user ID]は必須
条件2 指定できる出力文字列は6,7,8文字のいずれかとする(省略可、デフォルト8文字)
条件3 出力もじる津を構成する文字列範囲はa~z、A~Z、0~9とする。
条件4 ユーザーアカウントに含まれる文字列を含まない。
条件5 英大文字を最低1文字含む。
条件6 英小文字を最低1文字含む。
条件7 数字を1文字含む。
<設計>
下記の関数を組み合わせる。
関数1 引数チェック関数(条件1、2)
関数2 ヘルプを表示する関数(条件1、2、の説明文を表示する)
関数3 時刻を種にした乱数を用いて、任意の1文字を返す関数
関数4 ある1文字が使用可能文字列に含まれるものかどうかを判断する関数(条件3)
関数5 ある1文字が、userIDに含まれるものかどうかを判断する関数(条件4)
関数6 関数3~5を利用して、パスワ-ドに使用することが出来る文字列を返す関数
関数7 関数6を利用し、条件5~7が考慮された文字列を返す関数
3 入力された計算式を計算するプログラムを作成
<機能>
+-*/(括弧は使用しない)の組合せで小数も扱う。
敷の最大長は100文字までとする。
<表示>
計算式を入力してください。
答え:XXXXXXXXXX
No.6ベストアンサー
- 回答日時:
・・・では、続きいきます。
>関数3 時刻を種にした乱数を用いて、任意の1文字を返す関数
関数:char GetRandomChar(void)
仕様:略(上の文で十分)
実装:以下のURLの「プログラム例」を参考にしてください。rand()の戻り値はintなので%256を忘れないように。
http://www.microsoft.com/japan/developer/library …
>関数4 ある1文字が使用可能文字列に含まれるものかどうかを判断する関数(条件3)
関数、仕様、実装:略。isalnum()を使用する。
>関数5 ある1文字が、userIDに含まれるものかどうかを判断する関数(条件4)
条件4では文字列となっていますが?とりあえず、userIDとパスワードの間に共通する文字がない、という条件と解釈します。
関数、仕様、実装:略。strchr()の結果がNULLか否かで文字の重複を確認する。
>関数6 関数3~5を利用して、パスワ-ドに使用することが出来る文字列を返す関数
関数:void GetPassword(int nLength, char* pszUseID, char* pszPassword)
仕様:(未検査の)パスワードを作成し、pszPasswordに格納する
実装:(1)whileによるループ(継続条件はループカウント<nLength)。その中で関数3による文字の取得→関数4および5によるチェック(失格したならcontinue)→文字をpszPassword[(ループカウント)]に書き込む→ループカウント+1、を行う。
(2)出来上がったpszPasswordの最後に'\0'を付加して関数終了。
>関数7 関数6を利用し、条件5~7が考慮された文字列を返す関数
関数:void GetPasswordChecked(int nLength, char* pszUseID, char* pszPassword)
仕様:検査済みパスワードをpszPasswordに取得する
実装:(1)数字の存在フラグ、小文字の存在フラグ、大文字の存在フラグを用意する。
(2)無限ループの中で各文字種の存在フラグをオフ→関数6→isdigit(),islouwer(),isupper()による文字のチェックをpszPasswordに対して実行(条件に一致したら対応する文字種の存在フラグをセット)→すべての文字種の存在フラグがオンならbreakを繰り返す。
・・・とこんなところでしょうか。
ご丁寧に分かりやすくご回答いただき、ありがとうございます。関数は大変参考になります。私はどの関数を使おうかと、いろいろな関数の仕様を調べながら、ノートに書いておいたのですが、hiromura様の関数の方が、とってもすっきりしていてすばらしいですね。私のほうは1つの条件をクリアする為に何個かの関数を組み合わせてしまったりして、あとで自分で読み直してみても、とてもややこしいく、読みづらいのです。プロの方が書くプログラムほど参考になるものはありませんね。ご回答いただいた関数を自分でもよく調べてみます。とても難しいですね。でも経験者の方にアドバイスしていただいたり、自分で調べたりして、問題が解決できれば最高にうれしいことですね。私も早く、このようなすばらしいプログラムが書けるようにがんばります。これからも何かありましたら、ご指導ください。よろしくお願い致します。
No.9
- 回答日時:
>ちなみにこのようなプログラムはhitomura様のようなプロ(?)の方からみると、いかほどのレベルなのでしょうか?
>入門レベル、初心者レベル、中級者レベル、上級者レベルのどのあたりのレベルでしょうか?
>また、hitomura様はこのようなプログラムを大体どのくらいの時間で、ソースを書くことが出来ますでしょうか?
回答を名指しで指定されるのはありがたいのですが、私だけに尋ねるよりも、ほかの方々の意見もきいたほうがいいのではないでしょうか。
当初の質問とは関係のないことでもありますので、回答はいたしません。
新たに質問を作成されたなら、私見を述べさせていただきます。
ただし、「プログラムを作る」といっても、どの時点から開始するかということによって話が変わってきます。
「パスワード作成ツールを作る」と決めた時か、機能が決定した時か、関数の設計が確定した時かをはっきりしてください。
No.8
- 回答日時:
ちょっと補足です。
>ご回答いただいた関数を自分でもよく調べてみます。(No.6のお礼より)
勘違いされるといけないので一言。関数4と関数5以外は自分で作成します。実装に書いたロジックで関数を記述していくわけです。
>関数5と条件4はユーザーIDに含まれている文字を含まないということです。(No.6のお礼より)
つまり、自分の書いた方法で合っていたわけですが、ひとつ質問です。
「"0123456789"というユーザーIDの人のパスワードはどうします?」
条件4によって数字はパスワードに使えなくなりますが、条件7によってパスワードには数字が最低1文字含まれなくてはなりません。
それと、乱数によって出力された文字が使用可能文字か&userIDに含まれていないか調べるよりも、最初からそういう条件で文字を乱数出力するほうがいいような気がします。
こちらは、グローバル領域に0-9,a-z,A-Zを並べた文字配列(文字列ではありません)を作成し、userIDに使用されている文字を配列の中から消去、その文字配列に残った文字の中からランダムに文字を選ぶ、という仕様にすればうまくいくと思います。
hiromura様、ご丁寧に補足してくださり、ありがとうございます。
>「"0123456789"というユーザーIDの人のパスワードはどうします?」
条件4によって数字はパスワードに使えなくなりますが、条件7によってパスワードには数字が最低1文字含まれなくてはなりません。
そうですね。ではユーザーIDの文字だけを含めてはいけないということで
数字は含めてもいいということでは難しいでしょうか?
>それと、乱数によって出力された文字が使用可能文字か&userIDに含まれていないか調べるよりも、最初からそういう条件で文字を乱数出力するほうがいいような気がします。
>こちらは、グローバル領域に0-9,a-z,A-Zを並べた文字配列(文字列ではありません)を作成し、userIDに使用されている文字を配列の中から消去、その文字配列に残った文字の中からランダムに文字を選ぶ、という仕様にすればうまくいくと思います。
なるほど~。この方がずっとすっきりしてわかりやすいですね。とても合理 的だと思います。もう一度プログラム全体の設計を再検討してみます。
ご指摘&アドバイスを頂き本当にありがとうございます。
ちなみにこのようなプログラムはhitomura様のようなプロ(?)の方からみると、いかほどのレベルなのでしょうか?入門レベル、初心者レベル、中級者レベル、上級者レベルのどのあたりのレベルでしょうか?また、hitomura様はこのようなプログラムを大体どのくらいの時間で、ソースを書くことが出来ますでしょうか?
お時間があるときにでも、御返事いただければ、大変嬉しく思います。
No.7
- 回答日時:
…っと、ひとつだけ書き忘れていたことがあります。
それは、「プログラミングは、自分でプログラムを書いて上達する」ということです。
ヒント(と呼ぶには少々多すぎた気もしますが)は出しましたので、あとは頑張ってください。
このアドバイスを肝に銘じます。
自分で考えて、悩みに悩みぬいた上で経験あるかたにご質問しなければなりませんね。今度ご質問するときは自分でここまで書いてみた!!けれどもここがわからないというふうにソースをきちんと書いてご質問させていただきます。
本当にありがとうございました。
No.5
- 回答日時:
> パスワード作成ツール
分からないのは何処でしょうか?
関数6ですか?全てですか?
問題を絞り込んで書かれた方がよいと思います。
後、関数5の仕様と、条件4が異なっていますが、どちらが正しいのでしょうか?>1文字と文字列
この部分が解けているのなら良いのですが
関数3ならrandとsrandとtimeを調べてみてください。
他は漠然としすぎていて、答えに困ります。
>入力された計算式を計算するプログラムを作成
演算子順位文法で検索してみてください。
小数無しのは昔書いたことがあるので、参考になるかも知れません
http://www.susono.com/~sohei/work/cpp/chap01.html
ご回答ありがとうございました。お礼が遅くなりまして申し訳ありません。
関数5と条件4はユーザーIDに含まれている文字を含まないということです。私自身がこのプログラムを作成するまで、実力が追いついていなくて、それぞれの条件を満たす関数はどれか考えながら、関数の使い方を勉強している段階です。
条件が多いので、それぞれの関数をどう組み合わせていけばいいのか、どのように設計していけばいいのか、混乱してしまっております。
計算式を計算するプログラムはリンク先を参考にさせていただきます。
現段階の私の力では難しいかもしれませんが、これを乗り越えなくてはいけませんね。これからも何かありましたら、よろしくお願い致します。
No.4
- 回答日時:
>質問させていただいた2のパスワードを作成する
>プログラムは難しいでしょうか?
ではやってみましょうか(…ってissy-toさんではないのに。なんてでしゃばりなんだ>私)。
でも、これだけ仕様が確定しているなら簡単なので、ポイントだけ書くことにします。
>関数1 引数チェック関数(条件1、2)
関数:int CheckArgments(int nArgv, char** pszArgv)
仕様:main()の引数をそのまま受けとり、引数が条件1、2を満たしているなら1、いずれかが満たされていなければ0を返す。
実装:(1)nArgvの値をチェック
(2)pszArgv[2]の文字列長およびatoi()の結果をチェック
>関数2 ヘルプを表示する関数(条件1、2、の説明文を表示する)
関数:void ShowUsage(void)
仕様:プログラムの使用法を表示する。
実装:printf()文を並べるだけなので省略。
付記:プログラム名の表示を行うならば、ソースにその名称を書くよりも、argv[0]の文字列を使用したほうが良い。その場合は当関数の引数はchar* pszProgramNameとなる。
…すいません、ちょっと都合によりいったん書き込みを終了します。
No.1
- 回答日時:
こんなプログラムはどうでしょうか?
#include <stdio.h>
#include <stdlib.h>
int Factorial(x);
int main()
{
long i;
printf("******************************\n");
printf("* 階乗を計算するプログラム *\n");
printf("******************************\n\n");
printf("数値を入力してください--->");
scanf("%ld",&i);
printf("\n%ld!=%ld\n",i, Factorial(i));
exit(0);
}
int Factorial(x)
{
if(x == 0) return(1);
else return( Factorial(x-1)*x);
}
実行結果
******************************
* 階乗を計算するプログラム *
******************************
数値を入力してください--->0
0!=1
******************************
* 階乗を計算するプログラム *
******************************
数値を入力してください--->0
5!=120
さっそくのご回答ありがとうございました。
試してみます。Factorial関数大変参考になりました。
ちなみに、質問させていただいた2のパスワードを作成する
プログラムは難しいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- オープンソース ChatGPTをスプレッドシートと連携して自動でリサーチしたいんですがうまく出来ません。。。 1 2023/05/05 15:59
- Excel(エクセル) 【画像あり】A1が●+B1と同じ文字がB列にある+C1と同じ文字がC列にある場合D1に〇を付ける 3 2023/03/09 18:18
- Excel(エクセル) エクセルで文字列と数字が混在する列に書式設定したい。 3 2022/12/19 09:11
- 大学・短大 大学での論文の文字数に関しての質問です。 大学側で指示した条件は「12,000字以上書くこと」ですが 1 2023/01/11 00:31
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Excel(エクセル) エクセルの関数で質問です。 3 2023/02/24 14:07
- Excel(エクセル) エクセルのマイナス表示 3 2022/03/28 16:35
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
単語検索プログラム
-
C++でランレングス符号化のプロ...
-
sscanfとscanfの違いがよくわか...
-
putsとputcharの違い?
-
Cで「大文字、小文字の判定」は...
-
fgetsとsscanfを使って一行から...
-
CStringのFindで文字列検索を行...
-
信頼区間の1.96や1.65ってどこ...
-
プログラミング初心者です。 Py...
-
2÷3などの余りについて
-
「Aに対するBの割合」と「Aに対...
-
ラップ関数とはどんなものですか?
-
複数桁10進数の*桁目だけを抽出...
-
UWSCにてある一定の動作を無限...
-
2の補数を計算するプログラム
-
(int *)の意味
-
#define _CRT_SECURE_NO_WARNIN...
-
変数とパラメータとは違うもの...
-
コンソールアプリケーションの...
-
scanfが2回使えない・・・?;
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
charと%c , %s の関係について
-
strstrを利用しない文字列検索...
-
反転した数値を表示させるやり方
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
fgetsで拾われる改行文字を削除...
-
小文字のみを数える方法
-
ある文字列で2回目3回目に出現...
-
CStringについて
-
Cで「大文字、小文字の判定」は...
-
単語数のカウントについて
-
ブランクのチェック
-
文の意味
-
C言語で16進数文字列から16進数...
-
文字の入れ替えについて
-
1行の文字列を時間差で表示する...
おすすめ情報