学习来源 b站--作者:小甲鱼--【C语言】C语言视频教程(孤独自学 - up主)
数组的练习
问题:从键盘上输入9个整数,(对照九宫格的形式,输入三行,每行输入三个数) 保存在二维数组中,按数组原来位置输出第一行和第一列的所有元素。
代码:
#include <stdio.h>
void main()
{
int i, j, a[3][3];
for (i= 0; i < 3; i++) /*输入数组*/
{
for (j=0; j < 3; j++)
{
scanf("%d", &a[i][j]);
}
}
for (i=0; i < 3; i++) /*输出数组*/
{
for (j=0; j < 3; j++)
{
if (i==1 || j==1)
{
printf("%-6d",a[i][j]);
}
else
{
printf("%-6c",' ');
}
}
printf("\n");
}
}
输入:1 2 3 4 5 6 7 8 9
结果:
折半查找算法
#define M 10
#include<stdio.h>
void main()
{
static int a[M]={-12,0,6,16,23,56,80,100,110,115};
int n, low, mid, high, found;
low=0;
high=M-1;
found=0;
scanf("%d", &n);
while(low <= high)
{
mid = (low + high) / 2;
if (n == a[mid])
{
found = 1;
break;
}
else if (n > a[mid])
{
low=mid+1;
}
else
{
high=mid-1;
}
}
if (found==1)
{
printf("The index of %d is %d\n", n, mid);
}
else
{
printf("There is not %d\n", n);
}
}
输入:0
输出:
函数
函数间可以互相调用,但不能调用main函数。
定义形式:
声明形式:类型标识符 函数名(形参列表);
如果形参与实参的值不同则会以按day01里面的不同类型数值的赋值规则进行转换。
实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。
数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式。一种是把数组元素(下标变量)作为实参使用(当一般的传参来考虑);另一种是把数组名作为函数的形参和实参使用。注:在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。n形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
标准函数(即库函数)
这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。
用户自己定义的函数
用以解决用户的专门需要。
从函数的形式上,将函数分为无参函数和有参函数
无参函数
在调用无参函数时,主调函数不向被调用函数传递数据。无参函数一般用来执行指定的一组操作。
有参函数
在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。
函数返回值(return)
return语句将被调用函数中的一个确定值带回主调函数中去。
在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换,
例如:
#include <stdio.h>
void main()
{
int max(float x, float y);
float a, b;
int c;
scanf("%f,%f", &a, &b);
c = max(a, b);
printf("Max is %d\n", c);
}
int max(float x, float y)
{
float z;
z = x > y ? x : y;
return z;
}
输入:1,2
结果:
对于函数类型是void在函数体内不得出现return语句。
可通过结构体返回所需要的多个值,
例如:
#include<stdio.h>
typedef struct Fx{//结构体
int a;
int b;
}Fx;
Fx fun()
{
Fx m = {8,5};
return m;
}
int main()
{
Fx m = fun();
printf("%d %d",m.a,m.b);
return 0;
}
结果:
按函数在程序出现的位置分,有三种函数调用方式
函数语句
把函数调用作为一个语句。只要求函数完成一定的操作。
函数表达式
函数出现在一个表达式中,这种表达式就叫函数表达式。此时要求函数带回一个确定的值以参加表达式的运算。
函数参数
函数调用作为一个函数的实参,实质上也是函数表达式形式调用的一种。
利用函数实现pow函数
#include <stdio.h>
double power(double x, double y);
void main()
{
double x = 2.0, y = 5.0, z;
z = power(x, y);
printf("%.1f to the power of %.1f is %.1f\n", x, y, z);
}
double power(double x, double y)
{
double z = x;
while(--y)
{
z *= x;
}
return z;
}
结果:
递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
问题:实现s = 2²! + 3²!
#include <stdio.h>
long square(long x);
long factorial(long a);
void main()
{
long x = 2, y = 3, z;
z = square(x)+square(y);
printf("result is %ld\n", z);
}
long square(long x)
{
long z = x*x;
z = factorial(z);
return z;
}
long factorial(long a)
{
long result = -1;
if(a < 0)
{
printf("error\n")
}
else if(a == 1 || a == 0)
{
result = 1;
}
else
{
result = a*factorial(a-1);
}
return result;
}
结果:
问题:判别一个整数数组a[10]={1, 2, 3, 4, -1, -2, -3, -4, 2, 3}中各元素的值,若大于0 则输出该值,若小于等于0则输出0值。(例子为利用数组元素传参)
#include <stdio.h>
void test(int v);
void main()
{
int a[10] = {1, 2, 3, 4, -1, -2, -3, -4, 2, 3};
int i;
for(i=0; i < 10; i++)
{
test(a[i]);
}
printf("\n");
}
void test(int v)
{
if(v>0)
{
printf("%d ", v);
}
else
{
printf("%d ", 0);
}
}
结果:
问题:写一个函数--输出数组每个元素 int a[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}(例子为利用数组名传参)
#include <stdio.h>
void test(int b[10]);
void main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
test(a);
putchar('\n');
}
void test(int b[10])
{
int i = 0;
for( ; i < 10; i++ )
{
printf("%d ", b[i]);
}
}
结果:
问题:计算一个数组里面所有值的平均值(利用数组名传参)
#include <stdio.h>
double average(double array[]);
void main()
{
double score[10] = {5,5,7,9,8,8,4,5,7,10}, result;
result = average(score);
printf("average is %5.2lf\n", result);
putchar('\n');
}
double average(double array[])
{
double result = 0;
int i = 0;
for( i=0; i < 10; i++ )
{
result += array[i];
}
result /= 10;
return result;
}
结果:
全局变量和局部变量
注意点:
(1)主函数中定义的变量也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。
(2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。
(3)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”,
例如:
#include <stdio.h>
void main()
{
int a = 1, b = 2;
{
int c = a+b;
a = 2;
printf("c = %d\n", c);
}
printf("a = %d,b = %d\n",a,b);
}
结果:
问题:n输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。
#include <stdio.h>
int s1,s2,s3;
int vs( int a,int b,int c)
{
int v;
v = a*b*c;
s1 = a*b;
s2 = b*c;
s3 = a*c;
return v;
}
void main()
{
int v,l,w,h;
scanf("%d %d %d",&l,&w,&h);
v = vs(l,w,h);
printf("\nv=%d, s1=%d, s2=%d, s3=%d\n",v,s1,s2,s3);
}
输入:2 2 3
结果:
今日总结:练习了一下数组的题,和复习了函数的一些注意事项并做了点题,明天就将函数剩余的复习了,再去复习指针和结构体的内容。