您的位置:首页 > 编程语言 > C语言/C++

C语言培训_010

2016-07-22 10:55 218 查看

函数

  为了方便思考,把大任务划分成一个个小的可以完成的任务。C语言的程序就是一个个函数组成的。通常包含主函数。
  函数值是传递过去的,并不能改变数据本身。
  函数的类型要和返回值一致。
#include"stdio.h"
#include"stdbool.h"
void a(int b,int c)//空类型函数,参数为两个 int 型。
{
printf("%d,%d\n",a,b);
}

int b(void)//void 可以不写。
{
return 1;
}

bool c(int n)//bool 型函数。
{
bool b=true;
for(int i=2;i<n/2;i++)
{
if(n%i==0)
{
b=false;
break;
}
}
return b;
}

double d(double a)//double 型函数。
{
a+=1.5;
return a;
}

int main()
{
double x=0;
printf("%d\n",d(x));
printf("%d\n",x);// x 依然为 0 . 因为是把 x 的值传入函数,并非改变 x。

double y=0;
y=d(y);//把 y 的值传入函数,再把得到的值赋给y。

return 0;
}

函数操控数据

  参数传递无法给改变原来的函数值。但是如果需要改变,可以用数据的地址来操控。地址就是数据在内存中存储的位置。地址一般是数据前加上‘&’符号。

#include"stdio.h"

//声明某数据为指针,一般是 类型后加 ‘*’,如 int* a,意思是 a 是一个 int 型指针。
//具体数据前加 “&”,表示该数据的地址。 如 int k=0; &k 就是 k 的地址。
//指针前加 *,表示 该指针指向的数据。 如 int *a, a是地址。 (*a)是数据

//数组的指针和地址,int b[100],定义100个 int 型数据。
//此时 b 就表示首地址,即 b[0] 的地址。
// b+1,表示 b[1] 地址。即首地址偏移 1个单位后的地址。
// b+99,表示 b[99] 的地址。即首地址偏移 99 个单位后的地址。
// *(b+99) ,表示 b[99].即 首地址偏移 99个单位后的地址所存的数据。
void change(int *a,int x)//此函数的意思是让输入值扩大 x 。
{
//此时 a 就表示地址。a 为 int* 型,或者说是 int 型的指针。
// 指针前加 *,表示 该指针指向的具体数据。
*a=*a+x;// a 指向的具体数据 被赋值为 ( a 指向的具体数据加上 x)
}

int main()
{
int a=0;// a 为 int 型数据。
printf("a的地址为:%#x\n",&a);//数据前加 “&”,表示该数据的地址。
change(&a,100);// 此时 第一个参数表示 a 在内存中的地址。
//再打印 a 的地址看看。
printf("a的地址为:%#x\n",&a);

//再打印 a,看看值是怎么改变的。
printf("%d\n",a);//这里 a 的值被改变了。是通过地址来操控的。

return 0;
}


递归的再次研究

斐波那契数列:(用递归函数求)(输入值要小,因为递归很浪费电脑资源,40多项就求要很久了)
#include"stdio.h"
int fbnq(int x)
{
if(x==1||x==2)
{
return 1;
}
else
{
return fbnq(x-1)+fbnq(x-2);
}
}

int main()
{
int n;
printf("输入要求斐波那契的第几项:\n");
scanf("%d",&n);
printf("斐波那契地 %d 项为 %d \n",n,fbnq(n));
return 0;
}
斐波那契数列(不用递归,5个一行的输出前50 项)
#include"stdio.h"

int main()
{
long long int a[50];//定义 50 个 int 型数据
a[0]=1;
a[1]=1;
for(int i=2;i<50;i++)
{
a[i]=a[i-1]+a[i-2];
}
for(int i=0;i<50;i++)
{
if(i%5==0)
{
printf("\n");
}
printf("%10lld\t",a[i]);
}

return 0;
}



汉诺塔进阶

算法的介绍

   算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制
算法有分治,递归,贪心等。以后都会培训到。

几个算法问题

第一题:

203879 * 203879 = 41566646641

203879是6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

具有这样特点的6位数还有一个,请你找出它!

归纳一下筛选要求:

1.6位正整数

2.每个数位上的数字不同

3.其平方数的每个数位不含原数字的任何组成数位

4.答案是一个6位的正整数(639172)

第二题

超市的标价牌倒着贴会导致赔钱和赚钱(6会被误认为9,且数据会整体倒过来,0不能作为末位数)
如8811被误认为1188,699被看成669.
某超市贴反两个四位数的标价牌,第一个多赚200多,第二个少赚800多。综合起来多赚558元。
求少赚钱的那个标价(9088元)

字符串函数 #include"string.h"

strcpy(地址A,地址B)把B拷贝到A
strcat(地址A,地址B)把B加到A后面,切返回A的地址
strcmp(地址A,地址B)比较两者的ASCII码大小
strlen(地址A)返回字符串长度
atoi(地址A)字符串变成整数
itoa(被转化数A,存放S,要转化的进制B)把A转化成B进制存在字符串S里
sprintf(地址A,格式化控制符,数据)把数据按照控制输入到字符串A中

C语言到C++的过度。

计算机二级的C++训练01

扩展

算法 http://baike.baidu.com/link?url=8kFQLQEroxNcfMlczEtUz8uODQWz8xaz_hjRS776lxzhbjOmYBIpfb4k1tD2Gs_tF0bTess_61njjVrhp_B3X_
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C