C 概念基础讲解1 下载本文

以内的所有阿姆斯特朗数。 输入说明:输入一个数n

输出说明:输出所有的所有阿姆斯特朗数,每行一个数字。

样例输入:1 样例输出:1

5)递推

1538.猴子吃桃问题

题目说明:猴子吃桃问题。猴子摘了一堆桃,第一天吃了一半,还嫌不过瘾,又吃了一个;第二天又吃了剩下的一半零一个;以后每天如此。到第n天,猴子一看只剩下一个了。问最初有多少个桃子? 输入说明:输入一个数n(n<=20) 输出说明:输出最初的桃子个数 样例输入:2 样例输出:4

1539. 斐波那契数列

题目说明:已知斐波那契数列的前几个数分别为0,1,1,2,3,5,……编程求出此数列的第n项。(n由键盘输入)n<=60

输入说明:输入数字n(n<=60)

输出说明:输出斐波那契数列中的第n个数 样例输入:5 样例输出:3

多重循环

百鸡百钱问题。用一百钱买一百只鸡,公鸡一只5钱,母鸡一只3钱,雏鸡3只1钱。问共有多少种买法。

数组、函数、字符与字符串

一、数组

循环用到计算机速度快的特点,但没有用到计算机存储空间大的特点, 1、一维数组

数组变量的声明,与其他变量声明相同,声明时要加上下标,下标必须是一个明确的数值,所以在定义的时候要事先判断出下标的取值范围。 int a[n]; //这种声明是错误的

int a[200]; //下标给出具体值,表示了

a[0],a[1],a[2],…,a[199]共200个整型变量 int n=200;

int a[n]; //可以这样声明

注意:下标变量应为有序数据类型,如integer,不能为double

数组数据的读入、输出与处理通常都通过循环来进行。int i,a[200];

for(i=0;i<200;i++) cin>>a[i]; //用循环读入200个数据到a数组中

for(i=199;i>=0;i--) cout<

例1、输入n(n<100)个同学某门课程的成绩,打印出低于平均分的同学号数与成绩。

【问题分析】 在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来求同学的总分,进而求出平均分。但因为只有读入最后一个同学的分数以后才能求得平均分,且要打印出低于平均分的同学,故必须把n个同学的成绩都保留下来, 然后逐个和平均分比较,把高于平均分的成绩打印出来。如果用简单变量a1,a2,…,an来存放这些数据,可想而知程序要很长且繁。要想如数学中使用下标变量 ai形式表示这n个数,则可以引入下标变量a[i]。这样问题的程序可写为: int i,n,a[101]; double zf,pj; cin>>n;

zf=0; //zf表示总分}

