算法教程c
❶ 加拿大pc算法教程
1.三级流水线:其实对于PC = PC +8这个问题很简单,这两个PC其实代表着不同的意义,第一个PC是对于CPU而言,而第二个PC而言是我们通过编译器看到的PC(PC指向程序正在运行的那一条指令),但是对于CPU的PC是永远指向取指那个步,故PC = PC +8。
2.五级流水线; ARM9流水线包括取指(fetch)、译码(decode)、执行(excute)、缓冲/数据(buffer/data)、回写(write-back)寄存器堆。ARM9流水线在译码阶段已经开始读取操作数寄存器,因此译码阶段的PC值和取指阶段的PC值关系为:PC(decode)=PC(fetch)+4。因此执行阶段的PC值和译码阶段的PC值关系为:PC(excute)=PC(decode)+4。
3.对于软中断函数的返回时的PC:如下
ARM Thumb
SWI PC-8 PC-4
xxx 》 PC -4 PC-2 (异常返回将执行这条指令)
yyy PC PC
因此返回指令为: MOV PC , LR
原因:异常是由指令本身引起的,因此内核在计算LR时的PC值并没有被更新。对于ARM状态,因为SWI指令表示将跳到异常处理函数,此时SWI这条指令的PC = PC -8,当进入异常处理函数之前,硬件会自动把PC-4保存到LR寄存器中,所以异常处理函数结束后直接MOV PC, LR就行,就会跳到xxx这一条指令去执行。对于Thumb状态同理。
4.对于IRQ和FIQ中断函数返回时的PC:
ARM Thumb
xxx PC-12 PC-6 (程序在运行这条代码时就产生了中断信号)
yyy 》 PC-8 PC-4 (异常返回将执行这条指令)
zzz PC-4 PC-2
www PC PC
返回指令为: SUBS PC, LR, #4
原因:异常在当前指令执行完成后才会被响应,因此内核在计算LR时的PC值已被更新。对于ARM状态,程序在执行xxx这条指令时,中断信号产生,但是由于中断必须在这一条指令执行完之后才会被响应,执行完后,则此时对于CPU的PC已经指向了www这条指令的取指,在中断函数函数时应该执行yyy这条指令,虽然硬件会把PC-4的值赋值给LR寄存器,但是这是指向zzz这条指令的,所以返回时应该SUBS PC, LR, #4。对于Thumb状态同理。
❷ c语言程序设计视频教程
链接:
C语言程序设计:
❸ 算法教程
强力推荐:
<<算法设计技巧与分析>> 电子工业出版社 作者是沙特人M.H.Alsuwaiyel
这本书是武汉大学计算机学院专业课算法分析使用的教材
找了很多的算法教材觉得 这本写得最清楚 最像人话 容易入门
看完这本再看算法导论 这样比较好
❹ 广度优先搜索C语言算法
它没有固定的写法, 但是大框都差不多, 一定要使用队列, 因为队列的存在可以维护程序按照广度优先的方式进行搜索。即层次遍历
可以给你一份我作过的一个题的代码,大体上就是这个样子
/****************************************************\
*
* Title : Rescue
* From : HDU 1242
* AC Time : 2012.01.12
* Type : 广度优先搜索求最短步数
* Method :从目标结点向回搜索,初始结点有多个
*
\****************************************************/
#include <stdio.h>
#include <string.h>
#define DATASIZE 201
#define QUEUESIZE 65536
typedef struct
{
int x,y;
}CPOINT;
int bfs(char map[][DATASIZE], int n, int m, CPOINT cpa);
int direction[][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int main(void)
{
int m,n,i,j,res;
CPOINT cpa;
char map[DATASIZE][DATASIZE];
freopen("c:\\in.data","r",stdin);
while(scanf("%d%d%*c",&n,&m) != EOF) {
for(i = 0 ; i < n ; i++) {
gets(map[i]);
for(j = 0 ; j < m ; j++) {
if(map[i][j] == 'a') {
cpa.x = i;
cpa.y = j;
}
}
}
res = bfs(map, n, m, cpa);
if(res) {
printf("%d\n",res);
} else {
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
}
return 0;
}
int bfs(char map[][DATASIZE], int n, int m, CPOINT cpa)
{
CPOINT q[QUEUESIZE],u,np;
int vis[DATASIZE][DATASIZE],step[DATASIZE][DATASIZE],i,front,rear,res;
memset(q, 0, sizeof(q));
memset(vis, 0, sizeof(vis));
memset(step, 0, sizeof(step));
front = rear = res = 0;
q[rear++] = cpa;
vis[cpa.x][cpa.y] = 1;
step[cpa.x][cpa.y] = 0;
while(front <= rear) {
u = q[front++];
if(map[u.x][u.y] == 'r') {
res = step[u.x][u.y];
break;
}
for(i = 0 ; i < 4; i++) {
np.x = u.x + direction[i][0];
np.y = u.y + direction[i][1];
if(np.x >= 0 && np.x < n && np.y >= 0 && np.y < m && !vis[np.x][np.y] && map[np.x][np.y] != '#' ) {
vis[np.x][np.y] = 1;
q[rear++] = np;
step[np.x][np.y] = step[u.x][u.y] + 1;
if(map[np.x][np.y] == 'x') {
++step[np.x][np.y];
}
}
}
}
return res;
}
❺ 如何快速入门学习C语言编程
如果是想通过计算机等级考试 就买一本全国计算机等级考试二级试题认真做就可以了 当然也要加强上机实践。
怎样才能学好C语言
第一:C语言语法结构很简洁精妙,写出的程序也很高效,很便于描述算法,大多数的程序员愿意使用C语言去描述算法本身,所以,如果你想在程序设计方面有所建树,就必须去学它。
第二:C语言能够让你深入系统底层,你知道的操作系统,哪一个不是C语言写的?所有的indows, Unix, Linux, Mac, os/2,没有一个里外的,如果你不懂C语言,怎么可能深入到这些操作系统当中去呢?更不要说你去写它们的内核程序了。
第三:很多新型的语言都是衍生自C语言,C++,Java,C#,J#,perl...哪个不是呢?掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it行业,那么就一定要掌握好C语言。
那么究竟怎样学习C语言呢?
1:工欲善其事,必先利其器
这里介绍几个学习C语言必备的东东:
一个开发环境,例如turbo C 2.0,这个曾经占据了DOS时代开发程序的大半个江山。但是现在windows时代,用turbo C有感觉不方面,编辑程序起来很吃力,并且拖放,更没有函数变量自动感应功能,查询参考资料也不方便。建议使用Visual C++,这个东西虽然比较大块头,但是一旦安装好了,用起来很方便。
一本学习教程,现在C语言教材多如牛毛,但推荐大家使用《C语言程序设计》谭浩强主编 第二版 清华大学出版社,此书编写的很适合初学者,并且内容也很精到。
除此以外,现在有很多辅助学习的软件,毕竟现在是Window时代了,学习软件多如牛毛,不象我们当初学习,只有读书做题这么老套。我向大家推荐一个“集成学习环境(C语言)”,里边的知识点总结和例程讲解都非常好,还有题库测试环境,据说有好几千题,甚至还有一个windows下的trubo C,初学者甚至不用装其它的编译器,就可以练习编程了,非常适合初学者。还有一个“C语言学习系统”软件,不过感觉只是一个题库系统,如果你觉得题做的不够,不妨也可以试试。
2:葵花宝典
学习计算机语言最好的方法是什么?答曰:读程序。
没错,读程序是学习C语言入门最快,也是最好的方法。如同我,现在学习新的J#,C#等其他语言,不再是抱着书本逐行啃,而是学习它们的例程。当然,对于没有学过任何计算机语言的初学者,最好还是先阅读教程,学习完每一章,都要认真体会这一章的所有概念,然后不放过这一章中提到的所有例程,然后仔细研读程序,直到每一行都理解了,然后找几个编程题目,最好是和例程类似的或一样的,自己试图写出这段已经读懂的程序,不要以为例程你已经读懂了,你就可以写出和它一样的程序,绝对不一定,不相信你就试一试吧,如果写不出来,也不要着急,回过头来再继续研究例程,想想自己为什么写不出来,然后再去写这段程序,反反复复,直到你手到擒来为止,祝贺你,你快入门了。
3:登峰造极
写程序的最高境界其实就是掌握各种解决问题的手段(数据结构)和解决问题的方法(算法)。
是不是写出底层程序就是程序设计高手呢?非也,写底层程序,无非是掌握了硬件的结构,况且硬件和硬件还不一样,要给一个芯片写驱动程序,无非就是掌握这块芯片的各种寄存器及其组合,然后写值读值,仅此而已。这不过是熟悉一些io函数罢了。那么怎样才算精通程序设计呢?怎样才能精通程序设计呢?举个例子:你面前有10个人,找出一个叫“张三”的人,你该怎么办?第一种方法:直接对这10个人问:“谁叫张三”。第2种方法:你挨个去问“你是不是张三?”,直到问到的这个人就是张三。第三种方法:你去挨个问一个人“你认不认识张三,指给我看”。不要小看这个问题,你说当然会选第一种方法,没错恭喜你答对了,因为这个方法最快,效率最高,但是在程序设计中找到解决问题的最优方法和你用的手段却是考验一个程序员程序设计水平的重要标志,而且是不容易达到的。刚才这个问题类似于数据结构和算法中的:Map数据结构,穷举查找和折半查找。所以掌握好数据结构和一些常用算法,是登峰造极的必然之路。最后给大家推荐严尉敏的《数据结构》清华大学出版社,希望每一个想成为程序设计高手的人研读此书。
编译软件,对于新手来说VC++6.0简单易操作
下载地址
http://hi..com/%D3%A5%DE%C4/blog/item/2a8d0df7180b9b4c342acc5e.html
谭浩强《C程序设计》上机试题可以下载
http://hi..com/%D3%A5%DE%C4/blog/item/1b8c968f649f4e639e2fb49c.html
其他C语言资料参考书,如趣味一百例
http://hi..com/%D3%A5%DE%C4/blog/item/019bcafefade81c2b58f3159.html
基础C视频教程
http://hi..com/%D3%A5%DE%C4/blog/item/31e3eac0cc57f3d738db495f.html
郝斌C语言视频
http://hi..com/%D3%A5%DE%C4/blog/item/df9b5a26c00bc1b84623e894.html
❻ 有关专门讲C语言算法视频教程的有哪些
严蔚敏的算法不错;
❼ 如何使用c语言编程
建议考虑时下火爆的python,python不仅入门简单,灵活高效。更是在人工智能方面应用广泛,对将来大有裨益
❽ 如何掌握算法,要从C语言的基础开始慢慢学习吗!
掌握算法不需要学习C语言,但是算法是为了自动化工作,这样算法才有意义。计算机语言是算法的载体,将算法转换成计算机代码。你也可以学习其他计算机语言,比如python之类的,哪种语言最简单最易学,最能够表述就用哪个。学matlab也行
❾ C语言高精度教程
高 精 度 算 法
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
int an,bn,fa=1,fb=1; /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/
char b1[250], b2[250]; /*纪录需要计算的两个高精度数据 */
void input(int a1[],int a2[]) /*函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/
{
int i,ai=1,bi=1;
scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据 */
an = strlen( b1 ); /*an纪录b1的位数 */
bn = strlen( b2 ); /*bn纪录b2的位数 */
if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号 */
if(b2[0]==45) { bn--; fb=-1;bi=0;}
for (i=0; i<an; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);} /*把字符形数据b1转为整数形数据,同样用数组纪录 */
for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0'; /* 同上 */
return;
}
void addition(int a[],int b[],int q) /*高精度加法运算*/
{
int i,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else k=bn; /*用k纪录结果的最小位数*/
for(i=0;i<k;i++)
{
c[i]=a[i]+b[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
} /*高精度加法运算过程*/
if(c[k]) k++; /*判断最后结果的位数*/
if(fa<0&&q||fa<0) printf("-");
for(i=k-1;i>=0;i--) printf("%d",c[i]); /*输出结果*/
return;
}
return;
}void subtraction(int a[],int b[],int q) /*高精度减法运算*/
{
int i,f=0,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else /*用k纪录结果的最大位数*/
{ k=bn;
for(i=k;a[i]<=b[i]&&i>=0;i--)
if(a[i]<b[i]) f=1; /*f纪录结果符号*/
} if(!f) /*高精度减法运算过程*/
for(i=0;i<k;i++)
{
if(a[i]<b[i])
{ a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
else /*当a<b时的处理*/
for(i=0;i<k;i++)
{
if(b[i]<a[i])
{ b[i+1]--;
b[i]+=10;
}
c[i]=b[i]-a[i];
}
while(!c[k-1]&&k>1) k--; /*判断最后结果的位数*/
if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-"); /*如果f为真是输出负号*/
for(i=k-1;i>=0;i--) printf("%d",c[i]);
return;
}
} void multiplication( int a[], int b[]) /*高精度乘法运算*/
{
int i, j, c[501] = {0},k;
k = an + bn - 1; /*用k纪录结果的最大位数*/
for(i = 0; i < an; i++) /*高精度乘法运算过程*/
for(j = 0;j < bn; j++)
{
c[i+j] = a[i] * b[j] + c[i+j];
c[i+j+1] = c[i+j] / 10 + c[i+j+1];
c[i+j] = c[i+j] % 10;
}
while(!c[k]) k--; /*判断最后结果的位数*/
if(fa*fb<0) printf("-");
for(i = k; i >= 0; i--) printf("%d",c[i]); /*输出结果*/
}
main()
{
int a[250]={0},b[250]={0};
input(a,b);
printf("\n%s+%s=",b1,b2);addition(a,b,0);
printf("\n%s-%s=",b1,b2);subtraction(a,b,0);
printf("\n%s*%s=",b1,b2);multiplication(a,b);
getchar();
}
1、 高精度除以低精度;
算法:按照从高位到低位的顺序,逐位相除。在除到第j位时,该位在接受了来自第j+1位的余数后与除数相除,如果最高位为零,则商的长度减一。源程序如下:
#include <stdio.h>
#define N 500
main()
{
int a[N] = {0}, c[N] = {0};
int i, k, d, b;
char a1[N];
printf("Input 除数:");
scanf("%d", &b);
printf("Input 被除数:");
scanf("%s", a1);
k = strlen(a1);
for(i = 0; i < k; i++) a[i] = a1[k - i - 1] - '0';
d = 0;
for(i = k - 1; i >= 0 ; i--)
{
d = d * 10 + a[i];
c[i] = d / b;
d = d % b;
}
while(c[k - 1] == 0 && k > 1) k--;
printf("商=");
for(i = k - 1; i >= 0; i--) printf("%d", c[i]);
printf("\n余数=%d", d);
} 2、高精度乘以高精度(要求用尽可能少的存储单元);
算法:用数组保存两个高精度数,然后逐位相乘,注意考虑进位和总位数。源程序如下:
#include <stdio.h>
main()
{
int a[240] = {0}, b[240] = {0}, c[480] = {0};
int i, j, ka, kb, k;
char a1[240], b1[240];
gets(a1);
ka = strlen(a1);
gets(b1);
kb = strlen(b1);
k = ka + kb;
for(i = 0; i < ka; i++) a[i] = a1[ka-i-1] - '0';
for(i = 0; i < kb; i++) b[i] = b1[kb-i-1] - '0';
for(i = 0; i < ka; i++)
for(j = 0; j < kb; j++)
{
c[i + j] = c[i + j] + a[i] * b[j];
c[i + j +1] = c[i + j +1] + c[i + j]/10;
c[i + j] = c[i + j] % 10;
}
if(!c[k]) k--;
for(i = k-1; i >= 0; i--) printf("%d", c[i]);
} 3、高精度除以高精度(要求用尽可能少的存储单元);
算法:用计算机模拟手算除法,把除法试商转化为连减。
#include <stdio.h>
#define N 500
int bj(int a[], int b[], int k1, int k2) /*比较大小函数*/
{
int i, t, flag; /*flag作标志位*/
if(k1 < k2)
flag = 0; /*被除数小于除数返回0*/
else if(k1 > k2)
flag = 1; /*被除数大于除数返回1*/
else
{ /*被除数和除数位数相等则逐位进行比较*/
i = k1;
t = 0;
while(t == 0 && i > 0)
{
if(a[i] > b[i]) {t = 1; flag = 1;}
else if(a[i] == b[i]) i--;
else {t = 1; flag = 0;}
}
if(i == 0 && t == 0) flag = 2; /*被除数等于除数返回2*/
}
return flag;
}
int jf(int a[], int b[], int k1, int k2) /*减法运算*/
{
int i, k, d[N];
for(i = 0; i < k2; i++) d[i] = b[i]; /*把除数赋给数组d*/
for(i = k2; i < N; i++) d[i] = 0; /*d数组无数据的高位置0*/
k = k1 - k2 - 1; /*计算减法起始位置*/
if(k < 0) k = 0;
if(k > 0)
{
for(i = k2 - 1; i >= 0; i--) d[i + k] = d[i]; /*移动减数位数与被减数对齐*/
for(i = 0; i < k; i++) d[i] = 0; /*移动后的其余位置0*/
}
for(i = 0; i < k1; i++)
{
if(a[i] >= d[i]) a[i] -= d[i];
else
{
a[i + 1] = a[i + 1] - 1;
a[i] = 10 + a[i] - d[i];
}
}
return k;
}
main()
{
int a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0};
int i, ka, kb, m, t, t1, t2, k, x, kd, kk;
char a1[N], b1[N];
printf("Input 被除数:");
scanf("%s", a1);
ka = strlen(a1);
for(i = 0; i < ka; i++) a[i] = a1[ka - i -1] - '0';
printf("Input 除数:");
scanf("%s", b1);
kb = strlen(b1);
for(i = 0; i < kb; i++) b[i] = b1[kb - i -1] - '0';
kd = ka; /*保存被除数位数 */
t2 = bj(a, b, ka, kb);
m = 0;
do
{
while(a[ka - 1] == 0) ka--;
t = bj(a, b, ka, kb);
if(t >= 1)
{
k = jf(a, b, ka, kb);
c[k]++;
if(k > m) m = k;
t1 = 0;
for(i = k; i <= m; i++)
{
x = c[i] + t1;
c[i] = x % 10;
t1 = x / 10;
}
if(t1 > 0) {m++; c[m] = t1; }
}
}while(t == 1);
if(t2 == 0)
{
printf("商=0");
printf("\n余数=");
for(i = kd - 1; i >= 0; i--) printf("%d", a[i]);
exit(1);
}
if(t2 == 2)
{
printf("商 = 1");
printf("\n余数 = 0");
exit(1);
}
kk = kd;
while(!c[kd - 1]) kd--;
printf("商 = ");
for(i = kd - 1; i >= 0; i--) printf("%d", c[i]);
while(!a[kk]) kk--;
printf("\n余数 = ");
if(kk < 0)
{
printf("0");
exit(1);
}
for(i = kk; i >= 0; i--) printf("%d", a[i]);
}
4、 N!,要求精确到P位(0〈P〈1000〉。
算法:结果用数组a保存,开始时a[0]=1,依次乘以数组中各位,注意进位和数组长度的变化。源程序如下:
#include <stdio.h>
#define M 1000
main()
{
int a[M], i, n, j, flag = 1;
printf("n=");
scanf("%d",&n);
printf("n!=");
a[0] = 1;
for(i = 1; i < M; i++) a[i] = 0;
for(j = 2; j <= n; j++)
{
for(i = 0; i < flag; i++) a[i] *= j;
for(i = 0; i < flag; i++)
if(a[i] >= 10)
{
a[i+1] += a[i]/10;
a[i] = a[i] % 10;
if(i == flag-1) flag++;
}
}
for(j = flag - 1; j >= 0; j--)
printf("%d", a[j]);
}
❿ C语言算法怎么学习
意思就是用C语言写算法,推荐《算法导论》这本书
C语言主要是些驱动和嵌入式的,这些东西对算法要求很高。
学习算法主要要思考,分析。一步一图一代码的去理解算法,最后要动手实现算法,达到真正理解的目的。