zoukankan      html  css  js  c++  java
  • 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 
    
    %d 
    
    %d 
    ", 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
    ", 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语言长时间未使用过,导致某些用法生疏

  • 相关阅读:
    堆排序优化与几个排序算法时间复杂度
    冒泡排序的实现和优化及其与插入,选择排序的比较
    插入排序的实现与优化并和选择排序进行性能比较
    选择排序的实现以及性能测试
    MD5加密
    低功耗蓝牙BLE [学习笔记]
    反编译[学习笔记]
    Android 混淆[学习笔记]
    北大SQL数据库视频课程笔记
    repo/git Android/CyanogenMod srouce code
  • 原文地址:https://www.cnblogs.com/HanYG/p/13658836.html
Copyright © 2011-2022 走看看