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