C程序设计算法总结举例

时间:2024.3.31

C程序设计算法总结举例

1.顺序结构举例

(该类题目,通常输入一些数据,再通过使用一个或几个数学公式求解,通过赋值表达式得到结果,并输出。包括求三角形面积,相关物体体积,求温度,解二元一次方程组、一元二次方程等)

1-1.求温度转换 华氏-摄氏温度转换公式:c=5/9(f-32)

#include <stdio.h>

main()

{

    float c, f;

    scanf("%f", &f);

    c = 5.0 / 9 *(f - 32);

    //注意:如果写成5/9则结果为零,同种类型变量进行运算结果还是该类型。

    printf("c is : %f", c);

}

1-2.分解一个三位数的每位数字:

a = x / 100 % 10;

b = x / 10 % 10;

c = x % 10;

2.选择结构算法举例

该类题目往往根据输入进行条件判断,得到相应的值或者执行相应的操作,包括:分段函数求值,求最值,判断大小并交换,求分数等级(switch--case,if-else if...),判断闰年,判断一个5位数是否回文数如12321就是回文数,判断一个数字是几位数等)


2-1.分段函数求值

算法关键:

float x, y;

if (x <= 10)

     y = 10;

else   if (x <= 50)   //其含义实质为(x>10&&x<=50)

     y = 10-1.0 / (10-x);

else

      y = 5;

2-2. 求a,b,c,d的最大值

算法之一:

max=a;

if ( max < b)    max = b;

if ( max < c)    max = c;

if ( max < d)    max = d;

2-3.判断一个数是几位数

if ( x >= 1000 )

    n = 4;

else if ( x >= 100 && x <= 999 )

    n = 3;

else if ( x >= 10 && x <= 99 )

    n = 2;

else if ( x >= 1 && x <= 9 )

    n = 1;

2-4.输入一个年份判断是否是闰年。

(闰年是满足下面二者之一:(1)能被4整除,但不能被100整除;(2)能被400整除。)

#include <stdio.h>

main( )

{

    int year;

    scanf( "%d", &year );

    if ( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 )

        printf( "yes" );

    else

        printf( "no" );

}

3.循环结构算法举例

循环结构应用于重复进行多次相同(相近似)的动作。while,do。。。while,for三种结构两层循环结构的使用称为循环嵌套,注意:外层循环变量变化一次,内层循环变量遍历一圈。包括:求最大公约数最小公倍数、求素数、鸡兔同笼、搬砖、百钱百鸡、1+(1+2)+(1+2+3)+(1+2+3+4)+……+(1+2+3+……m)数列求和,求数列前n项、阶乘、打印图形、水仙花数、完数。

3-1.求1000以内内同时被3,5,7整除的所有数

……

i = 1;

while ( i <= 1000 )

{

    if ( i % ( 3 *5 * 7 ) == 0 )

    {

        printf( "  %d", i );

    }

    i = i + 1;

}

3-2.用do...while求n!算法。

……

s = 1;

i = 1; //注意循环变量初始化的位置

do

{

    s = s * i;

    i = i + 1;

} while ( i <= n );

……

3-3.求数列的前n项数问题

已知f1=1,f2=1,f3=1求fn=3×fn-1+2×fn-2+fn-3(此类题以后可以用数组解决)

解决问题的思路类似于所学的非波拉契数列f1=1,f2=1,fn=fn-1+fn-2问题。

例1:求该数列前30项则

……

int f1, f2, f3, i;

f1 = f2 = f3 = 1;

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

{

    printf( "\n%d,%d,%d", f1, f2, f3 );

    f1 = 3 * f3 + 2 * f2 + f1; //此处的f1实际上是新的f4;

    f2 = 3 * f1 + 2 * f3 + f2; //此处的f2实际上是新的f5;

    f3 = 3 * f2 + 2 * f1 + f3; //此处的f3实际上是新的f6。

}

……

例2:求1!+2!+3!+....m!

方法一:运用(n+1)!=n!*(n+1)

s = 0;

t = 1;

for ( n = 1; n <= m; n++ )

{

    t = t * n; //计算1! ,2!,3!

    s = s + t;

}

方法二:采用循环计算n!

s = 0;

for ( n = 1; n <= m; n++ )

