课堂老师留个作业,开发一段代码,从配置文件中读取用户配置的值,按照从小到大的顺序排序,然后依次输出圆形、方形或者三角形。
配置文件如下:
triangle=2
cycle=5
square=8
老师给的例子是C#的,因为对C#不是很熟悉,因此改造成了C版本和Java版本的,这里是C版本的例子。
要完成本例子,需要将任务分解成以下步骤:读取配置文件、排序用户配置数值、按照升序依次输出图形。
1,读取配置文件:感觉C读取文件还是很方便的,但是字符串操作相对较少,读取完每行按照“=”分割时比较麻烦。
//load the configure file
FILE *f;
f = fopen(FILENAME,"r");
if(f == NULL){
printf("%s\n", "error when open the configure file");
return ;
}
char content[3][100];
char line[100];
int i=0;
while(fgets(line, 100, f) != NULL){
if(line[0] == '#'){
continue;
}else{
strncpy(content[i], line, 100);
i++;
}
}
fclose(f);
//parser the configured file
for(i=0;i<3;i++){
parserByLine(content[i], kv, 6);
}
解析每行内容,按照“=”分割。
//parser configure file line by line
void parserByLine(char * line, struct shapeType * kv,int num){
int length = 0, equalSign = 1;
char *begin;
length = strlen(line);
for(begin = line; * begin != '=' && equalSign <= length; begin++){
equalSign++;
}
//seperate name and value by equal
//这里的数组需要声明的大一些,防止参数名称保存不全
char charValue[200];
char charName[200];
strncpy(charName, line, equalSign-1);
strncpy(charValue, line + equalSign, length);
char * strCycle = CYCLE;
char * strSquare = SQUARE;
char * strTriangle = TRIANGLE;
if(* strCycle == charName[0]){
kv->sortValue = atoi(charValue);
}else if(* strTriangle == charName[0]){
// (* (kv+1)).sortValue = atoi(charValue);
(++kv)->sortValue = atoi(charValue);
}else if(* strSquare == charName[0]){
// (* (kv+2)).sortValue = atoi(charValue);
kv += 2;
kv->sortValue = atoi(charValue);
}
}
因为配置内容在java中是使用key、value的形式保存的,但是C没有这种数据结构,因此自己定义了一个结构shapType,用来保存每行配置的键值对应关系。
struct shapeType
{
char * shapeName;
int sortValue;
} shapes[3] = {{CYCLE,0},{TRIANGLE,0},{SQUARE,0}};
接下来对读取出来的内容进行排序:
//sort configured values load from the configure file
void sort(struct shapeType * kv){
int i, j;
char * tmpName;
int tmpValue;
for(i=0;i<2;i++){
for(j=i+1;j<3;j++){
if( (* (kv+i)).sortValue >= (* (kv+j)).sortValue){
tmpName = (* (kv+j)).shapeName;
tmpValue = (* (kv+j)).sortValue;
(* (kv+j)).shapeName = (* (kv+i)).shapeName;
(* (kv+j)).sortValue = (* (kv+i)).sortValue;
(* (kv+i)).shapeName = tmpName;
(* (kv+i)).sortValue = tmpValue;
}
}
}
}
接下来就是按照排序后的顺序,进行输出了,这个比较简单:
// draw shapes accroding to the sorted array shapes[3]
void draw(struct shapeType * kv){
struct shapeType * kvEnd;
kvEnd = kv+3;
for(;kv<kvEnd;kv++){
if( kv->shapeName == CYCLE){// (* kv).shapeName
drawCycle();
}else if( kv->shapeName == SQUARE){
drawSquare();
}else if( kv->shapeName == TRIANGLE){
drawTriangle();
}
printf("\n");
}
}
总结:好久没有写C了,而且这个项目是先完成的Java版本,回头再写C版本的,感觉相当痛苦,总是在以Java的思维去想C的构思,结果就是什么语言也不像了。好在是基本的功能出来了,至于代码优化,欢迎大家给出好的建议啊!
附件是项目几个源码文件,可以直接下载使用,入口是"main.c"
分享到:
相关推荐
此题需要我们编写程序,将输入的3个数字按从小到大的顺序输出。 ### 输入数组交换元素重新输出 本题要求我们编写程序,交换数组中的某些元素后重新输出。 ### 多个整数后移位置问题 此题需要我们设计一个算法,...
- **描述**:接收三个数作为输入,并按照从小到大的顺序输出。 #### 【程序6】用*号输出字母C的图案 - **知识点**: - 循环结构 - 字符串操作 - 条件语句 - **描述**:通过嵌套循环输出特定的字符模式来构成字母...
学生需要学会用“大于”、“小于”和“等于”这样的符号来表示数的关系,并能将数字按照从小到大或从大到小的顺序排列。这部分教学通常会结合生活情境,比如比较物体的数量或身高,使抽象的数学概念变得具体易懂。 ...
2. **数字比较与排序**:题目可能会涉及比较两个或多个数字的大小,以及将数字按照从小到大或从大到小的顺序排列。这有助于培养学生的逻辑思维和比较能力。 3. **时间与日期**:一年级的数学课程也涵盖了时间的概念...
9. C语言程序执行:在给定的C程序中,如果输入9,n++操作会在输入值被读取之后进行,因此输出结果是10,因为n先被赋值为9,然后自增变为10。 10. 私有方法:在面向对象编程中,私有方法是类内部的方法,不能被类的...
试卷可能有排序题目,比如将数字从小到大排列。 3. **图形与几何**:学生会学习识别和绘制基本的几何形状,如正方形、长方形、三角形和圆形。可能的测试内容包括识别图形、数图形的数量以及简单的位置关系(如上下...
8. 统计图表分析:问题8中给出了条形统计图,需要从中读取众数(出现次数最多的数据)和中位数(将数据从小到大排列后处于中间位置的数)。 9. 反比例函数与一次函数的交点:问题9中涉及反比例函数和一次函数的图像...
中位数是将数据从小到大排列后位于中间位置的数值;众数是出现次数最多的数值;平均数是所有数值相加后的总和除以数值个数。根据题目中的数据,需要具体的数据才能计算。 4. **一元二次方程的根**:问题24涉及了...
4. 数据统计:第四题涉及到众数和中位数的计算,这是统计学的基础概念,众数是一组数据中出现次数最多的数值,而中位数是将数据从小到大排列后位于中间位置的数。 5. 圆的切线性质:第五题考察了圆的切线性质,通过...
中位数是将数据从小到大排列后位于中间位置的数。若众数与平均数相同,可通过分析数据特点找到中位数。 6. **几何图形识别**:绿丝带重叠部分形成的图形形状的判断,可能涉及到基本几何图形的识别,如正方形、等腰...
4. 平均数与中位数:平均数是所有数值加起来除以数值的个数,中位数则是将一组数据从小到大排列后处于中间位置的数。题目中提到的数据需要先排序,然后找出中位数。 5. 位似图形:位似图形是指两个图形放大或缩小的...
8. **中位数**:给定一组数据,中位数是将数据从小到大排列后处于中间位置的数值。对于5个数据,中位数就是第三个数。 9. **多边形内角和**:多边形的内角和公式为(n-2)*180°,通过这个公式可以确定多边形的边数...
3. **数的大小比较**:问题10要求学生将一系列数字从小到大排序,这考察了他们对数字顺序的理解和比较技巧。 4. **货币换算**:问题10和11涉及到人民币的基本单位转换,如角和元之间的转换,帮助学生理解货币系统。...
中位数是将数据从小到大排序后位于中间的数;众数是一组数据中出现次数最多的数;平均数是所有数据之和除以数据个数;方差则是反映数据波动性的量。去除最高分和最低分不会改变中位数,但可能会影响平均数、众数和...
七、将下列各数按照从小到大的顺序进行排列。 此题考察了孩子对货币单位的理解和数值比较,需要他们将不同面额的人民币按大小排序,这有助于他们建立数的序列概念。 八、把钟面上的时间写出来。 这部分涉及时间的...
2. **数的比较与排序**:理解“>”、“<”和“=”这三个比较符号的含义,能比较两个两位数的大小,并能将数从小到大或从大到小排序。 3. **认识时间**:掌握时钟的基本构造,了解时针和分针的运行规律,能正确读出...
3. **中位数与众数**:统计学中的中位数是指将一组数据从小到大排列后处于中间位置的数,而众数是出现次数最多的数。在给定的数据中,中位数是中点的温度,众数是出现最频繁的温度。 4. **代数运算**:题目中涉及了...
- 从小到大:2厘米、20厘米、20米、40厘米、4米。 - 从大到小:90米、90厘米、9米、9厘米。 - 从小到大:4厘米、40厘米、2米、4米。 11. 画图练习: - 画一条比5厘米长3厘米的线段,即画一条8厘米的线段。 - ...
中位数是将数据从小到大排列后位于中间位置的数,对于偶数个数据,是中间两个数的平均值,因此中位数也是85;极差是最大值减去最小值,为95-80=15。所以错误的表述是C,即**C.**,中位数不是80。 5. **一次函数的...