C语言集训 马麒 第四次作业

149 阅读6分钟

学习笔记

一.数组

  • 为什么需要数组:为了解决大量同类型数据的储存和使用问题;为了模拟现实世界 1.数组的分类:
  • 一维数组

怎样定义一维数组:为n个变量连续分配储存空间;所有的变量数据类型必须相同;所有变量所占字节大小必须相等

注意:有关一维数组的操作初始化,分为完全初始化,不完全初始化(未被初始化的元素自动为0),不初始化(所以元素是垃圾值),清零。

  • 二维数组:如int a [3] [4];共总是12个元素,可以当做3行4列看待。

  • 多维数组:不存在多维数组,因为内存是线性一维的,n组数组可以当作每个元素是n-1维数组的一维数组。

二.函数(重点)

1.为什么需要函数:避免了重复性操作;有利于程序模块化。

2.函数的定义:

  • 逻辑上:能够完成特定功能的独立的代码块。

  • 物理上:能够接受数据(当然也可以不接受数据);能够对接受的数据进行处理;能够将数据处理的结果返回(当然也可以不返回任何值)。

总结:函数是个工具,它是为了解决大量类似问题而设计的,函数可以当作一个黑匣子。 3.如何定义函数:

函数的返回值 函数的名字(函数的形参列表)
{
   函数的执行体
}
  • 函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法。

  • return表达式;的含义:终止被调函数向主调函数返回表达式的值;如果表达式为空,则只终止函数,不向主调函数返回任何值;break是用来终止循环和switch的,return是用来终止函数的。

函数返回值的类型也称为函数的类型,因为如果函数名前的返回值类型和函数执行体中的return表达式; 中表达式的类型不同的话,则最终函数返回值的类型以函数名前的返回值类型为准

4,函数的分类

有参函数 和 无参函数;有返回值函数 和 无返回值函数;库函数 和 用户自定义函数;值传递函数 和 地址传递函数;普通函数 和 主函数(main)

注意:一个函数有且只能有一个主函数;主函数可以调用普通函数,但是普通函数不能调用主函数;普通函数可以相互调用;主函数是程序的入口,也是程序的出口

5.函数前置声明注意点(函数调用和函数定义的顺序,如果函数的调用写在了函数定义的前面,则必须加函数前置声明):

  • 告诉编译器即将可能出现的若干个字母代表的是一个函数
  • 告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值二点具体情况
  • 函数声明是一个语句,末尾需要加上分号
  • 对库函数的声明是通过 #include<库函数所在的区间>

变量的作用域和储存方式:

1.按作用域分:

  • 全局变量:在所有函数外部定义的变量叫做全局变量。

全局变量的使用范围:从定义位置开始到整个程序介绍

  • 局部变量:在一个函数内部定义的变量或者函数的形参都统称为局部变量
void f(int i)
{
     int j = 20;
}

i和j都属于局部变量

局部变量的使用范围:只能在本函数内部使用

  • 要注意的问题(全局变量和局部变量命名冲突的问题):在一个函数内部如果定义的局部变量的名字和全局变量名如果一样时,局部变量会屏蔽掉全局变量。

2,按变量的储存方式:静态变量,自动变量,寄存器变量

出现的代码

1.数组的简单使用

# include <stdio.h>

int main(void)
{
    int a[5] = {1,2,3,4,5};//a是数组的名字,5代表数组元素的个数// 

    int i; 

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

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

    printf ("%d\n", a[100]);

    return 0;
}

2.数组的赋值

# include <stdio.h>

int main(void)
{
    int a[5];
    int i; 

    scanf ("%d ,&a[0]");
    printf ("a[0] = %d\n",a[0]);

    scanf ("%d", &a[3]);
    printf ("a[3] = %d\n", a[3]);

    for(i=0; i<5; ++i)
    printf("%d ",a[i]);

    return 0;
}

3.把一个数组元素全部倒过来

# include <stdio.h>

int main(void)
{
    int a[8] = {1,2,3,4,5,6,7,8};
    int i,j;
    int t;

    i = 0;
    j = 6;
    while (i< j)
    {
        t = a[i];
        a[i] = a[j];
        a[j] = t;

        i++;
        --j;
    }
    for (i=0; i<7; ++i)
    printf ("%d\n", a[i]);

    return 0;
}

4.二维数组的使用

# include <stdio.h>

int main(void)
{
    int a[3][4] ={
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10,11,12}
    };
    int i, j;
    //输出数组内容//

    for (i=0; i<3; ++i)
    {
        for (j=0, j<4, ++j)
        printf ("%d ",a[i][j]);

    printf ("\n");
    }
    return 0;
}

5.比较两函数的大小

# include <stdio.h>
//main是函数的名字,i和j是形式参数,void表示函数没有返回值//
void max(int i,int j)
{
    if (i>j)
    printf("%d\n", i);
    else
    printf ("%d\n",j);
}

int main(void)
{
    int a,b,c,d,e,f;

    a = 1,b = 2,c = 3,d = 9,e = -5,f = 100;
    max(a,b);
    max(c,d);
    max(e,f);

    return 0;

}

6.说明函数定义中以函数返回值类型为准

# include <stdio.h>

int f()
{
    return 10.5;
}

int main(void)
{
    int i = 99;
    double x = 6.6;
    
    x = f();
    printf ("%1f\n", i);

    return 0;
}