{

    t = 1;

    for ( i = 1; i <= n; i++ )

        t = t * i;

    s = s + t;

}

3-4. 求分段函数值 :

        若  n>=20      1!+2!+3!+。。。n!  

        若  20>n>=10   1*2+2*3+3*4+...+n*(n+1)

        若  1<n<10     1的n次方+2的n-1次方。。。+n的1次方

#include <math.h>

...

s = 0;

m = 1;

if ( n > 20 )

for ( i = 1; i <= n; i++ )

{

    m = m * i; // m存放的是每一个阶乘项 1!  2!  3!   4!=3!*4

    s = s + m;

}

else if ( 20 > n && n >= 10 )

    for ( i = 1; i <= n; i++ )

    {

        s = s + i *( i + 1 );       //1*2+ 2*3 +  3*4...

    }

else if ( 10 > n && n > 1 )

    for ( i = 1; i <= n; i++ )

    {

        s = s + pow( i, n - i + 1 ); //pow(x,y)计算x的y次方

    }

...

3-5.求 s=a+aa+aaa+aaaa+a...a(n个a),a,n由键盘输入!。  如输入a=3   n=5  则 s=3+33+333+3333+33333

 ……

k = s = a;

for ( i = 1; i <= n - 1; i++ )

{

    a = a * 10+k; //a的变化趋势 :3,33,333,3333,……

    s = s + a;

}

……

3-6.求1000以内所有完数,所谓完数是指它等于它的所有因子之和比如6是完数因为6=1+2+3

 ……

for ( i = 1; i <= 1000; i++ )

{

    s = 0; //存放每一个i的所有因子之和

    for ( j = 1; j <= i / 2; j++ )

        if ( i % j == 0 )

            s = s + j;

    if ( s == i )

        printf( "%d is wanshu\n ", s );

}          

 

3-7.求100—1000的所有水仙花数,所谓水仙花数是指其各位数字的立方和等于该书本身

如371是水仙花数 3*3*3+7*7*7+1*1*1=371

……

for ( x = 100; x <= 999; x++ )

{

    a = x / 100;

    b = x / 10 % 10;

    c = x % 10;

    if ( a *a * a + b * b * b + c * c * c == x )

        printf( "%d is shuixianhua\n", x );

}

3-8.输入一个整数x,将其分解质因数

 例如:输入1,则显示:12=2*2*3

#include <stdio.h>

void main()

{

    int x, i;

    scanf( "%d", &x );

    i = 2;

    printf( "\n%d=", x );

    while ( i <= x )

    {

        if ( x % i == 0 )

        {

            printf( "%d*", i );

            x = x / i;

        }

        else

        {

            i++;

        }

    }

    printf( "\b " ); //通过退格删除最后一个多余的*号

}

3-9. 输入两个整数x,y,求最大公约数和最小公倍数。

方法1:

for ( i = 1; i <= x; i++ )

    if ( x % i == 0 && y % i == 0 )

    {

        max = i;

    } //max里存放的始终是x,y进行判断过程中遇到的最大公约数

方法2:

for ( i = x; i >= 1; i-- )

if ( x % i == 0 && y % i == 0 )

{

    max = i;

    break;

} //max里是x,y的最大公约数

方法3:辗转相除法

……

r = m % n;

while ( r != 0 )

{

    m = n;

    n = r;

    r = m % n;

}

printf( "zui da gong yue shu :%d", n ); //n为最大公约数

……

3-10.输入人民币钱数x(x,整数),求其可能的所有组合,最小单位为1元。

   如输入 x=5元  则其所有可能组合为:

(1)5张1元   (2)3张1元,1张2元  (3)2张2元,1张1元 (4)1张5元 

//该题参考比对鸡兔同笼问题,搬砖问题,百钱百鸡问题,都是同样的解法

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

  for ( j = 0; j <= x / 2; j++ )

     for ( k = 0; k <= x / 5; k++ )

        for ( a = 0; a <= x / 10; a++ )

           for ( b = 0; b <= x / 20; b++ )

              for ( c = 0; c <= x / 50; c++ )

                 for ( d = 0; d <= x / 100; d++ )

                    if ( i+2*j+5*k+10*a+20*b+50*c+100*d==x )

                    {

printf( "%d,%d,%d,%d,%d,%d,%d",i,j,k,a,b,c,d );

                     }

