Linux程序设计作业1

  1. 写一个脚本程序,它带一个参数,若该参数是一个普通文件,则把该文件的索引结点号、大小以及最近一次修改时间等详细信息输出来;如果该参数是一个目录,则将该目录(包含子目录)下的所有普通文件的文件名以及上述文件信息输出来。
    要求:
    (1)如果参数个数大于1,或者参数既不是普通文件也不是目录文件,则提示出错
    (2)给出程序在两种不同类型参数(普通文件/目录)下的运行结果
#!/bin/sh
if test $# -gt 1
then 
	echo "参数多于一个,错误"
	exit 1
fi
filename="$1"
if [ -f $1 ]
then
	set $(ls -il $filename)
	inode=$1
	size=$6
	time1=$7
	time2=$8
	time3=$9
echo "Name	  inode    size   	time"
echo "$filename  $inode  $size      $time1 $time2 $time3"
exit 0
elif [ -d $filename ]
then
	for file in $(ls -R $filename)
	do
	if [ -f $file ]
	then
	ls -il  $file
	fi
	done
	exit 0
else
	echo "既不是文件也不是目录,错误"
	exit 1
fi
	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 写一个脚本程序,提示用户输入12个整数,其中前6个整数放到数组array1中,后6个整数放到数组array2中,接下来将两个数组对应位置的元素求和,将两个数组array1,array2以及其求和结果均输出到文件result.txt中。
#!/bin/sh
echo -e "请输入12个整数:\n"
for((num=1;num<=6;num++));
do
	read n
	array1[$num]=$n
done

for((num=1;num<=6;num++));
do
        read n
        array2[$num]=$n
done

for((num=1;num<=6;num++));
do
	array3[$num]=`expr ${array2[$num]} + ${array1[$num]}`
done

echo "${array1[*]}">>result.txt
echo "${array2[*]}">>result.txt
echo "数组1和数组2相加结果为:">>result.txt
echo "${array3[*]}">>result.txt

在这里插入图片描述
在这里插入图片描述

  1. 写一个脚本程序,计算1-1/2+1/3-1/4+…-1/N的值
    要求:
    1)N由用户输入
    2)保留小数点后3位
#!/bin/sh
echo "请输入N:"
read n
total=0.000
for((num=1;num<=$n;num++));
do
	i=$num
	flag=`expr $i % 2`
	if test $flag -eq 0
	then
	       temp=`echo "scale=3;-1.000/$i" | bc`	
       else
	       temp=`echo "scale=3;1.000/$i" | bc`
       fi
       total=`echo "scale=3;$total+$temp" | bc`
done
echo $total

在这里插入图片描述

  1. 编写c程序,利用随机数生成器生成N个100-200之间的整数,并将这N个整数存放在数组array中,接下来对数组array做如下处理:
    1)求数组array中元素的次大值
    2)求数组array中所有元素的标准差
    要求:
    (1)N由用户输入
    (2)将上述1)和2)的实现分别放在一个.c文件中
    (3)利用make工程管理器进行编译

task4-main.c

#include<stdlib.h>
#include<stdio.h>
#include<math.h>

int secondMax(int a[],int n);
double standardD(int a[],int n);

int array[100];

int main(){
	int n;
	printf("请输入N:\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		array[i]=rand()%101+100;
	}
	for(int i=0;i<n;i++){
		printf("%d ",array[i]);
	}
	printf("\n");
	//求次大值
	printf("次大值为:%d\n",secondMax(array,n));
	//求所有元素的标准差
	printf("标准差为:%f\n",standardD(array,n));
}

task4-secondMax.c

int secondMax(int a[],int n){
	//初始化最大值与次大值
	int max,second;
	if(a[0]>a[1]){
		max=a[0];
		second=a[1];
	}else{
		max=a[1];
		second=a[0];
	}
	
	for(int i=2;i<n;i++){
		if(a[i]>=max){
			second=max;
			max=a[i];
		}	
		if(a[i]<max&&a[i]>second){
			second=a[i];
		}
	}
	return second;
}

task4-standardD.c

#include "math.h"
double standardD(int a[],int n){
	int sum=0;
	int ave=0;	
	for(int i=0;i<n;i++){
		sum+=a[i];
	}
	ave=sum/n;
	double ss=0;
	for(int i=0;i<n;i++){
		ss+=(ave-a[i])*(ave-a[i]);
	}
	double result=sqrt(ss/n);
	return result;
}

makefile4

task4: task4-main.o task4-secondMax.o task4-standardD.o
	gcc task4-main.o task4-secondMax.o task4-standardD.o -o task4 -lm
task4-main.o: task4-main.c
	gcc task4-main.c -c
task4-secondMax.o: task4-secondMax.c
	gcc task4-secondMax.c -c
task4-standardD.o: task4-standardD.c
	gcc task4-standardD.c -c

在这里插入图片描述

  1. 编写c程序,统计附件File1.txt中每个单词出现的次数
    要求:使用带缓存的文件读写方式

通过测试发现:读取到换行时会占两个字节,分别为回车‘\r’,换行’\n’;这是将字符分开的关键

带缓存:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>

char words[100][100];   //二维数组存放所有的单词

struct word{
	int num;    //单词出现的数量
	int pos;    //二维数组中存放单词的位置下标	
}w[100];

void compare(char a[],int j){     //比较是否出现过,并修改结构体
	w[j].num=-1;
	for(int i=0;i<j;i++){
		if(strcmp(a,words[i])==0){
			w[i].num++;
			return;
		}
	}
	w[j].num=1;
	w[j].pos=j;
}

void wordSegment(char buf[]){    //将文件中读出的单词进行切分,存入二维数组	
	int f=0,b=0;	    //buf数组前后指针
	int j=0;            //二维数组行指针
	while(buf[f]!='0'){
		if(buf[f]=='\r'){
			int k=0;   //二维数组列指针
			for(int i=b;i<f;i++){
				words[j][k++]=buf[i];
			}
			compare(words[j],j);
			j++;       
			b=f+2;    
			f++;      //跳过‘\n'
		}
		f++;
	}
	for(int i=0;i<j-1;i++){
		if(w[i].num!=-1){
			printf("%d  ",w[i].num);
			printf("%s\n",words[i]);
		}
	}
}
 
int main(){
	char buf[1000]={0};
	char temp;
	int fd;   //文件描述符
	if((fd=open("File1.txt",O_RDONLY))<0){  //只读方式打开文件
		perror("打开文件出错");
		exit(1);	
	}
	int n=0;         
	while(read(fd,&temp,1)){    //循环读入文件,每次读入1个字节
		//if(temp=='\n'){
		//	buf[n++]=0;
		//}
		buf[n++]=temp;
		//memset(buf,0,sizeof(buf));    //缓存区重置
	}
	buf[n++]='\r';          //最后一个单词后加入标志
	buf[n++]='0';          //加入读取结束标志
	//printf("%s",buf);
	//通过测试发现:读取到换行时会占两个字节,分别为回车‘\r',换行’\n';这是将字符分开的关键
	close(fd);
	
	wordSegment(buf);

}

File1.txt:
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值