- 写一个脚本程序,它带一个参数,若该参数是一个普通文件,则把该文件的索引结点号、大小以及最近一次修改时间等详细信息输出来;如果该参数是一个目录,则将该目录(包含子目录)下的所有普通文件的文件名以及上述文件信息输出来。
要求:
(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
- 写一个脚本程序,提示用户输入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/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
- 编写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
- 编写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: