Makefile总结和反序字符数组,整体右移数组,杨辉三角!

2015.1.23
今天我值日
继续接着昨天Makefile的目标开始记录:
第一种:有 .PHNOY声明,但是冒号后面没有依赖文件
.PHNOY:clean
clean://没有依赖文件
rm *.0 temp

第二种:冒号前后的文件没有直接的依赖关系也可以没有依赖文件
.PHNOY:all
1 all: main.o f1.o f2.o f3.o
2 gcc -o all main.o f1.o f2.o f3.o
3 main.o: main.c
4 gcc -c main.c -o main.o
5 f1.o: f1.c
6 gcc -c f1.c -o f1.o
7 f2.o: f2.c
8 gcc -c f2.c -o f2.o
9 f3.o: f3.c
10 gcc -c f3.c -o f3.o
11 clean:
12 rm main.o f1.o f2.o f3.o
13

第三种:all 有 .PHNOY声明,也有依赖文件,但是没有命令行
.PHNOY:all
1 all: main.o f1.o f2.o f3.o

3 main.o: main.c
4 gcc -c main.c -o main.o
5 f1.o: f1.c
6 gcc -c f1.c -o f1.o
7 f2.o: f2.c
8 gcc -c f2.c -o f2.o

第四种: 没有 .PHNOY声明

clean:
clean://没有依赖文件
rm *.0 temp

伪目标的功能:把多个目标文件写成伪目标,可以同时生成,例子如下:
1 all: main.o f1.o f2.o f3.o
2 gcc -o all main.o f1.o f2.o f3.o
3 main.o: main.c
4 gcc -c main.c -o main.o
5 f1.o: f1.c
6 gcc -c f1.c -o f1.o
7 f2.o: f2.c
8 gcc -c f2.c -o f2.o
9 f3.o: f3.c
10 gcc -c f3.c -o f3.o
11 clean:
12 rm main.o f1.o f2.o f3.o
13 rebuild :all clean //两个伪目标,

执行的时候输入:make rebuild

注:伪目标可以层层嵌套:
all:*****about
about:****hello
hello:********

make中特殊符号的用法:
1 all: main.o f1.o f2.o f3.o
2 gcc -o all main.o f1.o f2.o f3.o
3 main.o: main.c
4 -gcc -c main.c -o main.o //前面加-号,如果出错了忽略错误,继续执行
5 f1.o: f1.c
6 @gcc -c f1.c -o f1.o //前面加@号,如果出错了,立即终止
7 f2.o: f2.c

make -s 表示执行时命令行不输出
make -f name 告诉make去找的名字是name,不是Makefile
make 后面不接目标,系统默认生成第一行的目标文件,后面的目标需要指定,比如上面例子的:make clean

Makefile总结:
1. make工具默认Makefile
GNUmakefile > makefile > Makefile

2.make -s CC=gcc all
命令行的宏定义 > Makefile定义 > shell定义 > 预定义

3.变量引用:$(),${},单字符可以直接引用;如:C=gcc ,引用:$C

4.Makefile的基本语法格式:
目标文件:依赖文件
命令行
可没有命令行,但是依赖文件必须有
5.Makefile格式转换函数
patsubst
wildcard

SRCS = $(wildcard *.c) //将当前目录下的所有点C文件赋给SRCS
SRCS = $(patsubst %.c,%.o,<目录或者文件等>) //将<目录或者文件等>中的所有.c文件替换成.o文件并赋给SRCS

%.o: %.c
gcc -c $< -o [email protected]
上面两句的意思是将任意的.c文件转换成.o文件!

6.Makefile预定义变量:

[email protected] 目标的完整名称
$+ 所有依赖文件,并已空格分开,
$< 第一个依赖文件的名称
$* 不包含扩展名的目标名称
$? 所有依赖文件,并已空格分开,主要是所有改过的文件
$^ 所有依赖文件,并已空格分开,不包含重复的依赖文件