鸡兔同笼问题:   x+y=h

                2x+4y=f

搬砖问题        x+y+z=36

                5x+2y+z/3=36

3-11.求解方程组      x+2y+3z=100

                     3x-y-z =130

for ( x = 0; x <= 100; x++ )  //三重循环嵌套

    for ( y = 0; y <= 50; y++ )

        for ( z = 0; z <= 33; z++ )

            if ( x + 2 * y + 3 * z == 100 && 3 *x - y - z == 130 )

            {

                printf( "%d%d%d", x, y, z );

            } 

********或者采用如下方式也可*************

for ( x = 0; x <= 100; x++ )    //两重循环嵌套

  for ( y = 0; y <= 50; y++ )

  {

      z = 3 * x - y - 130;

      if ( x + 2 * y + 3 * z == 100 )

      {

          printf( "%d%d%d", x, y, z );

      }

  }

3-12.对于1000以内所有满足条件的x,求表达式的值

(1)若x能同时被3,5,7整除则求  1+2+3+…+x的值

(2)若x是水仙花数,则求  1*1*2*1*2*3*…*1*2*3*...(x/100)

 .................

for ( x = 100; x <= 999; x++ ) //-注意循环嵌套的位置

{

    if ( x % ( 3 *5 * 7 ) == 0 )

    {

        s = 0;

        for ( i = 1; i <= x; i++ )

        {

            s = s + i;

        }

        printf( .... )

    }

    a = x / 100;

    b = x / 10 % 10;

    c = x % 10;

    if ( a *a * a + b * b * b + c * c * c == x )

    {

        s = 1;

        k = 1;

        for ( i = 1; i <= x / 100; i++ )

        {

            k = k * i;

            s = s * k;

        }

        printf.....

    }

}

3-13. 打印图形问题:

思路:两重循环,外层循环控制打印多少行,内层循环分三部分:

(1)前导空格    (2)图形,如每行星号个数      (3)回车换行

如:字母塔

#include <stdio.h>

main()

{

    int i, j;

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

    {

        for ( j = 0; j <= 25-i; j++ )

        {

            printf( " " );

        }

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

        {

            printf( "%c",'A'+j); //j取不同值,'A'+j代表不同字符

        }

        for ( j = i - 1; j >= 0; j-- )

        {

            printf( "%c", 'A' + j );

        }

        printf( "\n" );

    }

}

#include <stdio.h>

main()

{

    int i, j, n;

    scanf( "%d", &n );

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

    {

        for ( j = 0; j < n - i; j++ )

        {

            printf( " " );

        }

        for ( j = 1; j <= 2 *i - 1; j++ )

        {

            printf( "%c", '*' );

        }

        printf( "\n" );

    }

}                                     

4.数组

包括:排序、查找、字符串长度、字符串大小写转换、比较字符串大小、字符串连接、字符串拷贝、数列前n项、统计字符串中单词个数、求数组元素最值、二维数组输入、输出、转置、数字(字符串)逆序输出。数组中统计奇数偶数,二维数组对角线元素,行列元素的相关处理。

4-1排序(选择法、冒泡法)

冒泡法

(1)冒泡法排序算法

将一个数字序列存放在数组中,相邻的两个数进行比较,若前一个数大则交换,...一趟下来最大数必然在最后,然后对于剩下元素反复执行上面操作

#include <stdio.h>

main()

{

    int a[10], i, j, x;

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

        scanf( "%d", &a[i]);

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

        for ( j = 0; j <= 8-i; j++ )

            if ( a[j] > a[j + 1] )

            {

                x = a[j];

                a[j] = a[j + 1];

                a[j + 1] = x;

            }

    printf( "\n" );

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

        printf( "%5d", a[i] );

}

(2)函数冒泡法

编写自定义函数,实现冒泡法排序

#include <stdio.h>

main()

{

    void qipao( int a[] );

    int a[10], i;

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

    {

        scanf( "%d", &a[i] );

    }

    qipao(a);

    printf( "\n" );

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

        printf( "%5d", a[i] );

}

void qipao( int a[] )

