作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185
1.熟悉 命令行 和 控制台/标准输入和标准输出
(1)
作业题目:
熟悉 命令行 和 控制台/标准输入和标准输出
假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,
请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
作业回答:
①数据流图:
②简述:
将b.txt文件内容在a.exe中执行,最终将结果存储在c.txt中
(2)
作业题目:
请用C语言开发应用程序d.exe,从控制台指令读入命令行参数,并在控制台分别打印出a、b、c的值。(6分)
作业回答:
代码如下:
/* 1.argc是命令行总的参数个数 2.argv[]为保存命令行参数的字符串指针 argv[0]为程序的全名 3.sscanf() 从一个字符串中读进与指定格式相符的数据. */ # include<stdio.h> int main(int argc,char *argv[]){ int a, b, c; sscanf(argv[1], "a=%d", &a); sscanf(argv[2], "b=%d", &b); sscanf(argv[3], "c=%d", &c); printf("%d ", a); printf("%d ", b); printf("%d", c); return 0; }
运行效果:
2.熟悉 测试用例
(1)(2)
作业回答:
(3)
代码解读 (20分)
发表博客,介绍上述3个题目代码中重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。
①1001 害死人不偿命的(3n+1)猜想
题目:
卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 ( 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (,以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
输入格式:
每个测试输入包含 1 个测试用例,即给出正整数 n 的值。
输出格式:
输出从 n 计算到 1 需要的步数。
输入样例:
3
输出样例:
5
重点/难点:
题目分析:若为偶数,则直接进行除以2;若为奇数,则进行乘3后加1再除以2,循环执行,直到n为1,记录除以2的次数即为所求。
奇偶数判断,使用n%2是否等于0,若为0则是偶数,若不为0则是奇数。
重要代码:
while(n != 1){ if(n % 2 == 0){ //偶数 n = n / 2; }else{ //奇数 n = (3 * n + 1) / 2; } num++; }
执行效果图:
②1002 写出这个数
题目:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 1。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
重点/难点:
题目分析:以字符数组输入,循环字符数组,将字符转int,依次相加得到sum整数。
对sum进行取余循环,依次取出各位数,经过switch输出每位数字对应的拼音。
1.以字符数组输入,若为数字,则会产生整数存不下的问题
2.将字符型转int,可以使用这种方式 num[i] - '0'
3.取出整数中的每一位数据,使用循环,进行取余,除法的操作
4.使用switch语句,进行数字与拼音的转换
重要代码:
for(i = 0; i < strlen(num); i++){ sum = sum + (num[i] - '0');//将字符型转int } for(j = 0; sum > 0; j++) { total[j]= sum % 10; sum = sum / 10; } for(i = j - 1; i >= 0; i--){ switch(total[i]){ 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; } if(i != 0) printf(" "); }
执行效果图:
③1004 成绩排名
题目:
读入 n(>)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名
和学号
均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
重点/难点:
题目分析:循环字符串数组,分别以空格切分每个字符串,将切分后的分数字符串转为整型,分别与最大最小值进行对比,循环中定位最大最小的字符串数组下标。
1.使用java提交代码时,类名必须为Main
即:
public class Main{
public static void main(String[] args){
2.java语言的输入,Scanner 用法,nextInt()方法输入数字,nextLine()方法读完整一行,返回值为String
数字行与字符串行之间,需要一个nextLine()方法。
3.最大值初始化应为小于等于0,最小值初始化应为大于等于100
4.注意字符串数组应初始化尽量大一点,否则可能产生n太大,字符串数组溢出
重要代码:
import java.util.Scanner; public class Main{ public static void main(String[] args){ int i, score, max = -1, min = 999, maxt = 0, mint = 0; String[] messages = new String[1000]; String[] message; Scanner sc = new Scanner(System.in); int n = sc.nextInt();//输入n sc.nextLine(); for(i = 0 ;i < n; i++){ messages[i] = sc.nextLine();//输入每行字符串 } for(i = 0 ;i < n; i++){ message = messages[i].split(" ");//通过空格拆分字符串 score = Integer.parseInt(message[2]); if(max <= score){ //比较最大 max = score; maxt = i; } if(min >= score){ //比较最小 min = score; mint = i; } } message = messages[maxt].split(" "); System.out.println(message[0] + " " + message[1]); message = messages[mint].split(" "); System.out.println(message[0] + " " + message[1]); } }
执行效果图:
(4)控制台应用 (15分)
要求在博客中给出测试数据。
参照上一题中“控制台”的知识,给出运行时从控制台读入测试数据和向控制台输出的截图。
①1001 害死人不偿命的(3n+1)猜想
测试数据:
3
测试结果:
5
效果截图:
②1002 写出这个数
测试数据:
1234567890987654321123456789
测试结果:
yi san wu
效果截图:
③1004 成绩排名
(由于本人在做本题目时使用的是java语言,与上题要求C语言编写,exe运行不符合,因此本题重新进行C代码编写)
代码:
#include<stdio.h> #include <string.h> struct student { char name[11]; char number[11]; int score; }; int main() { int n, i; struct student students[150]; struct student max, min; max.score = -1; min.score = 101; scanf("%d",&n); for(i = 0; i < n; i++) scanf("%s %s %d",students[i].name,students[i].number,&students[i].score); for(i = 0; i < n; i++) { if(max.score <= students[i].score) { max = students[i]; } if(min.score >= students[i].score) { min = students[i]; } } printf("%s %s ",max.name,max.number,min.name,min.number); printf("%s %s ",min.name,min.number); return 0; }
测试数据:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
测试结果:
Mike CS991301
Joe Math990112
效果截图:
(五) PSP(8分)
题目 | 预计花费时间 | 实际花费时间 | 时间差 | 原因 |
1001 | 10min | 8min | -2min | 题目容易理解,编码较简单 |
1002 | 20min | 28min | +8min |
1.将字符型转整型知识点不熟练 2.将整数的各个位数存至数组知识遗忘,不熟练 |
1004 | 35min | 55min | +20min |
1.中途由C语言切换至Java语言编程浪费时间 2.使用Java语言时,使用自定义类名Test,故产生编译错误问题,不知题目集 PAT代码提交时,有固定的类名Main 3.java输入语句Scanner类方法不熟悉 |