计导大作业——笔记 & 作业

2019-04-09

2019-04-09  本文已影响2人  cjs2019

//先随手写一个吧,请喷

整体自评:

函数封装还说得过去,但是没有做到真正的“高内聚低耦合”;
如果是团队合作的话,可能还不够安全……
总之就是“还有很大的提升空间”……

coding效率……

T1: <1h
T2: 1h 左右
T3:昨天晚上 2h,今天4h……
(但是……仍然……可能……有bug……😂😂😂
总之就是“还有很大的提升空间”……

T1

// 也没有几行代码,就不封装成函数了
// 挺简单的,就不写详细的注释了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <unistd.h>

void print(long long cnt_A_Z,long long cnt_a_z,long long cnt0_9,long long cnt_others,long long cnt_line,long long cnt_len_max,long long cnt_len_min,long long* cnt){
    printf("The result is:\nTask1:\ncapital:%lld\n",cnt_A_Z);
    printf("lowercase:%lld\n",cnt_a_z);
    printf("digit:%lld\n",cnt0_9);
    printf("others:%lld\n",cnt_others);
    printf("\n");
    printf("Task2:\nline:%lld\n",cnt_line);
    printf("%lld characters in max line.\n",cnt_len_max);
    printf("%lld characters in min lien.\n",cnt_len_min);
    printf("\n");
    printf("Task3:\n");
    printf("CAPITAL:");
    for (int i = 'A'; i <= 'Z'; ++i) {
        char tem_ch=(char)i;
        if ((i-'A')%4==0){
            printf("\n%c:%lld",tem_ch,cnt[i]);
        }
        else{
            printf("\tc:%lld",tem_ch,cnt[i]);
        }
    }
    printf("\nLOWERCASE:");
    for (int i = 'a'; i <= 'z'; ++i) {
        char tem_ch=(char)i;
        if ((i-'a')%4==0){
            printf("\n%c:%lld",tem_ch,cnt[i]);
        }
        else{
            printf("\t%c:%lld",tem_ch,cnt[i]);
        }
    }
}

int main(){
    long long cnt_A_Z,cnt_a_z,cnt0_9,cnt_others,cnt[1025];
    memset(cnt,0, sizeof(cnt));
    long long cnt_line,cnt_len_max,cnt_len_min,len_of_current_line=0;
    cnt_A_Z=cnt_a_z=cnt0_9=cnt_others=cnt_line=cnt_len_max=cnt_len_min=0;
    FILE *fptr=NULL;
    char filename[200];
    scanf("%s",filename);
    fptr=fopen(filename,"r");
    char ch;
    while ((ch=fgetc(fptr))!=EOF){
        if (ch!='\n'){
            cnt[ch]++;
            len_of_current_line++;
            if (ch>='A' && ch<='Z'){
                cnt_A_Z++;
            }
            else if (ch>='a' && ch<='z'){
                cnt_a_z++;
            }
            else if (ch>='0' && ch<='9'){
                cnt0_9++;
            }
            else{
                cnt_others++;
            }
        }
        else{
            cnt_line++;
            if (len_of_current_line<cnt_len_min){
                cnt_len_min=len_of_current_line;
            }
            else if (len_of_current_line>cnt_len_max){
                cnt_len_max=len_of_current_line;
            }
            len_of_current_line=0;
        }
    }
    print(cnt_A_Z,cnt_a_z,cnt0_9,cnt_others,cnt_line,cnt_len_max,cnt_len_min,cnt);

    fclose(fptr);

    return 0;
}

T2

// 直接处理高级要求:要能处理printf中的//或者/**/
// 基本要求:假设//或者/**/不会出现在printf语句中。
// 二者的唯一区别就是对printf的识别;
// 有限状态自动机……
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <unistd.h>

FILE** initialize_and_open_files(void){
    char file_in_name[200],file_out_name[200];
    scanf("%s",file_in_name);
    getchar();
    scanf("%s",file_out_name);
    FILE **fptr=NULL;
    fptr=(FILE**)malloc(sizeof(FILE*)*2);
    fptr[0]=fopen(file_in_name,"r");
    fptr[1]=fopen(file_out_name,"w");
    rewind(fptr[0]);
    return fptr;
}
int print_flag_func(int print_flag,char ch){
    //printf检测;
    char printf_string[20]={"printf(\""};
    if (ch==printf_string[0]&&print_flag==0){
        print_flag=1;
    }
    else if (ch==printf_string[print_flag]&&print_flag<=5){
        print_flag++;
    }
    else if (print_flag==6){
        print_flag=6;
    }
    else {
        print_flag=0;
    }
    return print_flag;
}

int main(){
    FILE **fptr=NULL;
    fptr=initialize_and_open_files();
    if (fptr==NULL){
        printf("Initialization and files opening Error!\n");
    }
    else{
        char ch=fgetc(fptr[0]);
        int flag=0,print_flag=0,special_flag=0;
        while (!feof(fptr[0])){
            print_flag=print_flag_func(print_flag,ch);
            if (print_flag>=1){
                //如果 print_flag>=1,说明当前扫描位置在printf中
                fputc(ch,fptr[1]);
                ch=fgetc(fptr[0]);
                continue;
            }

            if (flag==0){ //非注释状态
                if (ch=='/'){
                    flag=1; //"扫到"第一个'/',"准备"进入注释状态;
                }
                else{
                    fputc(ch,fptr[1]);
                }
            }
            else if (flag==1){
                if (ch=='/'){
                    flag=2; //"//"型注释,跳过一行;
                }
                else if(ch=='*'){
                    flag=3; //"/*"型注释,跳过之后所有,直到遇到一个"*/";
                }
                else{
                    flag=0;
                    fputc(ch,fptr[1]);
                }
            }
            else if (flag==2){
                if (ch=='\n'){
                    //遇到了换行符,由于是单行注释,只需要删除注释,但是不能"顺便"删除哪一行的换行符,否则本行和下一行将会连在一起
                    fputc(ch,fptr[1]);
                    flag=0;//更新状态,回到q0状态;
                }
            }
            else if (flag==3){
                if (special_flag==0){
                    if (ch=='*'){
                        special_flag=1;//准备结束;
                    }
                }
                else if (special_flag==1){
                    if (ch=='/'){
                        special_flag=0;//宏观上,结束注释状态;
                        flag=0;
                    }
                }
            }
            ch=fgetc(fptr[0]);
        }
    }

    fclose(fptr[0]);
    fclose(fptr[1]);

    return 0;
}

T3

// 由于本题题干已经给出了解题的思路和注意事项,
// 所以解法实际上是一目了然的,
// 这里就不给出详细的注释了,
// 希望代码可读性说的过去;
// Because the method and the detailed steps to solve this problem have been given,
// I will not give detailed notes.
// I hope that my code is readable,
// as I have solved this problem to the best of my ability.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define Required_PATH "commodity.dat"
char filename[200];

struct record{
    int id=-1;
    char name[40]="";
    int num=-1;
    double price=-1;
};

void print_initialization_information(void);
void error_print(int error_type);
void func1_create_blank_file(FILE* fptr);
void func2_input_record(FILE *fptr);
void func3_update(FILE *fptr);
void func4_delete_record(FILE *fptr);
void func5(FILE *fptr);
void func6(void);
void func7_output_all_the_records(FILE *fptr);
int func8_count_records(FILE *fptr,int *loc);
void function_choose(FILE *fptr,int flag);

int main(){
    int flag=0;
    printf("Because of the unknown difference of the path search among Mac OS X, Windows and Ubuntu,\n"
           "Please input the path of the project\n");
    scanf("%s",filename);//filename==the path of the project;
    strcat(filename,Required_PATH);
    while (flag!=6){
        print_initialization_information();
        FILE *fptr = NULL;
        scanf("%d",&flag);
        function_choose(fptr,flag);
    }

    return 0;
}

void print_initialization_information(void){
    printf("请输入您的选择:\n"
           "1--创建一个100条空记录的文件\n"
           "2--输入商品记录\n"
           "3--更新商品记录\n"
           "4--删除商品记录\n"
           "5--输出全部商品记录\n"
           "6--退出程序\n");
}
void error_print(int error_type){ //错误信息打印;
    if (error_type==1){
        printf("The file can't be opened!\n");
    }
    else if (error_type==2){

    }
}
void func1_create_blank_file(FILE* fptr){
    fptr=fopen(filename,"wb");
    if (fptr==NULL){
        error_print(1);
    }
    else{
        struct record blank_record;
        for (int i = 0; i < 100; ++i) {
            blank_record.id=i;
            fwrite(&blank_record, sizeof(record),1,fptr);
        }
    }
    printf("100条空记录创建完毕\n");
    fclose(fptr);
}
void func2_input_record(FILE *fptr){
    record tem_record;
    fptr=fopen(filename,"rb+");
    if (fptr==NULL){
        error_print(1);
    }
    else{
        printf("请输入商品信息[ID为-1代表输入结束]:\n商品ID:");
        scanf("%d",&tem_record.id);
        while (tem_record.id!=-1){
            fseek(fptr,sizeof(record)*tem_record.id,SEEK_SET);
            printf("商品名:");
            scanf("%s",tem_record.name);
            printf("数量:");
            scanf("%d",&tem_record.num);
            printf("价格:");
            scanf("%lf",&tem_record.price);
            fwrite(&tem_record, sizeof(record),1,fptr);
            printf("请输入商品信息[ID为-1代表输入结束]:\n商品ID:");
            scanf("%d",&tem_record.id);
        }
    }
    printf("商品信息输入结束\n");
    fclose(fptr);
    func7_output_all_the_records(fptr);
}
void func3_update(FILE *fptr){
    printf("请输入待更新商品ID[ID为-1代表结束更新]:\n");
    struct record tem_record;
    scanf("%d",&tem_record.id);

    fptr=fopen(filename,"rb+");
    if (fptr==NULL){
        error_print(1);
    }
    else {
        while (tem_record.id != -1) {
            fseek(fptr, sizeof(record) * tem_record.id, SEEK_SET);
            fread(&tem_record, sizeof(record), 1, fptr);
            if (fabs(tem_record.price + 1.000000) < 1e-5) {
                printf("对不起,记录号为%d的商品不存在,无法更新\n",tem_record.id);
            }
            else {
                printf("原商品信息如下:\n");
                printf("记录号(商品ID)    商品名          数量    价格\n");
                printf("%d%35s%10d%15lf\n", tem_record.id, tem_record.name, tem_record.num,tem_record.price);
                printf("商品名:");
                scanf("%s", tem_record.name);
                printf("数量:");
                scanf("%d", &tem_record.num);
                printf("价格:");
                scanf("%lf", &tem_record.price);
                printf("更新后商品信息如下:\n");
                printf("记录号(商品ID)    商品名          数量    价格\n");
                printf("%d%35s%10d%15lf\n", tem_record.id, tem_record.name, tem_record.num,tem_record.price);
                fseek(fptr, sizeof(record) * tem_record.id, SEEK_SET);
                fwrite(&tem_record, sizeof(record), 1, fptr);
            }
            printf("请输入待更新商品ID[记录号为-1代表结束更新]:\n");
            scanf("%d", &tem_record.id);
        }
    }
    printf("更新工作结束");
    fclose(fptr);
}
void func4_delete_record(FILE *fptr){
    printf("请输入待删除商品ID[记录号为-1代表结束删除]:\n");
    fptr=fopen(filename,"rb+");
    if (fptr==NULL){
        error_print(1);
    }
    else{
        struct record tem_record;
        scanf("%d",&tem_record.id);
        while (tem_record.id!=-1){
            fseek(fptr, sizeof(record)*tem_record.id, SEEK_SET);
            fread(&tem_record, sizeof(record),1,fptr);
            if (tem_record.num==-1){
                printf("对不起,记录号为%d的商品不存在,无法进行删除操作\n",tem_record.id);
            }
            else{
                printf("该商品信息如下:");
                printf("记录号(商品ID)    商品名          数量    价格\n");
                printf("%d%35s%10d%15lf\n", tem_record.id, tem_record.name, tem_record.num,tem_record.price);
                printf("是否确实删除(确认按Y,取消按N)?\n");
                char confirm_flag='N';
                getchar();
                scanf("%c",&confirm_flag);
                if (confirm_flag=='Y'){
                    strcpy(tem_record.name,"\0");
                    tem_record.num=-1;
                    tem_record.price=-1;
                    fseek(fptr, sizeof(record)*tem_record.id, SEEK_SET);
                    fwrite(&tem_record, sizeof(record), 1, fptr);
                    printf("记录号为%d的商品成功删除\n",tem_record.id);
                }
                else{
                    printf("您选择不删除记录号为%d的商品\n",tem_record.id);
                }
                func7_output_all_the_records(fptr);
            }
            printf("请输入待删除商品ID[记录号为-1代表结束删除]:\n");
            scanf("%d",&tem_record.id);
        }
    }
    printf("删除工作结束");
}
void func5(FILE *fptr){
    func7_output_all_the_records(fptr);
}
void func6(void){
    printf("程序运行结束,再见!\n");
}
void func7_output_all_the_records(FILE *fptr){
    int loc[100]={-1},cnt=0;
    if (fptr!=NULL) {
        fclose(fptr);
    }
    cnt=func8_count_records(fptr,loc);
    fptr=fopen(filename,"rb");
    if (fptr==NULL){
        error_print(1);
    }
    else{
        struct record tem_record;
        printf("商品信息如下:\n"
               "记录号(商品ID)    商品名        数量  价格\n");
        for (int i = 0; i <= cnt-1; ++i) {
            fseek(fptr, sizeof(record)*loc[i], SEEK_SET);
            fread(&tem_record, sizeof(record),1,fptr);
            printf("%d%35s%10d%15lf\n",tem_record.id,tem_record.name,tem_record.num,tem_record.price);
        }
        fclose(fptr);
    }
}
int func8_count_records(FILE *fptr,int *loc){
    int cnt=0;
    fptr=fopen(filename,"rb");
    if (fptr==NULL){
        error_print(1);
    }
    else{
        struct record tem_record;
        for (int i = 0; i < 100; ++i) {
            fseek(fptr, sizeof(record)*i,SEEK_SET);
            fread(&tem_record, sizeof(record),1,fptr);
            if (fabs(tem_record.price+1.0000)<1e-5){
                continue;
            }
            else{
                loc[cnt]=i;
                cnt++;
            }
        }
        fclose(fptr);
    }
    return cnt;
}
void function_choose(FILE *fptr,int flag){
    switch (flag){
        case 1: {
            func1_create_blank_file(fptr);
        }
            break;
        case 2:{
            func2_input_record(fptr);
        }
            break;
        case 3:{
            func3_update(fptr);
        }
            break;
        case 4:{
            func4_delete_record(fptr);
        }
            break;
        case 5:{
            func5(fptr);
        }
            break;
        case 6:{
            func6();
        }
            break;
        default:
            break;
    }
}
上一篇下一篇

猜你喜欢

热点阅读