C语言集训-陈明-第四次作业

1,662 阅读8分钟

教学视频内容

数组

一、为什么需要数组

1、为了解决大量同类型数据的储存和使用问题
2、为了模拟现实世界(大量数据)

二、数组的分类

 一维数组
 二维数组
 多维数组

三、一维数组

1、简单格式:int a[5]={1,2,3,4,5};
2、表明含义:

1.a[5]表示在内存条里分出了5个`连续`的位置(5个`整型`变量)  
2.括号里的5就代表5个同类型元素(变量),5个连续的位置  
3.然后将12345分别储存在这5个位置里  
4.其标号(变量)分别为a[0],a[1],a[2],a[3],a[4]

3、注意事项
1*

    为n个变量连续分配储存空间
    所有的变量数据类型必须相同
    所有变量所占的字节必须相等(重点)

2*
注意定义的时候a[5]中的5代表长度
用于变量时只存在a[4],4为下标

四、二维数组

1,格式:int a[2][3]={1,2,3,4,5,6};
2、表明含义:

1、总共设定了12个同类型元素(变量)、12个内存条的位置
2、相当于23列,即前一个为行,后一个为列
3、依次名字为:
            a[0][0],a[0][1],a[0][2]
            a[1][0],a[1][1],a[1][2]
            (作为变量时,a[i][j]表示第i+1行,第j+1列)
            

3、二维数组的输出(运用for循环嵌套)

image.png

五、多维数组