7.make中特殊符号的用法:
1.前面加-号,如果出错了忽略错误,继续执行
2.前面加@号,如果出错了,立即终止
1 all: main.o f1.o f2.o f3.o
2 gcc -o all main.o f1.o f2.o f3.o
3 main.o: main.c
4 -gcc -c main.c -o main.o //前面加-号,如果出错了忽略错误,继续执行
5 f1.o: f1.c
6 @gcc -c f1.c -o f1.o //前面加@号,如果出错了,立即终止

突然想实现将一个二维数组里面的多个字符传逐个倒序后输出来:这里用了宏定义,方便更改数组大小!

#include <stdio.h>
#include <string.h>

#define M 3
#define N 6

void Inverse(char str_array[][N]);

int main(char argc,const char * * argv)
{
char i,j;
char str_array[M][N]={"hello","every","one"};

for(i = 0; i < M; i++)
for(j = 0; j < N; j++)
{
printf("%c",str_array[i][j]);
if(j == N-1)
{
putchar(‘\t‘);
}

}
putchar(‘\n‘);

Inverse(str_array);
for(i = 0; i < M; i++)
for(j = 0; j < N; j++)
{
printf("%c",str_array[i][j]);
if(j == N-1)
{
putchar(‘\t‘);
}

}
putchar(‘\n‘);
return 0;

}
void Inverse(char str_array[][N])
{
char (*p)[N], (*q)[N];
char i, j, k;

for(i = 0; i < M; i++)
{
p = q = str_array;
j = 0;
while(*(p[i]+j))
{
j++;
}
j--;
k = 0;
if((p[i]+j) > q[i])
{
*(p[i]+j) ^= *(q[i]+k);
*(q[i]+k) ^= *(p[i]+j);
*(p[i]+j) ^= *(q[i]+k);
j--;
k++;

}

}
}

程序运行结果:
[email protected]:/mnt/hgfs/source test/test# gcc text7.c
[email protected]:/mnt/hgfs/source test/test# ./a.out
hello every one
oellh yvere eno
[email protected]:/mnt/hgfs/source test/test#

将二维数组整体向右移动一列,并将最后一列放到原来第一列的位置:

#include <stdio.h>

#define M 2
#define N 3

int main(char argc,const char * * argv)
{
int array[M][N] = {1,4,6,8,10,12};
int i, j, temp;

for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
{
printf("%d\t",array[i][j]);
}
putchar(‘\n‘);
}

for(i = 0; i < M; i++)
{
temp = array[i][N-1];

for(j = N-1; j > 0; j--)
{
array[i][j] = array[i][j-1];
}
array[i][0] = temp;
}

for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
{
printf("%d\t",array[i][j]);
}
putchar(‘\n‘);
}
}

程序执行效果:
[email protected]:/mnt/hgfs/source test/test# gcc text5.c
[email protected]:/mnt/hgfs/source test/test# ./a.out
1 4 6
8 10 12
6 1 4
12 8 10
[email protected]:/mnt/hgfs/source test/test# ^C

杨辉三角:

#include <stdio.h>

#define M 10 //控制杨辉三角长度