7.判断一个数是否是素数

# include <stdio.h>

int main(void)
{
    int val;
    int i;

    scanf ("%d", &val);
    for (i=2; i<val; ++i)
    {
        if (val%i == 0)
        break;
    }
    if (i == val)
    printf ("Yes!\n");
    else
    printf ("No!");

    return 0;
}

8.函数的声明

# include <stdio.h>

void f(void)
{
    void g(void)
    {
        f();
    }
    
void f(void)
{
    printf("哈哈\n");
}
int main (void)
{
    g();

    return 0;
}
习题集

1.ASCII码排序

  • 解题思路: 比较1,2两个数,如果第一个数比第二数大,把这两个数交换;比较2,3两个数,如果第二个数比第三数大,把这两个数交换,这时最大的数已经被移到最后,然后再重复一次第一步
  • 源代码:
#include<stdio.h>
int main()
{
	char a,b,c,d,t;
	while(scanf("%c%c%c",&a,&b,&c) != EOF)
	{
		if(a > b)
		{
			t = a;
			a = b;
			b = t;
		}
		if(b > c)
		{
			t = b;
			b = c;
			c = t;
		}
		if(a > b)
		{
			t = a;
			a = b;
			b = t;
		}
		scanf("%c",&d);
		printf("%c %c %c\n",a,b,c);
		
	}
	return 0;
}
  • 运行结果:

屏幕截图 2021-11-29 094744.png

2.计算两点间的距离

  • 解题思路:输入两点坐标(X1,Y1),(X2,Y2),直接带入两点距离公式即可
  • 源代码:
#include<stdio.h>
#include<math.h>

int main()
{
       float x1,x2,y1,y2;
       float s1;
       while(scanf("%f%f%f%f",&x1,&y1,&x2,&y2)!=EOF)
       {
       s1=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
       printf("%.2f\n",s1);
       }
       return 0;
}
  • 运行结果: 屏幕截图 2021-11-29 140001.png

3.计算球体积

  • 解题思路:输入球的半径,再由球体体积的计算公示计算即可
  • 源代码:
#include<stdio.h>

#define pi 3.1415
int main()
{
    float r,v;
    while(1)
    {
        scanf("%f",&r);
        v=4.0/3*pi*r*r*r;
        printf("%.3f\n",v);

    }
    return 0;
}
  • 运行结果:

屏幕截图 2021-11-29 141402.png

4.求绝对值

  • 解题思路:如果输入数大于0,则直接输出;如果输入数小于0,则取相反数
  • 源代码:
#include<stdio.h>

int main()
{
    float x;
    scanf("%f",&x);
    if(x<0)
    {
        x=-x;
        printf("%.3f\n",x);
    }
    else printf("%.3f\n",x);

    return 0;
}
  • 运行结果:

屏幕截图 2021-11-29 142044.png 5.成绩转换

  • 源代码
#include <stdio.h>
int main()
{
    int score;
    while(scanf("%d",&score)!=EOF)
    {
    if(score>=90&&score<=100) printf("A\n");

    else if(score>=80&&score<=89) printf("B\n");

         else if(score>=70&&score<=79) printf("C\n");

               else if(score>=60&&score<=69) printf("D\n");

                    else if(score>=0&&score<=59) printf("E\n");
                    
                        else printf("Score is error!\n");
    }
    return 0;
}
  • 运行结果

屏幕截图 2021-11-29 142609.png

6.第几天?

  • 解题思路:用一个数组将一月有多少天表示出来,如果是闰年要加一天
  • 源代码:
#include <stdio.h>

int main()
{
 int year, month, day;
 int cnt = 0, sum = 0;
 while (scanf("%d/%d/%d", &year, &month, &day) != EOF)
 {
  sum = 0;
  int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  for (cnt = 0; cnt < month; ++cnt)
   sum = sum + a[cnt];
  if (month <= 2)
   printf("%d\n", sum + day);
  else if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
   printf("%d\n", sum + day+1);
       else
   printf("%d\n", sum + day);
 }


 return 0;
}
  • 运行结果:

屏幕截图 2021-11-29 143247.png

7.求奇数的乘积

  • 解题思路:先判断一个数是否是奇数,即看这个数能否整除2,能则是奇数,然后对奇数进行累乘
  • 源代码:
#include <stdio.h>
int main()
{
    int x,b,s;
    while(scanf("%d",&x)!=EOF)
    {
        s=1;
        while(x--)
        {
            scanf("%d",&b);
            if(b%2!=0)
                s*=b;
        }
        printf("%d\n",s);
    }
    return 0;
}
  • 运行结果:

屏幕截图 2021-11-29 144141.png

8.平方和与立方和

  • 解题思路:先判断出是奇数还是偶数,再分别进行计算立方和和平方和
  • 源代码:
# include <stdio.h>

int main()
{
   int m,n;
   int x,y,t;
   while(scanf("%d%d",&m,&n)!=EOF)
   {
       x=0;
       y=0;
       if(m>n)
       {
         int t=m; //将m,n的值互换//
         m=n;
         n=t;
       }
       for(int i=m;i<=n;i++)
       {
           if(i%2==0)
           {
               x+=i*i;
           }
           else y+=i*i*i;
       }
       printf("%d %d\n",x,y);
   }
    return 0;
  • 运行结果:

屏幕截图 2021-11-29 144814.png