三个菜鸟的C语言问题

作者&投稿:智何 (若有异议请与网页底部的电邮联系)
菜鸟C语言几个小问题~

呵呵
===================================================
针对你所提出的第一个问题:

首先阐明一个名词哈---
“不带参数的宏定义”:
用一个指定的标识符(即名字)来代表一个字符串,正如你上面定义的一样,它的一般形式为
#define 标识符 字符串

在预编译时将所定义的标识符替换成指定字符串的过程称为“宏展开”。


好啦,接下来就来回答你所提出的第一个问题。
对宏的展开只是将程序中的那个标识符直接换为你所指定的内容,而不会进行其他任何处理。具体的说,你在程序中定义了#define b a+40
在进行预处理的时候,直接将语句"c=b*20;"中的b替换为了a+40,请注意,不是(a+40)。所以替换后的语句就变为了:c=a+40*20;
由于乘法运算符的优先级高于加法运算符,所以先计算40*20,为800,再计算a+800,所以c的值为880。
如果你想使计算120*20的话,你需要在这样定义:#define b (a+40)

你的第二个程序是类似的情况,在预处理后NN为3+1*3+1/2
有一点需要注意:在C程序中两个整型变量运算,结果还是整型变量,故1/2=0,所以NN=3+3+0=6。
=======================================================
针对你所提出的第二个问题:
switch(w++)
{
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
如果是switch(0)或者是switch(1)或者是switch(2)或者是switch(3),则共同执行一条语句printf("%d",w++);且只执行一次。
否则什么也不执行。

接下来分析此程序是如何运行的:
for(i=0;i<3;i++)
switch(w++)
{
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
w初值为0

i=0,判断i<3?成立,故进入for的第一次循环
进入switch语句,因为w++的值为0(此时w已自加1,即w=1),
故寻找case 0,故执行printf("%d",w++);输出1,并且w再自加1,w=2。

i++;i=1

此时i=1,判断i<3?成立,故进入第二次for循环,进入switch语句,w++的值为1(此时w已自加1,即w=3),
故寻找case 1,故执行printf("%d",w++);输出3,并且w再自加1,w=4。

i++;

此时i=2,判断i<3?成立,故进入第三次for循环,进入switch语句,w++的值为4(此时w已自加1,即w=5),寻找不到相应的case(),从而退出switch语句。

i++;

此时i=3,判断i<3?不成立,故退出for循环,从而结束整个程序。
综上所述,输出结果为13
=====================================================
针对你所提出的第三个问题:
后来我想了一下,结果在TC中是2,在VC中是4,我用的是VC,运行结果为4。其实输出的是一个整型变量在该编译系统下所分配的存储空间的大小。一个int型变量在TC中占两个字节,在VC中占四个字节。
呵呵 好久没看了。
分析如下:
字符数据在内存中的存储形式是以该字符相应的ASCII码存放的,例如字符'a'的ASCII码是97,在内存中实际上是以该字符的ASCII码(也就是97)的二进制形式存放的,程序在读取的时候认为它是一个整型变量,其值为97。
【所以可以对字符型变量作算术运算,其实就是对它们的ASCII码进行算术运算】

直接用 sizeof'A',sizeof函数就把后面的看作是一个整型变量,计算其所占的字节数。

【呵呵 考点啊 这个题目相当的二级啊 呵呵】

=======================================
希望我的回答能帮助你。

1 main和void main的区别就在前者不需要显式的写出return;而后者需要写出。其实都是没有返回值,无本质区别。
2 声明两个变量记数,循环判断,若是奇数则一个变量加1,若不是奇数则另一个变量加1。最后判断是否是2和1,输出。
3 前驱字符和后继字符就是紧挨这个字符的前后两个字符。比如b的前驱后继是a和c。

1:辉三角形(要求打印出10行)
==============================================================
#include<stdio.h>
main()
{
long i,j,n,k;
scanf("%ld",&n);
for(i=1;i<=n;i++)
{
k=1;
for(j=1;j<i;j++)
{
printf("%ld ",k);
k=k*(i-j)/j;
}
printf("1\n");
}
}

求一个3*3的矩阵对角线元素之合
==========================================================
直接用两个for循环遍历矩阵
然后用if判断在i=j的时候把该元素加到sum里面

3:什么迭代求法,有什么规则。距离用法(例如3次函数)
==========================================================

迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:

一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

具体用法:我没太弄明白你说的3次函数具体是个什么意思

是求f(x)=x^3 这样的函数的结果吗?

如果这样利用迭代的话就是得出迭代公式 就是 f(x)=f(x)*x

用个循环就可以了 这个思路不难

迭代和递归有区别:迭代比递归的效率要高的多 利用内存占用资源也更少

所以写程序时提倡能用迭代来转换的递归都用迭代来代替

4:最小公倍数和最大公约数的求法;
==================================================================

这个用“辗转相除”法就可以了 相信你们老师已经讲过...

1:辉三角形(要求打印出10行)

//vc6下编译通过
//作者:qmroom
//2008-11-2 2:10
//blog:http://blog.csdn.net/qmroom
//Email:qmroom#126.com        #=@

#include <iostream>
#include <vector>
using namespace std;
#define ROW 10    //几排数据

class Element 

public: 
    vector<int>    data; 
    inline void clear(){data.clear();} 
    inline void add(int val){data.push_back(val);}; 
    inline int& operator[](int index){return data[index];} 
}; 

void main() 

    vector<Element> sjx;
    Element ele;
    ele.add(1); 
    sjx.push_back(ele);
    for (int i = 1; i <= ROW; i++) 
    { 
        ele.clear(); 
        ele.add(1); 
        for (int j = 1; j < i; j++) 
        { 
            ele.add(sjx[i-1][j-1] + sjx[i-1][j]); 
        } 
        ele.add(1); 
        sjx.push_back(ele); 
    } 

    //显示数据 
    for (i=0; i <= ROW; i++) 
    { 
        for (int j = 0; j <= i; j++) 
        { 
            cout << sjx[i][j] << " "; 
        } 
        cout << endl; 
    } 
    cin.get(); 
}