for(i=1;i<=n;i++){ //读入每一个同学的成绩,并累加它到总分 cin>a[i]; zf=zf+a[i]; }

pj=zf/n; //计算平均分 for(i=1;i<=n;i++)

if (a[i]

21

如果第i个同学成绩小于平均分,则输出

例2、输入n(n<100)个数,倒序输出这n个数。

【问题分析】定义一个数组a用以存放输入的n个数, 然后将数组a内容逆序输出。 int main(){

int n,a[100],i; cin>>n;

然后将数组a内容逆序输出。 int main(){

int n,a[100],i; cin>>n;

for(i=0;i>a[i]; for(i=n-1;i>=0;i--){ cout<

一、一维数组讲解

数组变量的声明,与其他变量声明相同,声明时要加上下标,下标必须是一个明确的数值,所以在定义的时候要事先判断出下标的取值范围。 int a[n]; //这种声明是错误的

int a[200]; //下标给出具体值,表示了

a[0],a[1],a[2],…,a[199]共200个整型变量 int n=200;

int a[n]; //可以这样声明

注意:下标变量应为有序数据类型,如integer,不能为double

数组数据的读入、输出与处理通常都通过循环来进行。 int i,a[200];

for(i=0;i<200;i++) cin>>a[i]; //用循环读入200个数据到a数组中

for(i=199;i>=0;i--) cout<

例1、输入n(n<100)个同学某门课程的成绩,打印出低于平均分的同学号数与成绩。

【问题分析】 在解决这个问题时,虽然可以通过读入一个数就累加一个数的办法来求同学的总分,进而求出平均分。但因为只有读入最后一个同学的分数以后才能求得平均分,且要打印出低于平均分的同学,故必须把n个同学的成绩都保留下来, 然后逐个和平均分比较,把高于平均分的成绩打印出来。如果用简单变量a1,a2,…,an来存放这些数据,可想而知程序要很长且繁。要想如数学中使用下标变量 ai形式表示这n个数,则可以引入下标变量a[i]。这样问题的程序可写为: int i,n,a[101]; double zf,pj; cin>>n;

zf=0; //zf表示总分}

for(i=1;i<=n;i++){ //读入每一个同学的成绩,并累加它到总分 cin>a[i]; zf=zf+a[i]; }

pj=zf/n; //计算平均分 for(i=1;i<=n;i++)

if (a[i]

例2、输入n(n<100)个数,倒序输出这n个数。

【问题分析】定义一个数组a用以存放输入的n个数,

for(i=0;i>a[i]; for(i=n-1;i>=0;i--){ cout<

return 0; }

二、C++是由函数构成的,函数是C++的基本模块。有的函数完成某一操作;有的函数计算出一个值。通常,一个函数即能完成某一特定操作,又能计算数值。

为什么要使用函数? 1.避免重复的编程。

2.使程序更加模块化,便于阅读、修改。

说明:1.一个源程序文件由一个或多个函数组成。

2.一个程序必须有且只有一个main( )函数,C++从main( )函数开始执行。

3.从使用角度来说,分标准函数和用户自定义函数;从形式来说,分无参函数和有参函数。

一、无参函数:主调函数并不将数据传给被调函数。主要用于完成某一操作。

格式:类型说明 函数名(){函数体;} #include using namespace std; void print_message ()

{ cout<<\void printstar ()

{ cout<<\int main( )

{ printstar (); print_message (); printstar(); return 0; }

二、有参函数:主调函数和被调函数之间有数据传递。主调函数可以将参数传递给被调函数,被调函数中的结果也可以带回主调函数。

格式:类型说明 函数名(形式参数列表说明){函数体;}

#include using namespace std; int maxx(int x,int y) { int z;

z=(x>y)?x:y; return z; }

int main () { int a,b,c; cin>>a>>b; c=maxx(a,b);

cout<<\ return 0; }

将实际值a,b传给被调函数的参数x,y,计算后得到函数值z返回。

22

1、函数参数和函数的值

形参是被调函数中的变量;实参是主调函数赋给被调函数的特定值。实参可以是常量、变量或复杂的表达式,不管是哪种情况,在调用时实参必须是一个确定的值。 形参与实参类型相同,一一对应。 形参必须要定义类型。 2、函数的返回值

函数的返回值通过return语句获得。函数只能有唯一的返回值。

函数返回值的类型就是函数的类型。 return语句可以是一个表达式,函数先计算表达式后再返回值。

return语句还可以终止函数,并将控制返回到主调函数。

一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。 3、数组名作函数参数

数组名可以作函数的实参和形参,传递的是数组的地址。这样,实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调函数内。

在函数调用时,形参数组并没有另外开辟新的存储单元,而是以实参数组的首地址作为形参数组的首地址。这样形参数组的元素值发生了变化也就使实参数组的元素值发生了变化。

【例如】将数组中的n个数按从小到大输出 void sort(int x[],int n) { int t,i,j;

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

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

if(x[i]>x[j])swap(x[i],x[j]); }

int main( )

{ int i,a[10]={0};

for(i=0;i<10;i++)cin>>a[i]; sort(a,10);//函数调用

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

三、函数的调用

函数调用的方式

1.作为语句: printstar( ); 2.作为表达式: c=max (a,b);

3.作为另一个函数的参数:cout<

【例题】求最大值 1566 【问题描述】已知m=max(a,b,c)/(max(a+b,b,c)*max(a,b,b+c) ),其中max(a,b,c)是求三个数a,b,c的最大值; 【文件输入】输入a,b,c, 中间用空格分开 【文件输出】求m的值(保留三位小数) #include #include using namespace std; int f,g,e,a,b,c;

double m;

int max(int a,int b,int c) { int t; t=a;

if(b>t)t=b; if(c>t)t=c; return t; }

int main()

{ cin>>a>>b>>c; f=max(a,b,c); e=max(a+b,b,c); g=max(a,b,b+c); m=double(f)/(e*g);

cout<

自定义函数

函数是C++程序的基本模块,是构成结构化程序的基本单元,在结构化程序设计中往往将一个较大的程序分为若干个程序模块,每一个模块用来实现一个特定的功能。

函数分为标准库函数和用户自定义函数。 标准库函数:可以在任何程序中使用的公共函数,由C++ 编译器提供。

用户自定义函数:必须按C++要求通过函数定义、函数说明、才能被调用,由用户自定义。

程序从main( )开始,一个函数可以调用其他函数,也可以被其他函数调用。

函数与函数之间通过传递参数和返回值相联系。 1、自定义函数的的一般形式: 类型标识符 函数名(形式参数表) {

函数体 }

说明:函数名—给自定义的函数取的名字。

形式参数表—函数被调用时,接收调用函数传递的实参数。函数体—执行功能的语句块。

函数返回值—通过函数调用获得的函数返回值,其值由return语句返回。

2、函数分类—从函数调用的返回形式看 (1)有返回值型函数

完成指定任务后返回一个值给调用该函数的语句。 (2)void函数

不返回一个值给调用该函数的语句。

函数分类—从函数调用时是否需要传递数据看 (1)有参函数

在调用函数时,在主调函数和被调用函数之间有数据传递,即主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。 (2)无参函数

在调用无参函数时,主调函数并不将数据传送给被调用函数。

3、实例

例1、输入长方形的长和宽,求长方形的面积。 #include

23

using namespace std;

int area(int c, int d){//c,d被称为形式参数 return(c*d); }

int main(){ int s,a,b; cin>>a>>b;

s=area(a,b); //a,b被称为实际参数 cout<

实参的值传给形参后,形参的值在子函数中变化时不会影响实参

例2、根据n值,输出如下图形: * * * * * * * * * * Hello,world!

* * * * * * * * * *

void printMessage(){//定义printMessage() cout<<\输出字符串 }

void printStar(int n){//定义printStar() int i;

for(i=0;i

int main(){//在主程序中调用它们: int n; cin>>n;

printStar(n); //调用printStar() printMessage(); //调用printMessage() printStar(n); }

例3、最小公倍数

int min_multiple(int x,int y) //函数定义 { int i=1; //定义函数中需要的变量 while(x*i%y!=0) i++;

return(x*i); //返回值 }

int main(){

int m, n , min; cin>>m>>n;

min=min_multiple(m,n); //函数调用 cout<

例4、将输入的3个整数从大到小输出。

void swap(int &x,int &y){ //&x,&y被称为是引用参数

int temp;

temp=x; x=y; y=temp; }

int main(){ int a,b,c; cin>>a>>b>>c; if(a

cout<

引用参数调用传递的是变量地址,当x,y值改变时实参会同时改变

4、递归函数

递归函数即自调用函数,即在函数体内有直接或间接地自己调用自己的语句。 例、求n的阶乘

n!=n*(n-1)! (当n>1时) n!=1(当n=0,1时) 下面是求n!的函数

long long fact(int n) { if (n==1) return 1;

else return(n*fact(n-1)); }

由于自调用过程在函数内必须设置某些条件,当条件成立时终止自调用过程,并使程序控制逐步从函数中返回。

递归调用机制是栈数据结构实现的。 函数之间由参数传递和返回值联系。 如:n等于3,则递归调用过程如下; fact(3)=3*fact(2) fact(2)=2*fact(1)

fact(1)时返回值1,再逐层返回:fact(2)=2*1,fact(3)=3*2

三、字符与字符串 字符处理见第四节

字符串相当于是一个字符数组 例如 string c;

c相当于是一个char c[];只是数组的下标范围是根据需要动态扩展的。

例:输入一串字符,将其倒序输出 string c; int i,n; cin>>c;

n=c.length();//c.length()得到字符串长度 for(i=n-1;i>=0;i--)cout<

这种方法仍然不能读入空格和回车,要能处理的话可以用

char c[100]; gets(c); 或者是 string c;

getline(cin,c);

提高题

支持谁?

题目描述:小明和班里的同学都迷上了看电视剧《三国演义》。由于欣赏角度不同,有的同学喜欢曹操,站在魏国一边;有的同学喜欢刘备,站在蜀国一边;有的同学则喜欢孙权,站在吴国一边。大家经常为下一集戏中谁战胜了谁争得面红耳赤。小明心想,到底我们班里喜欢各个国家的各有多少人呢?我来做一个统计调查吧。于是他约定:喜欢曹操的选A,喜欢刘备的选B,喜欢

24