int main(char argc,const char * * argv)
{
int i, j;
int a[M][M];

printf("\n");

for(i = 0; i < M; i++)
{
a[i][0] = 1;
a[i][i] = 1;
}

for(i = 2; i < M; i++)
{
for(j = 1; j < i; j++)
{
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}

for(i = 0; i < M; i++)
{
for(j = 0; j <= i; j++)
{
printf("%5d",a[i][j]);
}
putchar(‘\n‘);
}
return 0;

}

[email protected]:/mnt/hgfs/source test/test# gcc text4.c
[email protected]:/mnt/hgfs/source test/test# ./a.out

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
[email protected]:/mnt/hgfs/source test/test#

今天Linux系统基础知识学完了,相比前两天,今天接触到的新内容比较少,分析了一些数组的程序,还是很有收获的,上面的几个程序也是很好玩的
这两天也开始为毕业论文了,基于DSP的交流伺服系统的设计,认真的看完一段电机的三闭环控制和矢量控制技术后,难度级别比我想象的要大,
现在培训嵌入式,自学PCB设计,加上要做毕业论文,感觉时间挺紧的,换个角度想,这个毕业论文我要是能很好的做出来,对我在强电方便的知识扩展
还是很不错的,hold住,hold住!!!

**********************************************************************************************************************************************************
**********************************************************************************************************************************************************
**********************************************************************************************************************************************************

时间: 2024-10-12 11:56:57

Makefile总结和反序字符数组,整体右移数组,杨辉三角!的相关文章

采用一维数组输出等腰三角形的杨辉三角

采用一维数组输出等腰三角形的杨辉三角 心得体会: 在网上查询了杨辉三角的方法,刚开始用在程序中直接定义n的方式输出杨辉三角,后来查询到从键盘输入n的方法,在调试程序时有很多错误的地方,如数组未定义等问题. 原文地址:https://www.cnblogs.com/wlyxjj/p/10630796.html

Java的二维数组的应用及杨辉三角的编写

(1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个,即该位置上的元素在该行上最大,在该列上最小(注:一个二维数组也可能没有这样的鞍点). /** * * @author liuhui *@version Java上机实验三 *@time 2016.10.30 */ public class javatest2 { public static int

采用两个一维数组输出等腰三角形的杨辉三角

代码如下: package 杨辉三角; import java.util.Scanner; public class 杨辉三角0 { public static void main(String[] args) { Scanner a = new Scanner(System.in); System.out.print("输入杨辉三角的行数n:"); int n=a.nextInt(); int[] b=new int[100]; //创建整形数组,最大可存放100个整形 int[]

实验四:采用一维数组输出等腰三角形的杨辉三角

package yanghuisanjiao; import java.util.Scanner; public class yiweishuzu {public static void main(String[] args) { @SuppressWarnings("resource")Scanner scanner = new Scanner(System.in);int n=scanner.nextInt();int i,j,k; int a[]=new int[100];int

数组-02. 打印杨辉三角(20)

1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 int main(){ 5 int a[10][10]; 6 int i,j,n; 7 cin>>n; 8 for(i=0;i<n;++i){ 9 a[i][0]=1; 10 a[i][i]=1; 11 } 12 for(i=2;i<n;++i) 13 for(j=1;j<i;j++) 14 a[i][j]=a[i-1][

leetCode 118. Pascal&#39;s Triangle 数组 (杨辉三角)

118. Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [      [1],     [1,1],    [1,2,1],   [1,3,3,1],  [1,4,6,4,1] ] 题目大意: 输入行数,输出如上图所示的数组.(杨辉三角) 思路: 用双vector来处理当前行和下一行. 代码如下: cla

用二维数组打印出杨辉三角

用二维数组打印出杨辉三角 首先你得知道二位数组和熟练二位数组,再次你得知道杨辉三角的规律! 相信能知道这个的,你已经掉了半只脚在这个坑了,不说废话直接上... 针对Javascript掌握基础的: 在电脑输入cmd命令打开控制器先要创建node'.js的环境: 你得把这个文件夹和你的js文件放在一起! js代码如下: 1 let readline = require("readline-sync"); 2 console.log("请输入杨辉三角的行数:"); 3

(LeetCode)Pascal&#39;s Triangle II --- 杨辉三角进阶(滚动数组思想)

Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? Subscribe to see which companies asked this question 解题分析: 此处有空间的限制,因此不能正

yanghui杨辉三角--(一维数组)探索1 2

探索1 #include <iostream>#define N 15using namespace std;int a[N]={1};void yanghui(int n){ int i,j; for(i=0;i<n;i++)    {   for(j=0;j<=i;j++) cout<<a[j]<<" ";                       cout<<"\n";       for(j=1;