{

    int i, j, x;

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

        for ( j = 0; j <= 8-i; j++ )

    if ( a[j] > a[j + 1] )

           {

               x = a[j];

              a[j] = a[j + 1];

              a[j + 1] = x;

         }

}

(3)选择排序算法

将一个数字序列存放在数组中,假设“剩下的序列中第一个元素”为最小值,将其与数组中其它元素进行比较,找到最小值,将该最小值与“剩下的序列中第一个元素”进行交换,最小元素放到剩下序列的第一个位置,反复做这个操作……

#include <stdio.h>

main()

{

    int a[10], i, j, m, x;

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

        scanf( "%d", &a[i] );

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

    {

        m = i;

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

            if ( a[m] > a[j] )

                m = j;

        x = a[m];

        a[m] = a[i];

        a[i] = x;

    }

    printf( "\n" );

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

        printf( "%5d", a[i] );

}

(4)函数选择法排序算法

#include <stdio.h>

main()

{

    void xuanze( int a[] );

    int a[10], i, j;

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

        scanf( "%d", &a[i] );

    xuanze( a );

    printf( "\n" );

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

        printf( "%5d", a[i] );

}

void xuanze( int a[] )

{

    int i, j, x, m;

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

    {

        m = i;

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

            if ( a[m] > a[j] )

                m = j;

        x = a[m];

        a[m] = a[i];

        a[i] = x;

    }

}

4-2查找

顺序查找:数字序列放到数组中,不要求数组元素本身有序,查找x是否在数列中:

……

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

  if(x==a[i]) 

    printf("zhaodaole %d ,%d",x,i+1);

折半查找:1.要求数列必须有序的;2.比较数列中间元素;3.缩小范围,重复2……

4-3数列前n项

若已知 f1=1,f2=2,f3=3, fn=fn-1+3fn-2+fn-3   n>=4,用数组的方法求数列前n项(n由键盘输入)及前n项和。

#include <stdio.h>

main()

{

    int f[100], n, i, s;

    scanf( "%d", &n);

    f[1] = 1, f[2] = 2, f[3] = 3;

    s = f[1] + f[2] + f[3];

    for ( i = 4; i <= n; i++ )

    {

        f[i] = f[i - 1] + 3 * f[i - 2] + f[i - 3];

        s = s + f[i];

        printf( "%5d", f[i] );

    }

    printf( "%5d", s );

}

4-4 输入6个互不相同的正整数,问由这些值作为边长能组成多少个互不相同的三角形?

设每个数在组成三角形时只能使用一次,即不能出现2,2,3这样的三角形。

#include <stdio.h>

main()

{

    int a[6], i, j, k;

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

    {

        scanf( "%d", &a[i] );

    }

    for ( i = 0; i <= 5; i++ )        //重循环遍历所有取值

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

            for ( k = j + 1; k <= 5; k++ )

             if (a[i]+a[j]>a[k]&& a[i]+a[k]>a[j]&&a[j]+a[k] >a[i] )

             {

                    printf( "%d,%d,%d     ", a[i], a[j], a[k] );

             }

}

4-5 输入A[10],(1)求数组中所有值为偶数的元素之和。(2)求数组中所有下标为奇数的元素的乘积。(3)将数组中所有值为3的倍数的数组元素值清零。

#include <stdio.h>

main()

{

    int a[10], i, s = 0, k = 1;

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

    {

        scanf( "%d", &a[i] );

        if ( a[i] % 2 == 0 )

        {

            s += a[i];

        }

        if ( i % 2 == 1 )

        {

            k = k * a[i];

        }

    }

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

    {

        printf( "%4d", a[i] );

    }

    printf( "\n%3d,%3d\n\n", s, k );

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

        if ( a[i] % 3 == 0 )

        {

            a[i] = 0;

        }

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

    {

        printf( "%4d", a[i] );

    }

}

4-6  杨辉三角形

#include <stdio.h>

main()

{

    int a[20][20], i, j;

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

    {

        a[i][0] = 1;

        a[i][i] = 1;

    }

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

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

        {

            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];

        }

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

    {

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

        {

            printf( "%5d", a[i][j] );

        }

        printf( "\n" );

    }

}

4-7二维数组应用综合举例

//本题目为二维数组的各种运算综合

#include <stdio.h>

main()