1、不存在多维数组,因为内存是线性一维的
2、n维数组相当于每个元素是n-1维数组的一维数组(俗称套娃
如下列解释: QQ图片20211128094031.jpg

六、数组的初始化问题

1、分类

完全初始化
         如int a[4]={2,3,4,5};
不完全初始化(那么其他的值自动赋值为0)
         如int a[4]={2};
不初始化 (全是垃圾值)
         如int a[4];
清零(全部为0)
         如int a[4]={0};
         

2、注意点初始化是只能在定义的时候才能初始化
如:

int a[4];
a[4]={1,2,3,4};
这是错误写法

函数

一、为什么需要函数

1、避免重复操作敲相同功能的结构代码
2、有利于模块化,增强可读性

二、什么叫函数

*逻辑上:能独立完成特定功能的独立代码块
*物理上:
       1、能够接收数据(也可以不接收)
       2、能够对接收的数据进行处理
       3、能够处理的数据进行返回(也可以不返回)
*总结来说:函数是一个工具,它是为了处理大量类似问题而设计的
          函数就相当于一个黑匣子

三、格式

  函数声明:    返回值类型 函数名(数据类型 形参,...)
  
  调用函数:    两类 
                   1、t=f(4)即结果(t被赋值的结果)为定义函数的返回值
                   2、f(4)直接使用定义函数
                   
  定义函数:    返回值类型 函数名(数据类型 形参,...)
               {
                    函数体(语句序列;)
               }

四、声明函数

1.告诉编译器即将可能出现的若干字母代表的是一个函数。
2.告诉编译器即将可能出现的若干字母所代表函数的形参和返回值类型的具体情况。
3.对于用户自定义函数的声明:声明函数*必须*前置于主函数,
  且相当于一个语句,末尾要加分号。
  
4.对于库函数的声明:通过#include<库函数所在的文件夹名称>来声明

五、定义函数

1、类型:

     1.void 函数名 (数据类型 形参,...)
       {
       }  (无return2.数据类型 函数名 (数据类型 形参,...)
       {
       }  return 表达式;
       
     3.void 函数名 (void//无任何意义
       {
       }  (无return4. 数据类型 函数名 (void)
       {
       }  return 表达式;
       
     ···(void表示无法接收任何数据,return表示返回表达式中的值)  
       

2、本质:详细描述函数之所以能够实现某个特定功能的具体方法

六、调用函数

格式: 函数名(实参)

七、return 表达式的含义

1、return ; 表示终止该函数,
2、而 return 表达式 ; ,表示终止函数后,将表达式的结果返回给函数,但如果表达式的数据类型与函数名前面的返回值类型不一致,那么以函数名前面的返回值类型为准

八、函数形参和实参区别

1、概念区分。形参只在定义函数内定义,且只在该定义函数内有效。实参是指调用函数中的值。 实际参数的值相当于赋值给形参

2、注意点:个数相同,位置一一对应,数据类型必须相互兼容(比如float兼容int)

九、函数分类

有参函数和无参函数
有返回值函数和无返回值函数
库函数和用户自定义函数(统称普通函数)
普通函数和主函数
**注意,一个程序只有一个主函数
        主函数能调用普通函数,普通函数不能调用主函数
        普通函数之间可相互调用
        主函数是程序的入口也是出口

十、注意事项

1.调用函数和定义函数的顺序
**当无函数声明,则定义函数必须放在调用函数之前,否则将会报错
**当有函数声明,则顺序无所谓,但应遵循模块化原则

十一、变量的作用域和存储方式

  • 1.分类

      按作用域分:全局变量和局部变量
      按存储方式分:静态变量和动态变量和寄存器变量
    
  • 2.定义

      全局变量:函数外部定义的变量
               使用范围:从定义开始到程序结束的部分都有效
      局部变量:在一个函数内定义的变量或者该函数的形参统称为局部变量
               使用范围:只在本函数中使用
    
  • 3.注意事项:
    当全局变量和局部变量其 名字 冲突时,以局部变量为准

image.png

2> 作业

作业1(ascll码排序)

#include <stdio.h>
void f(char a, char b, char c);
int main()
{
    char g[4], h[4], I[4];
    scanf("%s", g);
    scanf("%s", h);
    scanf("%s", I);
    f(g[0], g[1], g[2]);
    f(h[0], h[1], h[2]);
    f(I[0], I[1], I[2]);

    return 0;
}

void f(char a, char b, char c)

{
    char t;
    if (a < b)
    {
        t = a;
        a = b;
        b = t;
    }
    if (a < c)
    {
        t = a;
        a = c;
        c = t;
    }
    if (b < c)
    {
        t = b;
        b = c;
        c = t;
    }
    printf("%c %c %c\n", c, b, a);
}


难点:1.字符串输入,用数组来存储。(注意在字符串最后存在一个结束符,占一个字节,所以定义数组时一般是字符长度+1)
2.字符串中提取每个字符

运行后如下

image.png

作业2(成绩转化字母)

#include <stdio.h>
char grade(int g);
int main()
{
    int T;
    printf("你想输入几组数据:");
    scanf("%d", &T);
    int i;
    int a[T];
    printf("共有%d组数据,数据之间用换行隔开:\n", T);
    for (i = 0; i < T; i++)
    {
        scanf("%d", &a[i]);
    }
    char g;
    for (i = 0; i < T; i++)
    {
        if (a[i] >= 0)
        {
            g = grade(a[i]);
            printf("%c\n", g);
        }
        else
            printf("score is error\n");
    }

    return 0;
}

char grade(int g)
{
    switch (g / 10)
    {
    case 10:
    case 9:
        return 'A';
    case 8:
        return 'B';
    case 7:
        return 'C';
    case 6:
        return 'D';
    default:
        return 'E';
    }
}

难点:1.输入时.我们需要输入多组同类型数据,而且用换行隔开。则我们易知可用for循环,数组来存储
2.处理数据时.还是一组一组数据来处理,则得用for循环,处理g[i]
3.模块化处理是增加可读性

image.png

作业3(计算两点距离)

#include <stdio.h>
#include <math.h>
double detance(double a,double b,double c,double d);
int main()
{
    int T;
    printf("你想输入几组数据:");
    scanf("%d",&T);
    
    int i;
    double x1[T],y1[T],x2[T],y2[T]; 
    printf("需要输入%d组数据,一组数据之间用空格隔开,每组数据用换行隔开",T);
    for(i=0;i<T;i++)
    {
        scanf("%lf%lf%lf%lf",&x1[i],&y1[i],&x2[i],&y2[i]);
    }

    double t;
    for(i=0;i<T;i++)
    {
     t=detance(x1[i],y1[i],x2[i],y2[i]);
     printf("%.2lf\n",t);
    }

    return 0;
}

double detance(double a,double b,double c,double d)
    {
        double D;
        D=sqrt((a-c)*(a-c)+(b-d)*(b-d));
        return D;
    }
   

运行后如下

image.png

作业4(绝对值)

#include <stdio.h>
float aeve(float n);
int main()
{
    int T;
    printf("你想输入几组数据:");
    scanf("%d", &T);

    int i;
    float a[T];
    printf("共有%d组数据,数据之间用换行隔开:\n",T);
    for (i = 0; i < T; i++)
    {
        scanf("%f", &a[i]);
    }
    
    float b;
   for (i = 0; i < T; i++)
   {
     b=aeve(a[i]);
     printf("%.2f\n",b);
   }

    return 0;
}

float aeve(float n)
{
    if(n<0)
       return (-n);
    else
       return n;
}
运行后如下

![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fc141f59d5e3438c99290714d69e4bac~tplv-k3u1fbpfcp-watermark.image?)

作业5(奇数的乘积)

#include <stdio.h>
int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        int g[n], i, sum = 1;//循环存入数据
        for (i = 0; i < n; i++)
        {
            scanf("%d", &g[i]);
        }
        for (i = 0; i < n; i++)
        {
            if (g[i] % 2 != 0)
            {
                sum = sum * g[i];
            }
        }
        printf("%d", sum);
    }

    return 0;
}

运行后如下

image.png

作业6(球的体积)

#include <stdio.h>
#define PI 3.1415926
double volum(float r);
int main()
{
    int T;
    printf("你想输入几组数据:");
    scanf("%d",&T);
    int i;
    double r[T];
    for(i=0;i<T;i++)
    {
        scanf("%lf",&r[i]);
    }
    
    double V;
    for(i=0;i<T;i++)
    {
      V=volum(r[i]);
      printf("%.3lf\n",V);
    }

    return 0;
}

double volum(float r)
{
    double v;
    
    v=4.0/3*PI*r*r*r;

    return v;
}
运行后如下

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a15892033b8a4b3fa4cdbd8abcfb7f8f~tplv-k3u1fbpfcp-watermark.image?)

作业7(日期对应该年第几天)

#include <stdio.h>
int Days(int a, int b, int c);
int off(int a);
int main()
{
    int a, b, c;
    while ((scanf("%d/%d/%d",&a, &b, &c)) != EOF)
        printf("为该年的的%d天",Days(a, b, c));//调用第几天函数
    return 0;
}

int Days(int a, int b, int c)//定义计算第几天函数
{
    int days,n;
    n = off(a);//调用闰年判断函数

    switch (b)
    {
    case 1: return (days=c);
    case 2: return (days=31+c);
    case 3: return (days=31+n+c);
    case 4: return (days=31*2+n+c);
    case 5: return (days=31*2+30+n+c);
    case 6: return (days=31*3+30+n+c);
    case 7: return (days=31*3+30*2+n+c);
    case 8: return (days=31*4+30*2+n+c);
    case 9: return (days=31*5+30*2+n+c);
    case 10: return (days=31*5+30*3+n+c);
    case 11: return (days=31*6+30*3+n+c);
    case 12: return (days=31*6+30*4+n+c);
    }
    return days;
}

int off(int a)//定义闰年函数
{
    if (a % 4 == 0)
    {
        if (a % 100 == 0)
        {
            if (a % 400 == 0)
                return 29;
            else
                return 28;
        }
        else
            return 29;
    }
    else
        return 28;
}

难点:1.2月份的问题,闰年问题 2.每个月份的天数不一样,我思考用case 3.调用函数,使模块化

作业8(求平方和和立方和)

#include <stdio.h>
int main()
{
    int m, n;
    while (scanf("%d%d", &m, &n) != EOF)
    {
        int x=0, y=0, i;
        for (i = m; i <= n; i++)
        {
            if (i % 2 == 0)
                x = x + i * i;
            else
                y = y + i * i * i;
        }
        printf("%d %d", x, y);
    }

    return 0;
}

运行后如下

image.png