㈠ C语言算法设计主要需要掌握哪些
你如果只问C语言的话,它与其他语言最大的不同就是指针了,很多针对C语言的算法都会用到它,每种语言虽然大体相同但都有独特之处的。我们老师常说:
不懂指针的人,就等于不会C/C++
不懂委托、引用的人,就等于不会C#
除此之外就是算法设计的共同基础了,像楼上所说的,
你需要熟悉各种数据结构的特性,才能在设计你的算法时用最适合的方法
你需要熟悉各种变量的结构,C语言是可以手动管理内存的,灵活掌握物理地址与逻辑地址对C语言算法设计很有帮助
你需要熟悉各种循环控制结构,这才是程序的真谛,让计算机代替人完成重复性的工作,而算法就是教机器该如何这样做的命令集
㈡ 编程——C语言与算法
#请回答,你的年度知识点#
C语言是国际上广泛使用的一种计算机语言,它适合作为系统描述语言,既可以用来编写系统软件,又可以用来编写应用软件。C语言从发布之日起就得到了广泛传播,为大多数程序员所接受,C语言使用率也一直在编程语言排行榜中稳居前三位,因此学习C语言前景也是非常可观的。
一个程序通常包含算法、数据结构、程序设计方法及语言工具和环境4个方面,其中,算法是核心,算法就是解决“做什么”和“如何做”的问题。算法与程序设计以及数据结构密切相关,是解决一个问题的完整的步骤描述,是解决问题的策略、规则、方法,是求解特定问题的一组有限的操作序列。比如建造一栋楼之前,要先在图纸上绘出其构造图,算法就是在编写程序前先整理出基本思路。算法的描述形式有很多种,如传统流程图、结构化流程图及计算机程序语言等。
一个程序应该包括对数据的描述和对数据的操作。其中,对数据的描述是指在程序中要指定数据结构,即数据的类型和数据的组织形式;对数据的操作也就是对数据进行操作的步骤,即算法。 着名的计算机科学家沃思(Nikiklaus Wirth)曾经提出过一个公式: 算法+数据结构=程序 随着时代的发展以及计算机技术的进步,这个公式已经不够准确了。
实际上,一个程序还应该包括采用一种程序设计方法进行程序设计并用计算机语言描述,经常采用的是结构化的程序设计方法。
算法一般可以分为两大类,一类是解决科学与工程计算方面的算法,如求解数值积分、微分方程、线性方程组和代数方程等,这类算法称为数值运算算法;另一类是解决数据处理方面问题的算法,称为非数值运算算法,如各种各样的查找算法、排序算法以及遍历算法等。目前,计算机在非数值运算方面的应用远远超过了在数值运算方面的应用。
㈢ 请设计一个算法C语言C程序C编程(很难)
没看清题目,原来你还要求——每一次的交换必须是上一组两个同学之间的交换,其实用递归函数递归还是可以的呀!只需要增加一个数组n[4](如果是N个同学之间的交换就设n[N-1]).
deal(l)函数——它只负责找出l号位置该站哪位同学,这名同学只能从上次0~(l-1)位置上已经站好的同学中选择出,并与l位置的同学作交换,(deal(l)函数会把“具体”找l号以下位置应该站哪些同学的任务交由deal(l-1)来处理),直到deal(0)负责0位置该站谁(此时已经结束,0号位置以下已经没同学可与0位置同学作交换了)。
这种思想仍然是递归,也就是回答者: sujie325 所说的思想!
问题的关键是:
对于deal(l)函数,我们必须要保证每一次被交换到l号位置的同学都是不同的,用什么来保证呢?设置一个数组n[4]!
它的作用是:
记录l号位置的同学变动情况(l号位置的同学只能与l号位置以下的同学交换),然后利用以下语句,在0~(l-1)位置中寻找出在n[4]中没有的同学(这名同学的位置是k),然后把此同学交换到l号位置。另外也不要忘记把l号位置的同学记录到n[]数组中!!
============================================================================
for(k=0;k<l;k++)
{ flagy=1;
for(n_i=0;n_i<=n_p;n_i++)
{
if(b[ml][k]==n[n_i])
{flagy=0;break;}
}
if(flagy)
{break;}
}
n[++n_p]=b[ml][l];
b[m][l]=b[ml][k],b[m][k]=b[ml][l];/*第k号位置处的同学与第l号位置的同学交换位置*/
==================================================================================
整个程序在如下:
#include<stdio.h>
#define N 5
int b[120][N]={1,2,3,4,5};
int m=0;
int deal(int l)
{int i,j;
int ml;
int n[4]={0};
int n_p=-1,n_i,n_j;
int k=0;
int flagy;
if(l==0)
return ++m;
deal(l-1);
for(i=0;i<l;i++)
{ ml=m-1;
for(j=0;j<5;j++)
{
b[m][j]=b[ml][j];
}
for(k=0;k<l;k++)
{ flagy=1;
for(n_i=0;n_i<=n_p;n_i++)
{
if(b[ml][k]==n[n_i])
{flagy=0;break;}
}
if(flagy)
{break;}
}
n[++n_p]=b[ml][l];
b[m][l]=b[ml][k],b[m][k]=b[ml][l];/*第k号位置处的同学与第l号位置的同学交
换位置*/
deal(l-1);
}
}
void main()
{
int l=N-1;int i,j;unsigned char pause=0x80;
deal(l);
for(i=0;i<120;i++)
{if((pause=pause>>1)==0)
{getchar();pause=0x80;}
for(j=4;j>=0;j--)
printf("%d ",b[i][j]);
printf("\n");
}
printf("It has %d categorys in total!\n",m);
}
=====================================================================================
上次的程序(只找出120种组合情况)
#include<stdio.h>
int b[120][5]={1,2,3,4,5};
int m=0;
int deal(int l)
{int i,j;
int ml=m;
if(l==0)
return ++m;
deal(l-1);
for(i=0;i<l;i++)
{
for(j=0;j<5;j++)
{
b[m][j]=b[ml][j];
}
b[m][l]=b[ml][i],b[m][i]=b[ml][l];/*第i号同学与l号同学交换位置*/
deal(l-1);
}
}
void main()
{
int l=4;int i,j;char c=0x10;
deal(l);
for(i=0;i<120;i++)
{if((c=c>>1)==1)/*由于数据组合种类很多,这条if语句实现的是显示暂停(getchar())*/
{getchar();c=0x10;}
for(j=4;j>=0;j--)/*输出组合*/
printf("%d ",b[i][j]);
printf("\n");
}
printf("the m is %d\n",m);
}
㈣ 排序算法的设计(c语言)根据程序画流程图及对每句程序加注释
#include "stdio.h"//标准io头文件
#include "stdlib.h"//库文件
#include "time.h"//时间系头文件
#define N0 100000 //定义常量
typedef int keytype; //类型命名
typedef struct node //定义结构体
{ keytype key; //只是类型命名成keytype,其实就是int的
}Etp;//结构体类型叫做Etp
Etp R[N0+1]; // R[1]..R[n] //定义数组
int n=50, count;//全局变量
void readData( Etp R[], int n)//读数据的函数
{ int i;
count=0;
srand( time( NULL ));//初始化时间种子
for( i=1; i<=n; i++) //对数组初始化
R[i].key=1000+
(int)((9999.0-1000)*rand()/RAND_MAX); // 0..RAND_MAX
}
void printData( Etp R[], int n )//打印显示数据的函数
{ int i;
for( i=1; i<=n; i++)
printf("%8d%s", //格式化显示数组的数据
R[i].key, i%5==0?"\n":"");
printf("\ncount=%d\n", count);
}
void bubberSort( Etp R[], int n )//冒泡排序的函数
{ int i,j;//(这个函数块就是冒泡排序的算法程序)
bool swap;
for( i=1; i<=n-1; i++)
{ swap=false;
for( j=1; j<=n-i; j++)
if( count++,R[j].key>R[j+1].key )
{ R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];
swap=true;
}
if( !swap ) break;
}
}
void bubberSort1( Etp R[], int n )//这个也是另一个冒泡排序的函数
{ int j;//跟上面不同的是这个算法用的是递归的方式,上面的是非递归的
for( j=1; j<=n-1; j++)
if( count++,R[j].key>R[j+1].key )
{ R[0]=R[j];
R[j]=R[j+1];//________;//就是两个变量交换值
R[j+1]=R[0];
}
if( n>1 ) bubberSort1( R, n-1); //___________;//递归调用
}
void selectSort( Etp R[], int n )//这个是选择排序
{ int i,j,k;//(这个函数块就是选择排序的算法程序)
for( i=1; i<=n-1; i++)
{
k=i;
for( j=i+1; j<=n; j++)
if( count++,R[j].key<R[k].key ) k=j;
if( k!=i )
{ R[0]=R[i];
R[i]=R[k];
R[k]=R[0];
}
}
}
void insertSort( Etp R[], int n )//这个是插入排序
{ int i,j;
for( i=2; i<=n; i++)
{
R[0]=R[i];
j=i-1;
while( count++,R[j].key>R[0].key ) R[j+1]=R[j--];
R[j+1]=R[0];
count++;
}
}
void sift( Etp R[], int i, int m)//堆排序中的步骤
{ int k=2*i;
R[0]=R[i];
while( k<=m )
{ if( count++, k+1<=m && R[k+1].key>R[k].key) k++;
if( count++,R[0].key<R[k].key ) R[i]=R[k];
else break;
i=k;
k=2*i;
}
R[i]=R[0];
}
void heapSort( Etp R[], int n )//这个是堆排序
{ int j;
for( j=n/2; j>=1; j--) sift( R, j, n);
for( j=n; j>=2; j--)
{ R[0]=R[1];
R[1]=R[j];
R[j]=R[0];
sift( R, 1, j-1 );
}
}
int main()//主函数的进入口
{
readData( R, n );//读取数据
bubberSort1( R, n );//调用递归冒泡排序
printData( R, n);//显示数据
readData( R, n );//读取数据
selectSort( R, n );//调用选择排序
printData( R, n);//显示数据
readData( R, n );//读取数据
insertSort( R, n );//调用插入排序
printData( R, n);//显示数据
readData( R, n );//读取数据
heapSort( R, n );//调用堆排序
printData( R, n);//显示数据
return 0;
}
//诶·~注释完我总算看出来了,难道你要我解释各个排序的过程?
//那你还不如直接或者看书,你要是不理解原理是不可能看懂过程的。
//注释也只是语句的解释,但是过程的含义是无法描述的
㈤ 设计算法,并用c语言实现。
#include<stdio.h>
intchange(intamount,intindex,intconstcoins[]){
if(amount==0)return1;
if(index<=0)return0;
for(inti=amount/coins[index-1];i>=0;--i){
if(change(amount-i*coins[index-1],index-1,coins)){
if(i)
printf("%d*%d",i,coins[index-1]);
return1;
}
}
return0;
}
intmain()
{
intcoins[]={20,50};
intconstsize=sizeof(coins)/sizeof(int);
intamount;
for(inti=0;i<size;++i){
for(intj=i+1;j<size;++j){
if(coins[i]>coins[j]){
inttemporary=coins[i];
coins[i]=coins[j];
coins[j]=temporary;
}
}
}
if(coins[0]<=0){
printf("数据有误,零钱必须大于0 ");
return-1;
}
printf("请输入要兑换的货币金额:");
scanf("%d",&amount);
if(change(amount,size,coins))
printf(" 兑换成功 ");
elseprintf(" 兑换失败 ");
return0;
}
㈥ 设计一个算法,完成一个链表的创建,输入,插入和删除的实现(使用C语言环境)
/* 线性表-链表的操作: 只提供核心语句 */ #include "stdio.h" #include "stdlib.h" #define N 100 typedef int ElemType; /* 链表的存储结构 */ typedef struct LNode{ ElemType data; struct LNode *next; } LNode,*LinkList; /* 链表的基本操作 */ /******* 1.初始化链表 ******/ void InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; } /******* 2.销毁链表 ******/ void DestroyList(LinkList *L) { LinkList p; while(*L!=NULL) { p=*L; *L=(*L)->next; free(p); } } /******* 10.在顺序表第n个位置插入元素e ******/ void ListInsert(LinkList *L, int n, ElemType e) { LinkList p,q,new; int i; q=*L; p=(*L)->next; i=1; while (p!=NULL && i<n) { q=p; p=p->next; i++; } new=(LinkList)malloc(sizeof(LNode)); new->data=e; q->next=new; new->next=p; } /******* 11.删除链表中第n个位置的元素 ******/ void ListDelete(LinkList *L, int n, ElemType *e) { LinkList p,q; int i; q=*L; p=(*L)->next; i=1; while (p!=NULL && i<n) { q=p; p=p->next; i++; } *e=p->data; q->next=p->next; free(p); } /******* 12.遍历链表并输出 ******/ void ListTraverse(LinkList L) { LinkList p; printf("\nList:\t"); p=L->next; while (p!=NULL) { printf("%d\t",p->data); p=p->next; } } /******* A(2).后接法建立顺序链表 ******/ void CreateList2(LinkList *L, ElemType a[], int n) { LinkList p,new; int i; p=*L; for(i=0; i<n; i++) { new=(LinkList)malloc(sizeof(LNode)); new->data=a[i]; p->next=new; p=p->next; } p->next=NULL; } /* 主函数 */ main() { LinkList La; ElemType a[]={1,3,5,7,9},x; InitList(&La);//初始化链表 CreateList2(&La,a,5);//建立链表并用数组赋值 ListTraverse(La);//遍历链表 ListInsert(&La, 3, 100);//第三个位置插入100 ListTraverse(La);//遍历链表 ListDelete(&La,5,&x);//删除第五个元素,用x返回 ListTraverse(La);//遍历链表 DestroyList(&La);//销毁链表 } 真是恭喜您了 我们刚上完这章,以上答案绝对正确简洁