{

    int a[3][3], i, j, k = 0, m, n, s = 0, max, c = 0, f[3], s1 = 0, b[9];

// 对比給一维数组赋值:for(i=0;i<=9;i++) scanf("%d",&a[i]);

    // 给数组元素键盘赋值

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

        for ( j = 0; j <= 2; j++ )

        {

            scanf( "%d", &a[i][j] );

        }

    //实现二维数组输出为方阵的方法

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

    {

        for ( j = 0; j <= 2; j++ )

        {

            printf( "%4d", a[i][j] );

        }

        printf( "\n" );

        //注意此换行语句的位置:一定要在外层循环内部,内层选环外部

    }

    //转置矩阵的输出

    printf( "\n" );

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

    {

        for ( j = 0; j <= 2; j++ )

        {

            printf( "%4d", a[j][i] );

        }

        printf( "\n" );

    }

    max = a[2][1];

    m = 2, n = 1; //随便假设数组中某个元素为最大值

    //遍历二维数组,挨个比较求最大值

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

    for ( j = 0; j <= 2; j++ )

    {

        s = s + a[i][j]; //顺便求出所有数组元素的和

        if ( max < a[i][j] )

        {

            max = a[i][j];

            m = i, n = j;

        } //m,n存放最大元素下标

    }

    //求对角线元素之和

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

        c = c + a[i][i] + a[i][2-i];

    // a[i][i]为主对角线元素,a[i][2-i]为辅对角线元素

    c = c - a[1][1];

    printf( "\n最大值%3d,下标%d,%d", max, m, n );

    printf( "\n数组和%3d,对角线和%3d", s, c );

    //输出所有列下标大于行下标的数组元素

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

        for ( j = 0; j <= 2; j++ )

            if ( j > i )

            {

                printf( "\n行标: %d,列标: %d,元素: %d", i, j, a[i][j]);

            }

    //数组f里元素均初始化为0

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

        f[i] = 0;

    //求每列元素的和,并将其放入数组f中

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

    {

        for ( j = 0; j <= 2; j++ )

            f[i] = f[i] + a[j][i];

        printf( "列下标为 %d的元素和为: %3d", i, f[i] );

    }

    //求所有能被2,3,5整除的数组元素的平方和

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

    for ( j = 0; j <= 2; j++ )

    {

        if ( a[i][j] % ( 2 *3 * 5 ) == 0 )

            s1 = s1 + a[i][j] *a[i][j];

    }

    printf( "能被2,3,5整除的数组元素的平方和:%5d\n", s1 );

    //将二维数组赋值给一维数组,并输出

    n = 0;

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

    for ( j = 0; j <= 2; j++ )

    {

        b[n] = a[i][j];

        printf( "%5d", b[n] );

        n++;

    }

}

4-8 字符串应用举例

#include <stdio.h>

#include <string.h>

main()

{

    char a[100], b[30], c[4][100];

    int i, j, k;

    //编程序实现gets函数功能如下:

    puts( "请输入字符串a:\n" );

    i = 0;

    while (( a[i] = getchar()) != '\n' )

    {

        i++;

    }

    a[i] = '\0';

    puts( "输入的字符串是:\n" );

    printf( "%s", a );

    //编程序实现strlen函数的功能:

    i = 0;

    while ( a[i] != '\0' )

    {

        i++;

    }

    printf( "%s", "输入的字符串长度是:\n" );

    printf( "%d\n", i );

    //编程序实现strcat函数的功能:

    i = j = 0;

    puts( "请输入字符串b:\n" );

    gets( b );

    while ( a[i] != '\0' )

    {

        i++;

    }

    while ( b[j] != '\0' )

    {

        a[i] = b[j];

        i++;

        j++;

    }

    a[i] = '\0';

    puts( "连接后字符串为:\n" );

    puts( a );

    //编程序实现strcmp函数功能:

    i = 0;

    k = 0;

    puts( "\n请重新输入两个字符串:\n" );

    gets( a );

    gets( b );

    while ( a[i] != '\0' || b[i] != '\0' )

    {

        if ( a[i] > b[i] )

        {

            k = 1;

            break;

        }

        if ( a[i] < b[i] )

        {

            k =  - 1;

            break;

        }

        i++;

    }

    if ( k == 0 )

        printf( "两个字符串相等" );

    else if ( k == 1 )

        printf( "%s 大于 %s\n", a, b );

    else

        printf( "%s 大于 %s\n", b, a );

}

