《Linux程序设计 第四版》之第二章的最后练习题

这篇文章是《Linux程序设计 第四版》中的第二章的最后练习题(2.8综合应用),

题目是编写一个CD数据库应用程序,

首先:用两个文件来保存存储的数据,一个是title_file.cdb,一个是column_file.cdb!

title_file.cdb里面保存的是唱片的基本信息:拥有如下四个字段:

CD的目录编号,标题,唱片类型,作曲家或艺术家;

column_file.cdb里面保存的是唱片的详细信息即唱片包含的歌曲信息:拥有如下三个字段:

CD的目录编号,曲目编号,歌曲名

其次:

有如下函数模块:

get_return()   返回函数

get_confirm()   是否继续操作函数

add_records()    增加CD基本信息函数

insert_title()    在title_file.cdb插入CD基本信息函数

add_records_cds()  增加CD详细信息函数

insert_track()        在column_file.cdb插入CD基本信息函数

find_records()     查找CD信息函数

rm_records()       删除CD信息函数

update_records()   更新CD详细信息函数

count_records()     统计CD数量以及歌曲数量信息函数

list_records()      列出选中CD的详细信息(歌曲)函数

memu_display()      菜单界面函数

代码中主要用到的命令:

grep;   过滤每一个行字符串

cut;   根据字段切割整列字符串

wc;   统计行数等数目

set;

read;   键盘输入

echo;  输出

>、>>、<;   输入输出重定向

rm

以及各种逻辑判断,字符串操作,管道命令使用等~

题目不难,主要是熟悉各种命令~

代码如下:

#!/bin/bash
temp_file="./tempfile.cdb"
title_file="./title_file.cdb"
column_file="./column_file.cdb"
choose=""

#return
get_return()
{
	echo -e "Press return \c "
	read x
	return 0
}
#confirm

get_confirm()
{
	echo "Are u sure?(y/n)"

	while true;
	 do
	 	read yn
		case "$yn" in
			y | Y )
				return 0;;
			n | N )
				return 1;;
			* ) echo "Please enter y or n";;
		esac
	done
}

add_records()
{
	echo "Please input the record's name like this"
	echo "CD123,Cool sax,Jazz,Bix"
	read  input
	local temp=$(echo $input|egrep '^[[:alnum:]]+,[[:alpha:]]+,[[:alpha:]]+,[[:alpha:]]+$')
	if [ "$temp" == "" ];then
		echo "wrong name"
		sleep 1
		return 0;
	else
		cdnum=$(echo $input|cut -d ',' -f1)
		cdtitle=$(echo $input|cut -d ',' -f2)
		cdtype=$(echo $input|cut -d ',' -f3)
		cdac=$(echo $input|cut -d ',' -f4)
	fi
	echo "the name is $cdnum $cdtitle $cdtype $cdac"
	if get_confirm ;then
		insert_title $cdnum $cdtitle $cdtype $cdac
		add_records_cds
		return
	else
		echo "you dont save the record"
		return
	fi
}
add_records_cds()
{

	echo "Please input the record's list name like this:"
	echo "Juhuatai,Qianlizhiwai,..."
	read names
	local k=$(echo "$names"|awk -F ',' '{print NF}')
	#echo $k
	declare -i j=1;
	y=$((k));
	#echo $y
	while [ $j -le $y ];
	do
	insert_track $cdnum $j $(echo "$names"|cut -d ',' -f $j)
	j=$j+1
	done
}

find_records()
{
	if [[ "$1" == "n" ]]; then
		asklist="n";
	else
		asklist="y";
		#statements
	fi

	echo "input a string to search for in the cd titles"
	read searchstr

	if [ "$searchstr" == "" ];then
		return 0;
	fi

	grep  -i "$searchstr" $title_file > $temp_file;

    #将计算出来的数目的第一个参数(行的数量)赋给linesfound
	set $(wc -l $temp_file)
	linesfound=$1

	case "$linesfound" in
		0) echo "No found"
			get_return
			return 0;;
		1) ;;
		2)  echo "Sorry,many results:"
			cat $temp_file
			get_return
			return 0;;
	esac

	read cdnum cdtitle cdtype cdac < $temp_file

	if [ -z "$cdnum" ]; then
		echo "Sorry,can't extract details from $temp_file"
		get_return
		return 0
		#statements
	fi
	echo
	echo "CD number:	$cdnum"
	echo "Title:   	$cdtitle"
	echo "Type:		$cdtype"
	echo "Artist:		$cdac"
	echo
	get_return

	if [[ "$asklist" == "y" ]]; then
		echo "View tracks for this CD?"
		read x
		if [[ "$x" == "y" ]]; then
			echo
			list_records;
			echo
			#statements
		fi
		#statements
	fi
	return 1
}

rm_records()
{
	find_records n;
	if [[ -n "$cdnum" ]]; then
		echo "Deleting CD: $cdnum $cdtitle $cdtype $cdac"
		get_confirm &&{ grep -v "^$cdnum" $title_file > $temp_file
		mv $temp_file $title_file
		grep -v "^$cdnum" $column_file > $temp_file
		mv $temp_file $column_file
		cdnum=""
		echo "Delete ready"
	}
	get_return
		#statements
	fi
	return

}
update_records()
{
	if [ "$cdnum" == "" ];then
		echo "you dont choose a CD"
		return ;
	fi
	echo "updateing the CD's songs $cdtitle"
	get_confirm &&{
		grep -v "^$cdnum" $column_file > $temp_file
		mv $temp_file $column_file
		echo
		add_records_cds
	}
	return
}