2:求一个3*3的矩阵对角线元素之合;

#include <stdio.h> 
#include <string> 
void main() 

    int a[3][3]; 
    int i,j;//i为行j为列 
    int sum=0; 
    int sum1=0; 
    
    //输入 
    for( i=0; i<=2; i++) 
    { 
        for( j=0; j<=2; j++) 
        { 
            printf (" 请输入第%d行第%d列的数:", i+1, j+1); 
            scanf ("%d",&a[i][j]); 
        } 
        printf("\n"); 
    } 
    //求和 
    for( i=0; i<=2; i++) 
    { 
        for( j=0; j<=2; j++) 
        { 
            if(i==j) 
                sum = sum+a[i][j]; 
            if(i+j==2) 
                sum1= sum1+a[i][j]; 
        } 
    } 
    
    //输出和 
    printf ("对角线之和%d\n",sum); 
    
    printf("对角线之和%d\n",sum1);//对角线之和; 
    
    //输出矩阵 
    printf("\n"); 
    printf("矩形如下:\n"); 
    for( i=0; i<=2; i++) 
    { 
        for( j=0; j<=2; j++) 
        { 
            printf("%d ",a[i][j]); 
        } 
        
        printf("\n"); 
    } 
}

3:什么迭代求法,有什么规则。距离用法(例如3次函数) 

迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:

一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

例 1 : 一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到第 12 个月时,该饲养场共有兔子多少只?

分析: 这是一个典型的递推问题。我们不妨假设第 1 个月时兔子的只数为 u 1 ,第 2 个月时兔子的只数为 u 2 ,第 3 个月时兔子的只数为 u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有

u 1 = 1 , u 2 = u 1 + u 1 × 1 = 2 , u 3 = u 2 + u 2 × 1 = 4 ,……

根据这个规律,可以归纳出下面的递推公式:

u n = u n - 1 × 2 (n ≥ 2)

对应 u n 和 u n - 1 ,定义两个迭代变量 y 和 x ,可将上面的递推公式转换成如下迭代关系:

y=x*2

x=y

让计算机对这个迭代关系重复执行 11 次,就可以算出第 12 个月时的兔子数。参考程序如下:

cls

x=1

for i=2 to 12

y=x*2

x=y

next i

print y

end

例 2 : 阿米巴用简单分裂的方式繁殖,它每分裂一次要用 3 分钟。将若干个阿米巴放在一个盛满营养参液的容器内, 45 分钟后容器内充满了阿米巴。已知容器最多可以装阿米巴 2 20 个。试问,开始的时候往容器内放了多少个阿米巴?请编程序算出。

分析: 根据题意,阿米巴每 3 分钟分裂一次,那么从开始的时候将阿米巴放入容器里面,到 45 分钟后充满容器,需要分裂 45/3=15 次。而“容器最多可以装阿米巴 2 20 个”,即阿米巴分裂 15 次以后得到的个数是 2 20 。题目要求我们计算分裂之前的阿米巴数,不妨使用倒推的方法,从第 15 次分裂之后的 2 20 个,倒推出第 15 次分裂之前(即第 14 次分裂之后)的个数,再进一步倒推出第 13 次分裂之后、第 12 次分裂之后、……第 1 次分裂之前的个数。

设第 1 次分裂之前的个数为 x 0 、第 1 次分裂之后的个数为 x 1 、第 2 次分裂之后的个数为 x 2 、……第 15 次分裂之后的个数为 x 15 ,则有

x 14 =x 15 /2 、 x 13 =x 14 /2 、…… x n-1 =x n /2 (n ≥ 1)

因为第 15 次分裂之后的个数 x 15 是已知的,如果定义迭代变量为 x ,则可以将上面的倒推公式转换成如下的迭代公式:

x=x/2 ( x 的初值为第 15 次分裂之后的个数 2 20 )

让这个迭代公式重复执行 15 次,就可以倒推出第 1 次分裂之前的阿米巴个数。因为所需的迭代次数是个确定的值,我们可以使用一个固定次数的循环来实现对迭代过程的控制。参考程序如下:

cls

x=2^20

for i=1 to 15

x=x/2

next i

print x

end

例 3 : 验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1 。如此经过有限次运算后,总可以得到自然数 1 。人们把谷角静夫的这一发现叫做“谷角猜想”。

要求:编写一个程序,由键盘输入一个自然数 n ,把 n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。

分析: 定义迭代变量为 n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时, n=n/2 ;当 n 为奇数时, n=n*3+1 。用 QBASIC 语言把它描述出来就是:

if n 为偶数 then

n=n/2

else

n=n*3+1

end if

这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为: n=1 。参考程序如下:

cls

input "Please input n=";n

do until n=1

if n mod 2=0 then

rem 如果 n 为偶数,则调用迭代公式 n=n/2

n=n/2

print "—";n;

else

n=n*3+1

print "—";n;

end if

loop

end

迭代法

迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:
(1) 选一个方程的近似根,赋给变量x0;
(2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
(3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为:
【算法】迭代法求方程的根
{ x0=初始近似根;
do {
x1=x0;
x0=g(x1); /*按特定的方程计算新的近似根*/
} while ( fabs(x0-x1)>Epsilon);
printf(“方程的近似根是%f\n”,x0);
}
迭代算法也常用于求方程组的根,令
X=(x0,x1,…,xn-1)
设方程组为:
xi=gi(X) (I=0,1,…,n-1)
则求方程组根的迭代算法可描述如下:
【算法】迭代法求方程组的根
{ for (i=0;i
x=初始近似根;
do {
for (i=0;i
y=x;
for (i=0;i
x=gi(X);
for (delta=0.0,i=0;i
if (fabs(y-x)>delta) delta=fabs(y-x);
} while (delta>Epsilon);
for (i=0;i
printf(“变量x[%d]的近似根是 %f”,I,x);
printf(“\n”);
}
具体使用迭代法求根时应注意以下两种可能发生的情况:
(1) 如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;
(2) 方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。
递归

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。
能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。
【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。
斐波那契数列为:0、1、1、2、3、……,即:
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2) (当n>1时)。
写成递归函数有:
int fib(int n)
{ if (n==0) return 0;
if (n==1) return 1;
if (n>1) return fib(n-1)+fib(n-2);
}
递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n- 2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。
在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。
由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。
【问题】 组合问题
问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为: (1)5、4、3 (2)5、4、2 (3)5、4、1
(4)5、3、2 (5)5、3、1 (6)5、2、1
(7)4、3、2 (8)4、3、1 (9)4、2、1
(10)3、2、1
分析所列的10个组合,可以采用这样的递归思想来考虑求组合函数的算法。设函数为void comb(int m,int k)为找出从自然数1、2、……、m中任取k个数的所有组合。当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m 个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、……、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未去顶组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。细节见以下程序中的函数comb。
【程序】
# include
# define MAXN 100
int a[MAXN];
void comb(int m,int k)
{ int i,j;
for (i=m;i>=k;i--)
{ a[k]=i;
if (k>1)
comb(i-1,k-1);
else
{ for (j=a[0];j>0;j--)
printf(“%4d”,a[j]);
printf(“\n”);
}
}
}

void main()
{ a[0]=3;
comb(5,3);
}
【问题】 背包问题
问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。
设n 件物品的重量分别为w0、w1、…、wn-1,物品的价值分别为v0、v1、…、vn-1。采用递归寻找物品的选择方案。设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option[ ],该方案的总价值存于变量maxv。当前正在考察新方案,其物品选择情况保存于数组cop[ ]。假定当前方案已考虑了前i-1件物品,现在要考虑第i件物品;当前方案已包含的物品的重量之和为tw;至此,若其余物品都选择是可能的话,本方案能达到的总价值的期望值为tv。算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxv大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。
对于第i件物品的选择考虑有两种可能:
(1) 考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续递归去考虑其余物品的选择。
(2) 考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。
按以上思想写出递归算法如下:
try(物品i,当前选择已达到的重量和,本方案可能达到的总价值tv)
{ /*考虑物品i包含在当前方案中的可能性*/
if(包含物品i是可以接受的)
{ 将物品i包含在当前方案中;
if (i
try(i+1,tw+物品i的重量,tv);
else
/*又一个完整方案,因为它比前面的方案好,以它作为最佳方案*/
以当前方案作为临时最佳方案保存;
恢复物品i不包含状态;
}
/*考虑物品i不包含在当前方案中的可能性*/
if (不包含物品i仅是可男考虑的)
if (i
try(i+1,tw,tv-物品i的价值);
else
/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/
以当前方案作为临时最佳方案保存;
}
为了理解上述算法,特举以下实例。设有4件物品,它们的重量和价值见表:
物品 0 1 2 3
重量 5 3 2 1
价值 4 4 3 1

并设限制重量为7。则按以上算法,下图表示找解过程。由图知,一旦找到一个解,算法就进一步找更好的佳。如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。

按上述算法编写函数和程序如下:
【程序】
# include
# define N 100
double limitW,totV,maxV;
int option[N],cop[N];
struct { double weight;
double value;
}a[N];
int n;
void find(int i,double tw,double tv)
{ int k;
/*考虑物品i包含在当前方案中的可能性*/
if (tw+a.weight<=limitW)
{ cop=1;
if (i
else
{ for (k=0;k
option[k]=cop[k];
maxv=tv;
}
cop=0;
}
/*考虑物品i不包含在当前方案中的可能性*/
if (tv-a.value>maxV)
if (i
else
{ for (k=0;k
option[k]=cop[k];
maxv=tv-a.value;
}
}

void main()
{ int k;
double w,v;
printf(“输入物品种数\n”);
scanf((“%d”,&n);
printf(“输入各物品的重量和价值\n”);
for (totv=0.0,k=0;k
{ scanf(“%1f%1f”,&w,&v);
a[k].weight=w;
a[k].value=v;
totV+=V;
}
printf(“输入限制重量\n”);
scanf(“%1f”,&limitV);
maxv=0.0;
for (k=0;k find(0,0.0,totV);
for (k=0;k
if (option[k]) printf(“%4d”,k+1);
printf(“\n总价值为%.2f\n”,maxv);
}
作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。
【程序】

递归的基本概念和特点
程序调用自身的编程技巧称为递归( recursion)。
一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

转:http://zhidao.baidu.com/question/11684451.html?si=3
您还可以参考这里:
http://hi.baidu.com/qmaqswts001/blog/item/98ed354ab9987a2008f7ef74.html

4:最小公倍数和最大公约数的求法;

#include<stdio.h> 

int main()

    long int a,b,d; 
    long int m,n,i,j; 
    double c,h; 
    c=1; 
    scanf("%ld%ld",&m,&n); 
    if(m>=n)
    { 
        b=m; 
        d=n; 
    }
    else
    {
        b=n;
        d=m;
    } 
    
    for(i=1;i<=(b/2);i++)
    {
        if((m%i==0) && (n%i==0) && (m%n!=0) && (n%m!=0))
            c=c*i;
        else if(b%d==0)
            c=d;
    }
    h=(m*n/c);
    printf("%.0lf %.0lf",c,h);
    return 0;
}


请问几个菜鸟级C语言的问题!
1、main函数可以出现在任何位置,其余函数按照main中调用顺序执行。2、函数原型声明就是在调用具体函数之前告诉编译器这个函数的存在,包括函数名、参数个数、参数类型三个信息(所以原型声明中仅仅写明这三个信息即可,如int f(int,int);格式与调用时类似)。声明在不同源文件里可多次出现。函数定义就是...

C语言的一个菜鸟问题
如果你的a为实型 则 a=0.5;

菜鸟C语言几个小问题
首先阐明一个名词哈--- “不带参数的宏定义”:用一个指定的标识符(即名字)来代表一个字符串,正如你上面定义的一样,它的一般形式为 define 标识符 字符串 在预编译时将所定义的标识符替换成指定字符串的过程称为“宏展开”。好啦,接下来就来回答你所提出的第一个问题。对宏的展开只是将程...

菜鸟的c语言问题
当a=17时,a%3=2,%是用来求余数的,17除以3的余数是2,所以a%3==2是真命题,从逻辑上讲,整个a%3==2的值为1,然后a-17为0;||是“或”的意思,“1”和“0”的或为1。

哪位好心的大神帮忙讲下C语言的题,我是一个初学的菜鸟,拜托了
2、因为函数中没有break语句,所以继续执行case 2。执行a++;b++ 此时a=2,b=1;3、输出a和b就是a=2,b=1了 注:1、你要知道,如果判断语句能对应下面的选择语句,那么就要从配对的那句话开始执行,剩下的条件也必须执行完。2、如果执行途中遇到了break,这时才会停止执行。例如:如果本题是...

C语言菜鸟问题
1、数组名作为参数传递,就是把数组的首地址传给形参,等于由定义了一个指针,只想这个地址。第一的代码只是在排序的时候,少写了一层循环,正确如下:include<stdio.h> include<string.h> void paixu(char *name[]);void main(){ int i=0;char *name[5];char string[5][20];printf("请...

C语言菜鸟问题
int a,b,c。如果你前边不加int,那编译器就要问了,你给我的到底什么样的a,b,c呢,你要我怎么在内存中存放呢?举个通俗的例子,就是每个人都有自己的国籍(相当于类型),比如,别人(编译器)问你这是哪的人时,你总不能只告诉人家这就是人,没有国籍。有不明白的可以Hi我:)...

三个菜鸟的C语言问题
1:辉三角形(要求打印出10行)=== include<stdio.h> main(){ long i,j,n,k;scanf("%ld",&n);for(i=1;i<=n;i++){ k=1;for(j=1;j

菜鸟新手请教C语言问题~
1、i++ < 7,成立时循环while。这句话判断的是i<7成立否,判断之后才运行i++,因为自增的优先级低于比较运输符。2、p[i] % 2,对2取余不为0时执行if,即奇数时执行if。3、j += p[i],累加。整体分析:这道题利用while循环对数组p进行了遍历,每次循环条件判断结束后进行自增,再对当前...

C语言菜鸟问题
...1. &是取地址的意思 取变量在内存中的地址 找到它 然后把值赋给它 2. i=%d j=%d 2个 %d 和后面的变量对应 是整型 i= 和 j= 是显示出来给你看的 好让你知道 把值赋给谁了 scanf("i=%d,j=%d",&i,&j);键盘上输入:i=10,j=20 3. 你自己看错了 ...

永泰县13336941287: C语言的菜鸟级问题
栾韩科素: break可以用在循环和switch语句,continue只用于循环. break是跳出块,continue只是这一次不做而已. 举个例子: for(i=0;i<10;i++) 如果循环体里面是break,那循环执行了一次就跳出了,如果是continue,则循环执行10次,只是continue后面的语句不执行罢了.

永泰县13336941287: 超菜鸟级问题求abc三个数中的最大数用c语言 -
栾韩科素: 展开全部#include void main() { int a,b,c,max; /*定义下几个数*/ printf("enter a,b,c:"); /*打印一个提示*/ scanf("%d%d%d",%a,%b,%c); /*输入3个数*/ max=max(max(a,b),c); /*这里套一个MAX函数,先比较1和2大小,再和3比较*/ printf("...

永泰县13336941287: 菜鸟级的C语言问题 -
栾韩科素: 呵呵,只是上一个程序,for循环体不对,改成下面这样的就对了:main() { float k1=0,k2=0,k3=0; int i; float c=0,b=0; for(i=1;i<=100;i++) k1=k1+i; for(i=1;i<=50;i++) {b=i*i; k2=k2+b; } for(i=1;i<=10;i++) { c=1/i; k3=k3+c;} printf("%f",k1+k2+k3); } 你可以试一试

永泰县13336941287: 请回答菜鸟一些C语言问题.请详细解释 -
栾韩科素: 请回答菜鸟一些C语言问题.请详细解释 悬赏分:0 - 离问题结束还有 14 天 23 小时 下列程序段运行后,x的值是【 】 a=1;b=2;x=0; if(!(--a))x--;//如果--a值再取非的值为真,那么x-- if(!b)x=7;//如果b的值大于0,那么!b等0;如果b等于0,那么b的值不等于0(可以是任意数,不等于的数(与你定义的类型有关)) else ++x;//++x 等于 x = x+1 A.0 B.3 C.6 D.7 其中(--a)是a = a -1

永泰县13336941287: C语言菜鸟问题
栾韩科素: 不会,warning,警告,一般是不会出问题 比如你定义了int i;结果整个程序下来都没用到 i; 有时 mian()前面没加void 也会出现warning,呵呵 加油!!!

永泰县13336941287: C语言菜鸟问题(13)
栾韩科素: 你你你…… 运行结果: a回车 a b回车; b cdef回车 c 解释: getchar() 是输入一个字符; putchar() 输出一个字符; 比如putchar(c) 就是输出c,可是c是个变量,即输出c的变量的值…… 再说那个循环,k=0开始知道k=5,一共六次. 回车意...

永泰县13336941287: C语言的菜鸟问题...表达清楚的进!大家速度啊!!
栾韩科素: if(a=5)相当于a=5;if(a);这个条件是永远成立的.if条件中要么是真,要么是假.C语言中0表示假,非0表示真,a的值是非0,这个条件就永远成立,if(a)就与if(5)、if(1)、if(10000)等价,只要条件里的不为0就是真,它就成立!

永泰县13336941287: C语言菜鸟问题 -
栾韩科素: 你调用的这句sort( &aa[3], 5) ;明显是只对4,5,6,7,8这几个元素进行排序嘛 所以结果应该是1,2,3,8,7,6,5,4,9,10, 改成sort( &aa[0], 10)就行了

永泰县13336941287: C语言菜鸟问题
栾韩科素: 根据ASCII码判断的... 你给出的代码中是直接和小写字母a和z进行比较..在ASCII码表中a到z是依次排列的也就是说ASCII码必须要在a到z之间才是小写字母, 这两个条件都满足才为真, 输出1, 如果任中一个不符合, 那么就不是小写字母了

永泰县13336941287: 菜鸟的c语言问题
栾韩科素: #define ReadFlash(adress) (*((volatile INT16U *)(adress<<1))) 这是一个带参宏定义,一般写在程序的开头. 它表示在下面的程序中 出现的ReadFlash(adress)的地方全部用(*((volatile INT16U *)(adress<<1)))进行替换,其中adress是参...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网