4-9将字符串倒置,下面的代码有什么问题??

main()

{

    char str[14] = "abcedfghijklmn";

    char a[14];

    int i;

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

        a[i] = str[13-i];

    printf( "%s", a );

}

系统运行将会报error C2117: 'abcedfghijklmn' : array bounds overflow错误。

为何报此错误呢?

注意字符串的长度并非是双引号内的字符个数(此题中为14个)而是字符个数加一,此题为15个,这是因为系统自动要在字符串的末尾添加字符'\0'造成的。而题目中存放字符串的字符数组str 和a 定义长度为14,不够存放,所以报错误为下标越界!

可以改为

#include <stdio.h>

main()

{

    char str[15] = "abcedfghijklmn";

    char a[15];

    int i;

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

    {

        a[i] = str[13-i];

    }

    a[i] = '\0';

    printf( "%s", a );

}

4-10关于二维数组的行列,需要注意的一点就是:求类似“行最大”或者“列最大”这样的结果时,需要进行

行最大:遍历该行,即确定行下标后,列下标取所有可能。

列最大:遍历该列,即确定列下标后,行下标取所有可能。

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

{

x[i] = a[i][0]; 

//注意,此时针对下标为i的每行进行处理,请比较下面另一段代码

    for ( j = 1; j < M; j++ )

    if ( x[i] < a[i][j] )

    {

        x[i] = a[i][j];  

//这句话的意思是遍历i行所有元素,求出该行最大值,放入x[i]中

    }

}

for ( j = 0; j < M; j++ )

{

x[j] = a[0][j];  

//注意,此时针对下标为j的每列进行处理,请比较上面另一段代码

    for ( i = 1; i < N; i++ )

    if ( x[j] < a[i][j] )

    {

        x[j] = a[i][j];  

//这句话的意思是遍历j列所有元素,求出该列最大值,放入x[j]中。

    }

}

5.函数

函数的分类:

1、系统函数(库函数)   通过#include 包含相应的头文件,并填写相关的参数实现调用,是系统提供给大家直接使用的。如求x的y次方,即 #include <math.h>  ....程序中有  z=pow(x,y);

2、用户自定义函数

      类型  函数名(形参表列)   -----若形参不存在,表示该函数为无参函数。即: 

类型  函数名()

    {

       函数体;

return 返回值;     ------若无return语句,表明该函数不需要返回值,                                    此时一般函数类型为void,即  void  函数名(形参表列)  

    }

函数的调用:函数定义好之后应该能够使用,这个使用函数的过程称为函数调用。

方法有三:

1、函数语句调用   如: s(x,y);

2、表达式调用     如: z=s(x,y)+1;

3、函数作为其他函数的参数调用  如: printf("%d",s(x,y));

函数的使用注意:若被调用函数在调用函数前面,则调用函数中不需要对被调用函数进行声明,否则需要声明,如:

#include <stdio.h>

int max( int a, int b )

{

    if ( a > b )

        return a;

    else

        return b;

}

//由于max定义在前,main里无需声明

main()

{

    int a, b, z;

    scanf( "%d%d", &a, &b );

    z = max( a, b );

    printf( "max is %d", z );

}

反之:

#include <stdio.h>

main()

{

    int max( int a, int b );

    //函数声明,由于max定义在后,main里需声明!或 int  max(int,int);

    int a, b, z;

    scanf( "%d%d", &a, &b );

    z = max( a, b );

    printf( "max is %d", z );

}

int max( int a, int b )

{

    if ( a > b )    return a;

    else       return b;

}

5-1 编函数实现求a,b,c的最大值和平均值。

#include <stdio.h>

int s1( int x, int y, int z )

{

    int k;

    k = x + y + z;

    return k;

}

float s2( int a, int b, int c )

{

    float k;

    k = ( a + b + c ) / 3.0;

    return ( k );

}

int s3( int a, int b )

{

    int k;

    if ( a > b )

        k = a;

    else

        k = b;

    return k;

}                                   

//由于s1,s2,s3的定义都在调用它们的main函数前,无需声明。

main()