count_records()
{
	local num_cds=$(wc -l $title_file|cut -d " " -f1)
	local num_songs=$(wc -l $column_file|cut -d " " -f1)
	echo "the nums for the CD is : $num_cds"
	echo "the nums for the Songs is : $num_songs"
}

list_records()
{
	[ "$cdnum" == "" ]&&echo "no CD selected"&&return
	grep "^$cdnum" $column_file > $temp_file
	local num_songs=$(wc -l $temp_file)
	if [[ "$num_songs" == "0" ]]; then
		echo "no songs found for $cdtitle"
	else
		echo
		echo "$cdtitle:-"
		echo
		cut -d " " -f 2- $temp_file
		echo
		#statements
	fi
	get_return
	return
}

memu_display()
{

	echo "Options: "
	echo 

	echo "	a) Add CD "
	echo "	f) Find CD"
	echo "	r )Remove CD"
	echo "	c )Count CDs"
	if [ "$cdnum" != "" ];then

		echo	"	l )List tracks for $cdtitle"
		echo	"	u )Update track for  $cdtitle"
	fi
	echo "	q) Quit"
	echo

	read -p "Please choose which action: " choose
	return
}

insert_title()
{

	echo $* >> $title_file
	return

}
insert_track()
{

	echo $* >> $column_file
	return

}

#main
rm -rf $temp_file
[ ! -f $title_file ] && touch $title_file ;
[ ! -f $column_file ] && touch $column_file ;
sleep 1

while true
do
	memu_display
	case "$choose" in
		a )add_records;;
		r )rm_records;;
		f )find_records y;;
		u )update_records;;
		c )count_records;;
		l )list_records;;
		b )
		echo
		more $title_file
		echo
		get_return
			;;
		q|Q )
			break;;
		* )
			echo "sorry,choice no right";;
	esac
done

rm -rf $temp_file
echo "Finish~"
exit 0
时间: 2024-12-15 06:50:54

《Linux程序设计 第四版》之第二章的最后练习题的相关文章

『Java编程思想-第四版』第二章:一切都是对象

Java编程思想-第四版学习总结,此为第二章:一切都是对象. package com.w3cjava.second; @SuppressWarnings("all") public class Second { /** * Java编程思想(第四版) * 第2章 一切都是对象 * @param args */ public static void main(String[] args) { /** * 2.1 用引用操作对象 * 遥控器(引用)操作电视机(对象),改变音量,改变频道 *

《Linux程序设计 第四版》之第三章的练习题

1.P103 一个目录扫描程序. #include<stdio.h> #include<dirent.h> #include<sys/stat.h> int isAdir(char* path); //判断路径是否是目录类型 void printdirs(char* path,int depth) //递归遍历打印文件与目录名 { DIR* dir=opendir(path); struct dirent* dirents; chdir(path); while(dir

《Linux程序设计 第四版》之第四章的练习题

1.P128 一个获取日期 时间 格式化获取时间 日期 的程序. #include<stdio.h> #include<time.h> int main(int argc,char** argv) { struct tm* time1,*time_trans; //时间数据结构 time_t alt; char c_time[128]; char* result; char* result1=""; time(&alt); time1=localtime

《Linux程序设计 第四版》之第五章的练习题

1.P168 一个完整的终端输出选择菜单的程序. #include<stdio.h> #include<sys/time.h> #include<sys/types.h> #include<sys/resource.h> #include<math.h> #include<termios.h> #include<term.h> #include<curses.h> #include<stdlib.h>

Thinking in Java(第四版)—— 第二章 一切皆对象

一.对象保存的位置 寄存器(cpu) 栈(变量) 堆(对象) 静态域(static) 常量池(string) 非内存区池 二.基本数据类型 整数型 byte short int long 8 16 32 64 浮点型 float double 32 64 字符型 char 16 Unicode 布尔型 boolean 1 三.static 属于类调用不属于对象(一般工具类中用的多)

Java编程思想(第四版)*第二章 个人练习

创建一个类,它包含一个int域和一个char域, 他们都没有被初始化,将他们打印出来, 以验证java执行了默认初始化. public class DomTest{ int i; char c; public DomTest(){ System.out.println("i="+i+" \nc=["+c+"]"+"\n []"); /** * 打印结果如下 i=0 c=[ ] []//仅用于对比参考 */ } /** * @p

Python核心编程(第二版) 第二章习题答案 未完待续

2-2.程序输出.阅读下面的Python脚本.#!/usr/bin/env python1 + 2 * 4(a)你认为这段脚本是用来做什么的?(b)你认为这段脚本会输出什么?(c)输入以上代码,并保存为脚本,然后运行它,它所做的与你的预期一样吗?为什么一样/不一样?(d)这段代码单独执行和在交互解释器中执行有何不同?试一下,然后写出结果.(e)如何改进这个脚本,以便它能和你想象的一样工作?答:(a)这段脚本是用来计算表达式的值(b)脚本会输出9(c)保存为脚本,运行后没有输出.和自己预期不一样.

《C++ Primer》 第四版 第7章 函数

<C++ Primer> 第四版 第7章 函数 思维导图笔记 超级具体.很具体,图片版,有利于复习查看 http://download.csdn.net/detail/onlyshi/9479711

Ajax本地跨域问题 Cross origin requests are only supported for HTTP(针对jQuery基础教程第四版第六章)

出现的问题: 解决的步骤: 谷歌浏览器出现的效果: 针对jQuery基础教程(第四版),第六章  成功: 原文地址:https://www.cnblogs.com/qinghui258/p/8432569.html