<HOME> <ダウンロード>

家計簿 (Visual Studio 2005 C++ CLRコンソールアプリケーション)

2010/1/17

ただいま研究中 コードに虫いっぱいです。

  • はじめに

 プログラムのコードがなくこのメッセージがでているだけで直す方法をここ数年考えていると、ひとつの結論がでできました。

 と書けば、かっこ良いのですが、やっぱコードがないと分からないですよね。

 しかも、このことを正確に他人に伝えて理解してもらうのは中々難しいです。仮に1分としたら・・。

 さらに、このことを電話で伝言ゲームをするとしたら、とてつもない労力となりそうな感じがいたしませんか?

 作った本人でもコードがなく2、3日もしたら、どこが不味いんだろうと頭を抱えるのは、私だけでしょうか?

  2chに書いたら、そもそもこんな設計なんてしないよ!という声もあがりそうですね。というか、ぼろかすにコメントつけられそうな感じがするのは、私だけでしょうか? ちゃんと検証やテストしているのとか・・。

 ということで、イライラせずに生きていけるかを検証する研究をすることに致しました。

 

 

  • 準備

1.WindowsのFTPサーバーを利用するときは、IISのアクセス許可の設定を確認しておきます。

2.フロッピーディスクを準備しておきます。

3.下記コードをコンパイルします。

 

 

 

  • コード

// kawa2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
// Visual Studio 2005 C++ CLRコンソールアプリケーション
#include "stdafx.h"
 
#include "io.h"
#include "sys/stat.h"
#include "sys/types.h"
 
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "conio.h"
#include "time.h"
 
#define FILENAME "data1.txt"
#define TEMPNAME "data1.tmp"
#define MAXSIZE 266
 
 
struct rec{
    char name[MAXSIZE];
    int numer;
    int price;
};
 
 
int inp(){
    char outpf[MAXSIZE];
    char delpf[MAXSIZE];
    char inp[MAXSIZE];
    char com[MAXSIZE]="del ";
    rec REC;
    int c;
    system("CLS");
 
    //今日のの日付を得る。
    time_t t=time(NULL);
    struct tm *lt=localtime(&t);
    sprintf(outpf,"a:\\%04d%02d%02d.txt",
        1900+lt->tm_year,
        1+lt->tm_mon,
        lt->tm_mday);
 
    FILE *fo=fopen(outpf,"w");
    /*
    おそるべし読み取り専用
    w、a、w+でファイル勝手に作成するのは
    if(fo==NULL){
        printf("おかしい・・・\n");
        return 0;
    }
    */
    while(1){
        printf("****** 家計簿 *************************\n");
        printf("商品名を入力してください。\n");
        printf(" 終了の時は「終わり」と入力\n");
        scanf("%s",REC.name);
        if(strcmp(REC.name,"終わり")==0){
            c=fclose(fo);
            /*
            テキストファイルを開いて改ざんした時の対策。
            例えばすべてのデーターを足してなんか処理して
            最後に追加。
            とりあえず。読み取り専用に・・・。
            */
            chmod(outpf,S_IREAD);
            return 0;
        }
        printf("数量を入力してください。\n");
        scanf("%d",&REC.numer);
        printf("単価を入力してください。\n");
        scanf("%d",&REC.price);
        c=fprintf(fo,"%s,%d,%d\n",
            REC.name,
            REC.numer,
            REC.price);
        c=fclose(fo);
    }
    return 0;
}
 
 
int owari(){
    char outpf[MAXSIZE];
    char delpf[MAXSIZE];
    char ftpco[MAXSIZE]="echo put ";
    char com[MAXSIZE]="del ";
 
    system("CLS");
 
    //3日前の日付を得る。
    printf("3日前のデーターを削除中\n");
    time_t t=time(NULL);
    t=t-86400*3;
    struct tm *lt=localtime(&t);
    sprintf(delpf,"a:\\%04d%02d%02d.txt",
        1900+lt->tm_year,
        1+lt->tm_mon,
        lt->tm_mday);
    //remove(delpf);
    strcat(com,delpf);  
    system(com);
 
    //今日のの日付を得る。
    t=time(NULL);
    lt=localtime(&t);
    sprintf(outpf,"a:\\%04d%02d%02d.txt",
        1900+lt->tm_year,
        1+lt->tm_mon,
        lt->tm_mday);
 
    /*
    テキストファイルを開いて改ざんした時の対策。
    例えばすべてのデーターを足してなんか処理して
    最後に追加。
    とりあえず。読み取り専用に・・・。
    */
    printf("・・・・\n");
    chmod(outpf,S_IREAD);
 
    strcat(ftpco,outpf);
    strcat(ftpco,">> ftpbat.txt");
 
    /*
    ユーザーとパスワード大切
  ところでログインする時のパスワードは実行ファイルに書いておくのは良いのだろうか?
  セキュリティ上隠せるかも知れないが・・・。保守性を考えたら・・・。
    削除はdelete
    */
    system("echo open 127.0.0.1 > ftpbat.txt");
    system("echo test>> ftpbat.txt");
    system("echo test>> ftpbat.txt");
    system(ftpco);
    system("echo quit>> ftpbat.txt");
    system("ftp -s:ftpbat.txt");
 

    if(lt->tm_hour<9 || lt->tm_hour>20){
        //printf("shutdown\n");
        printf("続行するには何かキーを押してください。\n");
        getch();        
        system("shutdown /f /s");
        return 0;
    }else{
        return 0;
    }
 
}
 
 
int menu(){
    int c=0;
    printf("*****家計簿*************************\n");
    printf(" 1.レシートの入力\n");
    printf(" 9.1日の終わりの処理\n");
    printf("99.おわり\n");
    scanf("%d",&c);
    switch(c)
    {
        case 1:
            inp();
            break;
        case 9:
            owari();
            break;
        case 99:
            return 0;
            break;
        default:
            break;      
    }
    system("CLS");
    menu();
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    menu();
    return 0;
}

●セットアップと実行