{

    int a, b, c, sum, max;

    float aver;

    scanf( "%d%d%d", &a, &b, &c );

    sum = s1( a, b, c );

    aver = s2( a, b, c );

    max = s3( s3( a, b ), c );

    printf( "sum=%d,aver=%f,max=%d", sum, aver, max );

}

5-2编写函数实现简单图案显示

   ******

  ******

 ******

#include <stdio.h>

void pr()

{

    printf( "   ******\n" );

    printf( "  ******\n ******\n" );

}

main()

{

    pr(); //函数语句调用,该函数无返回值,无参数传递

}

5-3编写函数实现打印

   ****   n行每行n个星号,n由键盘输入,此时,n值为4

  ****

 ****

****

#include <stdio.h>

void pr( int n )

{

    int i, j;

    for ( i = 1; i <= n; i++ )

    //外层循环控制打印多少行,此时根据题意为n行。

    {

        for ( j = n; j >= i; j-- )

        {

            printf( " " );

        }

        //输出每行前导空格

        for ( j = 1; j <= n; j++ )

       //输出为平行四边形,若改为 for(j=1;j<=2*i-1;j++)  输出为正三角形

        {

            printf( "*" );

        }

        //输出每行n个星号

        printf( "\n" );

    }

}

main()

{

    int n;

    scanf( "%d", &n );

    pr( n ); //函数语句调用,该函数无返回值,实参为n

}

5-4编程序实现函数strupr(str)函数的功能:该函数实现小写字母转换为大写字母。

#include <stdio.h>

main()

{

    char a[100];

    void change( char str[] );

    gets( a );

    change( a );

    puts( a );

}

void change( char str[] )

{

    int i = 0;

    while ( str[i] != '\0' )

    {

        if ( str[i] >= 'a' && str[i] <= 'z' )

        {

            str[i] = str[i] - 32;

        }

        i++;

    }

}

5-5编程序实现函数strcat(str1,str2)函数的功能:该函数实现将两个字符串(分别存放于str1,str2中)连接。

#include <stdio.h>

void scat( char a[], char b[] )

{

    int i, j;

    i = j = 0;

    while ( a[i] != '\0' )      //定位字符串a的结尾

        i++;

    }

    while ( b[j] != '\0' )      //实现字符串连接

    {

        a[i] = b[j];

        i++;

        j++;

    }

    a[i] = '\0'; //连接产生的新字符串末尾添加字符串结束标识

}

main()

{

    char a[100], b[30];

    puts( "请输入字符串a,b:\n" );

    gets( a );

    gets( b );

    scat( a, b ); //函数名做为参数

    puts( "连接后字符串为:\n" );

    puts( a );

}

5-6编写函数实现:输入一维数组求数组中元素的最大值,输入a,b,c,d求最小值

#include <stdio.h>

//此例子中求最值分别采用条件表达式和选择结构实现,请仔细比较二者使用方式

int f1( int a, int b )

{

    return a > b ? a : b;

}

int f2( int a, int b )

{

    int c;

    if ( a < b )

        c = a;

    else

        c = b;

    return c;

}

main()

{

    int a, b, c, d, s[10], i, max, min;

    scanf( "%d,%d,%d,%d", &a, &b, &c, &d );

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

        scanf( "%d", &s[i] );

    //以上给a,b,c,d和数组s赋值

    max = f1( f1( f1( a, b ), c ), d );

    min = s[0]; //假设min是数组中任意元素

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

        min = f2( min, s[i] );

    printf( "max is:%3d,  min is :%3d\n", max, min );

}

5-7函数要求掌握的算法实现:

   排序、查找、字符串求长度,连接,复制,比较大小,输入,输出,以及前面讲过的各种算法通过函数调用实现,求素数,求闰年,最大公约、最小公倍数等等。

5-8变量的作用域和生存期

变量的作用域分为:局部变量和全局变量函数。局部变量作用范围是定义它的函数内,全局变量作用范围是从定义点开始到程序结束。

#include <stdio.h>

int s = 3; //s全局变量

int a( int x )

{

    int c = 1, s = 2; //c,s,x局部变量

    return c + s + x; //t不起作用

}

int t = 6; //t全局变量

main()

{

    int x, y; //y,x局部变量

    x = 5;

    y = a( x );

    printf( "%2d,%2d,%2d", s, y, t );

}

