程序设计分组训练

实验二代码报告

题目:
程序自动生成.txt文件,内部存放生成的数据,其中第一行存储数据的条数n,从第二行开始存储随机生成的三元组数据,共n条。条数参数n和文件名称参数FileName通过cmd中的命令行参数传入,两参数顺序不定,缺少参数时,条数n随机生成,文件名可以指定。

/****************************************************
作者信息:
    姓名:
版权声明:
    版权
模块名称:
    数据文件自动生成模块
摘要:
   实验2
其它说明:
    本模块实现数据文件自动生成功能
模块历史:
**********************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
#include <windows.h>
#define random(x) (rand()%x)


int **a;
int n = 0;
char *FileName = NULL;


void get_n_and_FileName(int argc, char *argv[]);
int get_n(char *argv[], int j);
void norm_FileName();
void printf_Info(int argc, char *argv[]);
void make_Array();
void write_File();
void free_Zoom();
/*
*函数名称:main
*函数功能:实现数据文件自动生成
*输入参数:命令行参数(条数、文件名)
*返回值:无
*版本信息:
*/
int main(int argc, char *argv[])
{
    printf_Info(argc, argv);


    get_n_and_FileName(argc, argv);


    norm_FileName();


    printf_Info(argc, argv);


    make_Array();


    write_File();


    free_Zoom();


    return 0;
}


/*
*函数名称:get_n_and_FileName
*函数功能:得到n的值和文件名
*输入参数:argc, argv
*返回值:
*版本信息:
*/
void get_n_and_FileName(int argc, char *argv[])
{
    //判断命令行参数的用户指令输入情况
    if (argc == 1)                              //用户只输入了一个命令行参数字符串
    {
        srand((int)time(0));
        n = random(100);                         //未输入条数参数,随机生成
        FileName = "test.txt";                  //未输入文件名,指定其为test
        printf("条数参数未输入,已随机生成:%d\n",n);
    }
    else if (argc == 2)                         //用户输入了两个命令行参数字符串
    {
        if (*argv[1] >= '0' && *argv[1] <= '9') //判断第二个命令行参数字符串首位是否为数字字符
        {
            int j = 1;
            n = get_n(argv, j);              //调用函数计算n的值并返回
            FileName = "test.txt";              //未输入文件名,指定其为"test.txt"
        }
        else                                   //第二个命令行参数字符串首位不为数字字符
        {
            FileName = argv[1];                //令第二个命令行参数字符串为文件名
            srand((int)time(0));
            n = random(100);                   //未输入条数参数,随机生成
            printf("条数参数未输入,已随机生成:%d\n",n);
        }
    }
    else if (argc >= 3)                         //用户输入了三个及以上命令行参数字符串
    {
        if (*argv[1] >= '0' && *argv[1] <= '9')//判断第二个命令行参数字符串首位是否为数字字符
        {
            int j = 1;
            n = get_n(argv, j);
            FileName = argv[2];                //令第三个命令行参数字符串为文件名
        }


        else if    (*argv[2] >= '0' && *argv[2] <= '9') //判断第三个命令行参数字符串首位是否为数字字符
        {
            int j = 2;
            n = get_n(argv, j);
            FileName = argv[1];                //令第二个命令行参数字符串为文件名
        }
        else                                   //第二、三个命令行参数字符串首位均不为数字字符
        {
            FileName = argv[1];                //令第二个命令行参数字符串为文件名
            srand((int)time(0));
            n = random(100);                   //条数参数未输入,随机生成
            printf("条数参数未输入,已随机生成:%d\n",n);
        }
    }
}


/*
*函数名称:get_n
*函数功能:计算n的值
*输入参数:argv, j
*返回值:n
*版本信息:
*/
int get_n(char *argv[], int j)
{
    int len = strlen(argv[j]);                 //获取第j+1个命令行参数字符串的长度
    int k = 0;
    for (int i = 0; i < len; i++)
    {
        while (argv[j][i] >= '0' && argv[j][i] <= '9') //依次获取数字字符串的数值
        {
            k = n;
            n = n * 10 + (argv[j][i] - '0');   //位乘相加,恢复数字字符串的int数值
            if (n >= 100)
            {
                n = k;
                i = len;
                printf("条数参数过大,已取有效前两位:%d\n",n);
            }
            else i++;
        }
    }
    if (n == 0)
    {
        srand((int)time(0));
        n = random(100);                       //随机生成条数参数n
        printf("条数参数不规范,已随机生成:%d\n",n);
    }
    return n;
}


/*
*函数名称:norm_FileName
*函数功能:规范文件名格式
*输入参数:无
*返回值:无
*版本信息:
*/
void norm_FileName()
{
    char *Name = ".txt";
    int len = strlen(FileName);       //取文件名字符串长度
    if (len < 4)                     //文件名字符串长度小于等于4,则认为其无格式后缀
    {
        strcat(FileName, Name);       //给文件名字符串添加“.txt”格式后缀
    }
    else
    {
        int flag = strcmp(FileName + (len - 4),".txt");
                                        //判断文件名字符串中有无“.txt”格式后缀
        if (flag != 0)
        {
        strcat(FileName, Name);       //给文件名字符串添加“.txt”格式后缀
        }
    }
}


/*
*函数名称:printf_Info
*函数功能:打印数据信息
*输入参数:argc, argv
*返回值:无
*版本信息:
*/
void printf_Info(int argc, char *argv[])
{
    if (n == 0)
    {
        for(int i = 0; i < argc; i++)     //遍历argv数组,数组里有argc个元素
        {
            printf("%s\n", argv[i]);      //打印数组中每个字符串指向的字符串
        }
    }
    else
    {
        printf("n的值为:%d\n",n);        //打印条数参数
        printf("文件名为:%s\n",FileName);//打印文件名
    }
}


/*
*函数名称:make_Array
*函数功能:随机函数创建数据记录
*输入参数:无
*返回值:无
*版本信息:
*/
void make_Array()
{
    while (n == 0)
    {
        Sleep (1000);                           //延时1秒以产生不同的种子
        srand((int)time(0));                    //设置随机数种子
        n = random(100);
        printf("条数参数不规范,已随机生成:%d\n",n);
    }


    a = (int**)malloc(sizeof(int*) * n);       //申请n行动态内存分配空间
    for (int i = 0; i < n; i++)
    {
        a[i] = (int *)malloc(sizeof(int) * 3);       //申请3列动态内存分配空间
    }


    Sleep (1000);                              //延时1秒以产生不同的种子
    srand((int)time(0));                       //设置随机数种子
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            a[i][j] = random(100);            //随机生成100范围内的数,赋给数组
        }
    }
}


/*
*函数名称:write_File
*函数功能:将数据记录一次性写入到.txt文件
*输入参数:无
*返回值:无
*版本信息:
*/
void write_File()
{
    FILE *fp = fopen(FileName, "w");           //建立文件指针,将文件指针指向.txt文件
    fprintf(fp, "%d\n", n);                    //将条数参数打印到文件中
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (j != 2)
                fprintf(fp, "%d,", a[i][j]);  //将int型数字打印到文件中
            else
                fprintf(fp, "%d", a[i][j]);   //将int型数字打印到文件中
        }
        fprintf(fp,"\n");
    }
    fclose(fp); //关闭文件
}


/*
*函数名称:free_Zoom
*函数功能:释放堆区内存
*输入参数:无
*返回值:无
*版本信息:
*/
void free_Zoom()
{
    for (int i = 0; i < n; i++)
    {
        free(a[i]);                   //逐个释放指针内存
    }
    free(a);                          //释放指向指针的二级指针内存
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值