复习C语言,学习Linux的基本指令,vi基本操作以及压缩方式

来源:互联网 发布:网络pk游戏大全 编辑:程序博客网 时间:2024/06/02 05:30

20~30个linux命令:

ls:显示文件或目录

        -l:列出详细信息(list

mkdir:创建目录

           -p:创建目录,若无父目录,则创建p(parent)

cd:切换目录

touch:创建空文件

echo:创建带有内容的文件

cat:查看文件内容

cp:拷贝

mv:移动或重命名

rm:删除文件

rmdir:删除空目录

pwd:显示当前所在目录

cat:在命令行下查看文件内容

tac:将文件内容倒着显示

head:只看文件头几行(-n 2:后面接数字,代表显示2(几)行;)

tail:只看文件尾几行(-n:后面接数字,表示显示几行;)

umask:指的是该默认值需要减掉的权限(002:实际权限是644-rw-rw-r-)

file:显示文件类型

which:可以看到某个系统命令是否存在以及执行的到底是哪一个位置的命令

tar :压缩解压文件:(压缩#tar cvzf   c1.tar.gz  c1;解压 #tar  zxvf   c1.tar.gz)

chmod:修改权限

ifconfig:网络配置

find 查找文件

grep:查找含有对应字符串的文件

man 查询帮助

ps:查看进程的

kill:杀死对应进程的(-l:列出所有信号名称)

shutdown now:立即关机

last:用于显示用户最近登录信息

netstat:命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics)masquerade连接,多播成员 (Multicast Memberships)等等

10`15个常用的c语言算法:

例一:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。

  本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为 1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在 x[10]。

voidmain()

{

int a[101],x[11],i,p;

for(I = 0; i <= 11; i++)

{

x[i] = 0;

}

for(i = 1; i <= 100; i++)

{

a[i] = rand()  %  100;

printf ("%4d",a[i]);

if(I % 10 == 0)

{

printf ("/n");

}

}

for(i=1;i<=100;i++)

{

p=a[i]%10;

if(p==0) p=10;

x[p]=x[p]+1;

}

for(i=1;i<=10;i++)

{

p=i;

if(i==10) p=0;

printf("%d,%d/n",p,x[i]);

}

printf("/n");

}

例二:求两个整数的最大公约数、最小公倍数

分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)

(1) 对于已知两数m,n,使得m>n;

(2) m除以n得余数r;

(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);

(4) m←n,n←r,再重复执行(2)。

例如: 求 m=14,n=6 的最大公约数.

m n r

14 6 2

6 2 0

void main()

{

int nm, r, n, m, t;

printf("please inputtwo numbers:\n");

scanf("%d,%d",&m,&n);

nm=n*m;

if (m<n)

{

t=n;

n=m;

m=t;

        }

r=m%n;

while (r!=0)

{

m=n;

n=r;

r=m%n;

        }

printf("最大公约数:%d\n",n);

printf("最小公倍数:%d\n",nm/n);

    }

例三:判断素数

只能被1或本身整除的数称为素数 基本思想:把m作为被除数,将2—INT( )作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)

void main()

{

int m,i,k;

printf("please inputa number:\n");

scanf("%d",&m);

k=sqrt(m);

for(i=2;i<=k;i++)

{

if(m%i==0)

break;

        }

if(i>k)

{

printf("该数是素数");

}

else

{

printf("该数不是素数");

}

例四:选择法排序(升序)

基本思想:

1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;

2)除第1个数外,其余n-1个数中选最小的数,与第2个数交换位

3)依次类推,选择了n-1次后,这个数列已按升序排列。

程序代码如下:

void main()

{

int i, j, imin, s, a[10];

printf("\n input 10numbers:\n");

for(i = 0; i < 10; i++)

{

scanf("%d",&a[i]);

}

for(i=0;i<9;i++)

{

imin=i;

for(j=i+1;j<10;j++)

{

if(a[imin]>a[j])

{

imin=j;

}

}

if(i!=imin)

{

s=a[i];

a[i]=a[imin];

a[imin]=s;

}

}

       for (i=0; i<10;i++)

        {

printf("%d\n",a[i]);

}

}

 

例五:冒泡法排序(升序)

基本思想:(将相邻两个数比较,小的调到前头)

1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;

2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;

3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。

程序段如下

void main()

{

int a[10];

int i,j,t;

printf("input 10numbers/n");

for(i=0;i<10;i++)

{

scanf("%d",&a[i]);

}

printf("/n");

for(j=0;j<=8;j++)

{

for(i=0;i<9-j;i++)

            {

if(a[i]>a[i+1])

{

t=a[i];

a[i]=a[i+1];

a[i+1]=t;

               }

            }

       }   

for(i=0;i<10;i++)

{

printf("%d ",a[i]);

}

}

例六:合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)

基本思想:
1
)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:
voidmain()

{

int a[5] = { 3, 5, 7, 9,12 }, a[10] = { 1, 5, 8, 14, 15, 18, 22, 25, 28, 30 }

int c[15], i, ia, ib, ic;

ia = 0;

ib = 0;

ic = 0;

while (ia < 5 &&ib < 10)

{

if(a[ia]<b[ib])

{

c[ic]=a[ia];

ia++;

        }

else

{

c[ic]=b[ib];

ib++;

        }

ic++;

}

while(ia<=4)

{

c[ic]=a[ia];

ia++;

ic++;

}

while(ib<=9)

{

c[ic]=b[ib];

b++;

ic++;

}

for(i=0;i<20;i++)

{

printf("%d ",c[i]);

    }

}

 

例七:顺序查找法(在一列数中查找某数x

基本思想:一列数放在数组a[1]---a[n]中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为0,使x与a[p]比较,如果x不等于a[p],则使 p=p+1,不断重复这个过程;一旦x等于a[p]则退出循环;另外,如果p大于数组长度,循环也应该停止。(这个过程可由下语句实现)
voidmain()

{

int a[10],p,x,i;

printf("please inputthe array:\n");

for(i=0;i<10;i++)

{

scanf("%d",&a[i]);

}

printf("please inputthe number you want find:\n");

scanf("%d",&x);

printf("\n");

p=0;

while(x!=a[p]&&p<10)

{

p++;

}

if(p >= 10)

{

printf("the number isnot found!\n");

}

else

{

printf("the number isfound the no%d!\n",p);

}
}

思考:将上面程序改写一查找函数Find,若找到则返回下标值,找不到返回-1
②基本思想:一列数放在数组a[1]---a[n]中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。(查找子过程如下。index:存放找到元素的下标。)
voidmain()

{

int a[10], index, x, i;

printf("please inputthe array:\n");

for(i=0;i<10;i++)

{

scanf("%d",&a[i]);

}

printf("please inputthe number you want find:\n");

scanf("%d",&x);

printf("\n");

index=-1;

for(i=0;i<10;i++)

if(x==a[i])

{

index=i;

break;

}

if(index==-1)

{

printf("the number isnot found!\n");

}

else

printf("the number isfound the no%d!\n",index);
}

 

例八:折半查找法(只能对有序数列进行查找)

基本思想:设n个有序数(从小到大)存放在数组a[1]----a[n]中,要查找的数为x。用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:
(1)x=a(mid),则已找到退出循环,否则进行下面的判断;
(2)x<a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;
(3)x>a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;
(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<=top。
将上面的算法写成如下程序:
voidmain()

{

int a[10], mid, bot, top, x,i, find;

printf("please inputthe array:\n");

for(i=0;i<10;i++)

{

scanf("%d",&a[i]);

}

printf("please inputthe number you want find:\n");

scanf("%d",&x);

printf("\n");

bot=0;

top=9;

find=0;

while(bot<top&&find==0)

{

mid=(top+bot)/2;

if(x==a[mid])

{

find=1;

break;

        }

else if (x < a[mid])

{

top = mid-1;

        }

else

{

bot = mid+1;

}

if (find == 1)

{

printf("the number isfound the no%d!\n",mid);

}

else

{

printf("the number isnot found!/n");

}
}

例九:插入法

  把一个数插到有序数列中,插入后数列仍然有序

基本思想:n个有序数(从小到大)存放在数组a(1)—a(n)中,要插入的数x。首先确定x插在数组中的位置P;(可由以下语句实现)
#defineN 10
void main()

{

int p, i, a[], x;

p=0;

while(x>a[p]&&p<N)

{

p++;

}

for(i=N; i>p; i--)

{

a[i]=a[i-1];

}

a[p]=x;
}

 

例十:矩阵(二维数组)运算

(1)矩阵的加、减运算
C(i,j)=a(i,j)+b(i,j) 加法
C(i,j)=a(i,j)-b(i,j) 减法
(2)矩阵相乘
(矩阵A有M*L个元素,矩阵B有L*N个元素,则矩阵C=A*B有M*N个元素)。矩阵C中任一元素(i=1,2,…,m; j=1,2,…,n)
#defineM 2
#define L 4
#define N 3
void mv (int a[M][L], int b[L][N], int c[M][N])
{

int i, j, k;

for (i=0; i<M; i++)

{

for (j=0; j<N; j++)

{

c[i][j]=0;

for (k=0; k<L; k++)

{

c[i][j]+=a[i][k]*b[k][j];

}

}

}

}
main ()
{

int a[M][L]= {{1,2,3,4},{1,1,1,1}};

int b[L][N]= {{1,1,1},{1,2,1},{2,2,1},{2,3,1}},c[M][N];

int i, j;

mv (a,b,c);

for (i=0; i<M; i++)

{

for (j=0; j<N; j++)

{

printf ("%4d",c[i][j]);

}

printf ("\n");

}
}
(3)矩阵传置
例:有二维数组a(5,5),要对它实现转置,可用下面两种方式:
#defineN 3
void ch1 (int a[N][N])
{

int i, j, t;

for (i=0; i<N; i++)

{

for (j=i+1; j<N; j++)

{

t=a[i][j];

a[i][j]=a[j][i];

a[j][i]=t;

}

}
}
void ch2 (int a[N][N])
{

int i, j, t;

for (i=1; i<N; i++)

{

for (j= 0; j<i; j++)

{

t=a[i][j];

a[i][j]=a[j][i];

a[j][i]=t;

}

}
}
main ()
{

int a[N][N]= {{1,2,3},{4,5,6},{7,8,9}},i, j;

ch1 (a);     /*ch2(a);*/

for (i=0; i<N; i++)

{

for (j=0; j<N; j++)

{

printf ("%4d",a[i][j]);

}

printf ("\n");

}
}
(4)求二维数组中最小元素及其所在的行和列
基本思路同一维数组,可用下面程序段实现(以二维数组a[3][4]为例):
‘变量max中存放最大值,row,column存放最大值所在行列号
#defineN 4
#define M 3
void min (int a[M][N])
{

int min, row, column, i,j;

min = a[0][0];

row = 0;

column = 0;

for (i = 0; I < M; i++)

{

for (j = 0; j < N; j++)

{

if (a[i][j] < min)

{

min = a[i][j];

row = i;

column = j;

}

}

}

printf ("Min = %d\nAtRow%d,Column%d\n", min, row, column);
}
main()
{

int a[M][N]= {{1,23,45,-5},{5,6,-7,6}, {0,33,8,15}};

min (a);

}

例十一:数制转换

  将一个十进制整数m转换成 →r(2-16)进制字符串。

方法:将m不断除 r 取余数,直到商为零,以反序得到结果。下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
char*trdec(int idec, int ibase)
{

char strdr[20], t;

int i, idr, p=0;

while(idec!=0)

{

idr=idec % ibase;

if(idr>=10)

{

strdr[p++]=idr-10+65;

}

else

{

strdr[p++]=idr+48;

}

idec/=ibase;

}

for(i=0; i<p/2; i++)

{

t=strdr[i];

strdr[i]=strdr[p-i-1];

strdr[p-i-1]=t;

}

strdr[p]=’\0’;

return(strdr);
}
main()
{

int x, d;

scanf("%d%d",&x, &d);

printf("%s\n",trdec(x,d));

}

vi的使用方法:

基本上vi可分为三种操作状态,分别是命令模式(Commandmode)、插入模式(Insertmode)和底线命令模式(Lastline mode),各模式的功能区分如下:

1 Comandmode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insertmode下,或者到Lastline mode

2 Insertmode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comandmode

3 Lastline mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。

不过可以把vi简化成两个模式,即是将Lastline mode也算入Commandmode,vi分成CommandInsertmode

 

vi的基本操作:

1.       进入vi

在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面。

2.       切换至Insertmode编辑文件

Commandmode下按‘i’‘a’‘o’三键就可进入Insertmode

i: 插入,从目前光标所在之处插入所输入的文字。

a: 增加,目前光标所在的下一个字开始输入文字。

o: 插入新的一行,从行首开始输入文字。

3.       离开并保存文件

先按ESC回到Commandmode,然后按下“:”,最后输入wq!保存并强制退出。

 

 

常见的vi指令

Command mode功能键列表(ESC进入)

1Iao切换进入Insertmode[超级常用]

2)移动光标

vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母hjkl,分别控制光标左、下、上、右移一格。

Ctrl+B:屏幕往后移动一页。[常用]

Ctrl+F:屏幕往前移动一页。[常用]

Ctrl+U:屏幕往后移动半页。

Ctrl+D:屏幕往前移动半页。

0(数字零):移动文章的开头。[常用]

G:移动到文章的最后。[常用]

w:光标跳到下个word的开头。[常用]

e:光标跳到下个word的字尾。

b:光标回到上个word的开头。

$:移到光标所在行的行尾。[常用]

^:移到该行第一个非空白的字符。

0:移到该行的开头位置。[常用]

#:移到该行的第#个位置,例:51121[常用]

3)删除文字

x:每按一次删除光标所在位置的后面一个字符。[超常用]

#x:例如,6x表删除光标所在位置的后面6个字符。[常用]

X:大字的X,每按一次删除光标所在位置的前面一个字符。

#X:例如,20X表删除光标所在位置的前面20个字符。

dd:删除光标所在行。[超常用]

#dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]

4)复制

yw:将光标所在处到字尾的字符复制到缓冲区中。

想在和#x#X的功能相反)

p:将缓冲区内的字符粘贴到光标所在位置(指令‘yw’与‘p必须搭配使用)。

yy:复制光标所在行。[超常用]

p:复制单行到您想粘贴之处。(指令‘yy’与‘p’必须搭配使用)

#yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]

p:复制多行到您想粘贴之处。(指令‘#yy’与‘p’必须搭配使用)

ayy:将复制行放入buffera, vi提供buffer功能,可将常用的数据存在buffer

ap:将放在buffera的数据粘贴。

b3yy:将三行数据存入bufferb

b3p:将存在bufferb的资料粘贴

5)取代

r: 取代光标所在处的字符:[常用]

R:取代字符直到按Esc为止。

6)复原(undo)上一个指令

u:假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用]

.: .可以重复执行上一次的指令。

7)更改

cw:更改光标所在处的字到字尾$处。

c#w:例如,c3w代表更改3个字。

8)跳至指定行

Ctrl+G:列出光标所在行的行号。

#G:例如,15G,表示移动光标至文章的第15行行首。[常用]

Last line mode下指令简介(按“:”进入)

1.列出行号

set nu: 输入“set nu”后,会在文章的每一行前面列出行号。

2跳到文章的某一行

#:井号代表一个数字,在Lastline mode提示符号前输入数字,再按Enter就会跳到该行了,如:15[Enter]就会跳到文章的第15行。[常用]

3寻找字符串

/关键字:先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。

?关键字:先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。

4取代字符串

1$s/string/replae/g:在lastline mode输入“1$s/string/replace/g”会将全文的string字符串取代为replace字符串,其中1,$s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。

%s/string/replace/c:同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是,%s1,$s是相同的功能,c则是表示要替代之前必须再次确认是否取代。

1,20s/string/replace/g:将120行间的string替代为relpace字符串。

5存文件

w:在lastline mode提示符号前按w即可将文件存起来。[超常用]

## wfilename:如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 wnice,将您正在编辑文章的第30~50行存成nice这个文件。

6离开

q:按q就离开,有时如果无法离开vi,可搭配!:强置离开vi,如“q

qw:一般建议离开时,搭配w一起使用,如此离开时还可存文件。[常用]

 

进入vi的命令

vifilename :打开或新建文件,并将光标置于第一行首

vi +nfilename :打开文件,并将光标置于第n行首

vi +filename :打开文件,并将光标置于最后一行首

vi+/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处

vi -rfilename :在上次正用vi编辑时发生系统崩溃,恢复filename

vifilename....filename :打开多个文件,依次编辑

 

压缩解压格式

(1)  .tar格式
解包: tar xvf FileName.tar
打包: tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)

(2)  .gz格式
解压1: gunzip FileName.gz
解压2: gzip -d FileName.gz
压 缩: gzip FileName

(3)  .tar.gz格式
解压:  tar zxvf FileName.tar.gz
压缩:  tar zcvf FileName.tar.gzDirName

(4)  .bz2格式
解压1: bzip2 -d FileName.bz2
解压2: bunzip2 FileName.bz2
压 缩:  bzip2 -z FileName

(5)  .tar.bz2格式
解压: tar jxvf FileName.tar.bz2
压缩: tar jcvf FileName.tar.bz2 DirName

(6)  .bz格式
解压1: bzip2 -d FileName.bz
解压2: bunzip2 FileName.bz

(7)  .tar.bz格式
解压: tar jxvf FileName.tar.bz

(8)  .Z格式
解压: uncompress FileName.Z
压缩: compress FileName

(9)  .tar.Z格式
解压: tar Zxvf FileName.tar.Z
压缩: tar Zcvf FileName.tar.Z DirName

(10) .tgz格式
解压: tar zxvf FileName.tgz

(11) .tar.tgz格式
解压: tar zxvf FileName.tar.tgz
压缩: tar zcvf FileName.tar.tgz FileName

(12) .zip格式
解压: unzip FileName.zip
压缩: zip FileName.zip DirName

(13) .lha格式
解压: lha -e FileName.lha
压缩: lha -a FileName.lha FileName

(14) .rar格式
解压: rar a FileName.rar
压缩: rar e FileName.rar

原创粉丝点击