首页 > 技术文章 > 2020年秋第二周-命令行和控制台程序

HanYG 2020-09-13 15:50 原文

此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185]

一、问题一,假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt

a.exe <b.txt> c.exe 

答案如下:

程序a.exe从文件b.txt中读取数据,输出数据存储到文件c.exe中(数据流图如下图)

二、问题二,请用C语言开发应用程序d.exe,从控制台指令读入命令行参数,并在控制台分别打印出a、b、c的值。运行效果形如下面的示例(6分)

d.exe a=1 b=2 c=3

1

2

3

 

d.exe a=11 b=22 c=33

11

22

33

答案如下:

代码

#include<stdio.h>
int main(int argc, char* argv[])
{
    int a, b, c;
    sscanf_s(argv[1], "a=%d", &a);
    sscanf_s(argv[2], "b=%d", &b);
    sscanf_s(argv[3], "c=%d", &c);
    printf("%d \n\n%d \n\n%d \n", a, b, c);
    return 0;
}

运行结果

三、熟悉测试用例

我所选择的三道题目如下图所示

1、题号1001(害死人不偿命的(3n + 1)猜想)

程序使用递归实现,函数getHalf(int num, int degree)第一个参数表示传入的需要折半的数值,第二个参数表示当前的回合数

#include<stdio.h>
/*
num: Input integer
degree: number of sheaves
*/
void getHalf(int num, int degree) {
	if (num == 1) {
		printf("%d", degree);
		return;
	}
	degree++;
	if (num % 2 == 0) {
		getHalf(num / 2, degree);
	}
	else
	{
		getHalf((3 * num + 1) / 2, degree);
	}
}

int main() {
	int num;
	scanf_s("%d", &num);
	if (num < 1 || num>1000) {
		return -1;
	}
	getHalf(num, 0);
	return 0;
}

输入3输出为5,执行效果图如下

2、题号1002(写出这个数)

输入字符串转化为字符数组存储,再由字符数组逐个转化为整数求和,求得结果转换为数组结合switch输出。
代码中有一行注释如下,表示整数sum转化为字符数组存储,10表示十进制

itoa(sum, str, 10);

但是gcc编译器报错,经过查询发下在标准gcc下不存在该函数,故改用如下这行代码效果相同

sprintf(str, "%d", sum);

源码如下

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
	char num[100];
	int sum = 0;
	scanf("%s", num);
	for (int i = 0; i < strlen(num); i++)
	{
		sum += (int)(num[i] - '0');
	}
	char str[10];
	//itoa(sum, str, 10);
	sprintf(str, "%d", sum);
	for (int i = 0; i < strlen(str); i++)
	{
		char c = str[i];
		switch (c)
		{
                        case '0': printf("ling"); break;
                        case '1': printf("yi"); break;
                        case '2': printf("er"); break;
                        case '3': printf("san"); break;
                        case '4': printf("si"); break;
                        case '5': printf("wu"); break;
                        case '6': printf("liu"); break;
                        case '7': printf("qi"); break;
                        case '8': printf("ba"); break;
                        case '9': printf("jiu"); break;
                        default: break;
		}
		if (i != (strlen(str) - 1))
		{
			printf(" ");
		}
	}
	return 0;
}

输入1234567890987654321123456789输出yi san wu,程序执行结果如下图

3、题号1004(成绩排名)

学生信息使用结构体实现存储

struct stdInfo
{
	char name[20];
	char number[10];
	int garde;
};

通过输入的学生人数来分配结构体数组的大小

struct stdInfo* stdinfo = (struct stdInfo*)malloc(stdSum * sizeof(struct stdInfo));

最后遍历得出结果

源码如下

#include<stdio.h>
#include<stdlib.h>
struct stdInfo
{
	char name[20];
	char number[10];
	int garde;
};
int main() {
	int stdSum;
	struct stdInfo max, min;
	scanf("%d", &stdSum);
	struct stdInfo* stdinfo = (struct stdInfo*)malloc(stdSum * sizeof(struct stdInfo));
	for (int i = 0; i < stdSum; i++)
	{
		scanf("%s %s %d", (stdinfo + i)->name, (stdinfo + i)->number, &(stdinfo + i)->garde);
	}
	max = min = (stdinfo[0]);
	for (int i = 1; i < stdSum; i++)
	{
		if (max.garde < (stdinfo + i)->garde) {
			max = stdinfo[i];
		}
		if (min.garde > (stdinfo + i)->garde) {
			min = stdinfo[i];
		}
	}
	printf("%s %s\n", max.name, max.number);
	printf("%s %s", min.name, min.number);
	return 0;
}

输入如下数据

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出结果如下

Mike CS991301
Joe Math990112

程序执行局结果如下图

4、控制台应用程序运行时的数据流图如下

四、PSP

完成上述三个任务的PSP表

完成该博客所用时间的PSP表

除编程任务外的其他任务时间用时与预期用时相差不大,但是编程任务耗时比预期耗时超出过多。究其原因如下:
1、编程能力下降、对自己能力预料过大
2、对该项任务存在某些方面的轻视,导致出现严重的耗时偏差
3、该任务中所有编程题目全部使用C语言来完成,C语言长时间未使用过,导致某些用法生疏

推荐阅读