实验二代码报告
题目:
程序自动生成.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); //释放指向指针的二级指针内存
}