2020年秋第二周-命令行和控制台程序
此作业的要求参见[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语言长时间未使用过,导致某些用法生疏