C语言学习-day02

学习来源 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

结果:

 今日总结:练习了一下数组的题,和复习了函数的一些注意事项并做了点题,明天就将函数剩余的复习了,再去复习指针和结构体的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值