变量的生存期:静态变量和动态变量

#include <stdio.h>

int a( int x )

{

    static int c = 0;

    //c静态变量,始终存在;c=0 仅仅执行一次 ,其值保留上次运行结果

    int i = 1; //i动态变量,每次调用分配内存空间,每次都重新赋初始值1

    c++;

    i++;

    return c + i + x;

}

main()

{

    int x, y = 0;

    for ( x = 1; x <= 10; x++ )

        y += a( x );

    printf( "%2d", y );

}

y=c+i+x

y=(1+2+1)+(2+2+2)+(3+2+3)+(4+2+4)+(5+2+5).....+(10+2+10)=130

6编译预处理命令

#include <stdio.h>

#define  n  5+3

....

printf("%5d",n*n);

其结果是?

答案  23    理由:纯粹置换! n*n---5+3*5+3

更多相关推荐:
算法设计与分析学习心得

班级:物联网1201姓名:刘潇学号:1030612129一、实验内容:这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数组,对话框下拉列表,排序问题。二、学习掌握:基本程序描述:(1)…

算法设计与分析学习总结

算法分析与设计学习总结题目算法分析与设计学习总结学院信息科学与工程学院专业届次学生姓名学号二一三年一月十五日算法分析与设计学习总结本学期通过学习算法分析与设计课程了解到算法是一系列解决问题的清晰指令代表着用系统...

算法分析与设计总结

10008148朱凌峰分析与设计总结算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会…

算法设计与分析总结

算法设计与分析总结一算法引论算法通常人们将算法定义为一个有穷的指令集这些指令为解决某一特定的任务规定了一个运算序列什么是算法计算机来解决的某一类问题的方法或步骤算法是程序的核心算法的两个要素算法是由操作与控制结...

算法设计与分析总结

第一章绪论1、重要特性1.输入2.输出3.有穷性4.确定性5.可行性2、描述算法的方法1.自然语言:优点是直观易懂,缺点是容易出现二义性2.流程图:优点是直观易懂,缺点是严密性不如程序设计语言,灵活性不如自然语…

算法设计总结

Lab051000list求最长不减子序列输入有11000000个数数大小范围0109动态规划问题思路开一个数组下标表示出现的次数其值表示其最小值不断递增小于替换前面比它的的数二分查找找出刚刚好比它大的数nlo...

算法设计与分析总结

简答1算法定义算法是一个满足下列条件的计算有穷性终止性有限步内必须停止好算法坏算法确定性每一步都是严格定义和确定的动作要严格算法语言能行性每一个动作都能够被精确地机械执行输入有一个满足给定约束条件的输入输出满足...

算法设计与分析课程的心得体会

算法设计与分析课程的心得体会以最少的成本最快的速度最好的质量开发出合适各种各样应用需求的软件必须遵循软件工程的原则设计出高效率的程序一个高效的程序不仅需要编程技巧更需要合理的数据组织和清晰高效的算法这正是计算机...

算法设计与分析期末总结

算法概述算法性质算法是输入输出有限性确定性若干条指令组成的有穷序列程序可以不符合有限性是算法用某种程序设计语言的具体实现算法复杂性时间复杂性空间负责性O阶数高欧姆阶低h相等O定义存在正的常数C和自然是N0使得当...

软件综合算法设计个人总结

软件综合算法设计个人总结图书借阅管理系统经过近一个星期的努力前后修修改改调试又调试我的C图书管理系统终于得以诞生在这个过程中我发现自己还有很多很多知识都没有学好也感到做出一个好的系统不是一个简单的事情它必须经过...

算法设计考试总结

1名词解释53分15分2简答题66分36分3计算题37分21分4算法设计28分3小题第一章知识点1什么是算法2算法的5个重要特性并简要说明3算法的4个描述方法及其优缺点第二章知识点1下界的概念2图213最优算法...

算法设计与分析书中概念总结

6递推步骤7算法描述盒图PAD图之类的老师说看看但我不懂怎么考1算法的基本性质1目的性算法有明确的目的算法能够完成赋予它的功能2分步性算法为完成其复杂的功能由一系列计算机可执行的步骤组成3有序性算法的步骤是有序...

算法设计总结(34篇)