C语言集训-王丽宁-第四次作业

186 阅读7分钟

课堂笔记

学习内容

数组

函数

变量的作用域与存储方式

数组

数组的简单应用(程序)
#include <stdio.h>
int main (void)
{
    int a[5] = {1,2,3,4,5};
            //a是数组的名字,5表示数组的个数,并且这5个元素分别用a【0】,a【1】 a【2】 a【3】 a【3】 
    int i;

    for (i=0;i<5;++i)
        printf ("%d",a[i]);
    printf ("%d\n",a[100]);    
    return 0 ;
    
    
}

image.png

一维数组的使用
#include <stdio.h>
int main (void)
{
    int a[5]; 
    int i;

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

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

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

image.png

把一个数组元素全部倒过来
#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=7;
    while (i<j)
    {
        t=a[i];
        a[i]=a[j];
        a[j]=t;

        i++;
        j--;
    }
    for ( i = 0; i < 8; i++)
    {
        printf ("%d",a[i]);
    }
    
    return 0 ;
    
    
}

image.png

二维数组的使用

#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]);
    }
    
    return 0 ;
    
    
}

image.png

矩阵的相乘

多维数组
    是否存在多维数组
        不存在
        因为内存是线性唯一的
        n维数组可以当作每个元素是n-1维数组的一维数组
            比如:
                int a[3][4];
                    该数组是含有3个元素的一维数组
                    只不过每个元素都可以分为4个小元素
                int a[3][4][5];
                    该数组是含有3个元素的一维数组
                    只不过每个元素都是45列的二维数组

函数【C语言第二个重点】

为什么需要函数
    避免了重复性操作
    有利于程序模块化
说明叫函数
    逻辑上 : 能够完成特定功能的独立的代码块
    物理上 : 
             能够接受数据【当然也可以不接受数据】
             能够对接受的数据进行处理
             能够将数据的处理结果返回【当然也可以不返回任何值】
如何定义函数
    函数的返回值  函数的名字
    {
        函数的执行体
    }
    1.函数定义的本质是详细描述函数之所以能够实现某个功能的具体实现方法
    2.return表达式的含义:
        1>终止被调用函数,向主调函数返回表达式的值
        2>如果表达式为空,则只终止函数,不向被调函数返回任何值
        3>break是用来终止循环和switch的,return用来终止函数的
    3.函数返回值的类型也叫做函数类型,因为如果函数名前的返回值类型和函数执行体中的return表达式类型
    不同的话,则最终函数返回值类型 以函数名前的返回值类型
函数分类
    有参函数 和 无参函数
    有返回值函数 和 无返回值函数
    库函数 和 用户自定函数
    普通函数 和 主函数(main函数)
        一个程序必须有且只有一个主函数
        主函数可以调用普通函数  普通函数不能调用主函数
        普通函数可以互相调用
        主函数是程序入口 也是程序出口
注意的问题
    函数定义和函数调用的顺序
        如果函数调用写在流函数定义的前面,则必须加函数前置声明
        函数前置声明:
            1.告诉便编译器可能出现的若干字母代表的是一个人函数
            2.告诉便编译器可能出现的若干字母所代表的函数的形参和返回值的具体情况
            3.函数声明是一个语句,末尾必须加分号
            4.对库函数的声明是通过# include <库函数所在文件的名称>
形参和实参
        个数相同  位置一一对应  数据类型必须相互兼容
        
如何在软件开发中合理设计函数来解决实际问题
    一个函数的功能尽量独立,单一
    多学习,多模仿牛人代码

函数的类型 函数是C语言的基本单位,是Java,C#,C++的基本单位 常用的系统函数 double sqtr (double x); 求x的平方根 int abs (int x); 求x绝对值

第一个例子

#include <stdio.h>
int main (void)
{
    int a,b,c,d,e,f;

    a = 1,b = 2,c = 3,d = 9,e = -5,f = 100;
    if (a>b)
        printf ("%d\n",a);
    else
        printf ("%d\n",b);
    
    if (c>d)
        printf ("%d\n",c);
    else
        printf ("%d\n",d);

    if (e>f)
        printf ("%d\n",e);
    else
        printf ("%d\n",f);
    return 0 ;
    
    
}

image.png 第二个例子

#include <stdio.h>

int f(void)  //括号中的void表示该函数不能接受数据   int表示函数返回值是int类型
{
    return 10;  //向主调函数返回10
}
int main (void)
{
    int j = 88;
    j=f();
    printf ("%d\n",j);
    return  0;
}

image.png 什么是函数类型

#include <stdio.h>

int f()  
{
    return 10.5;  
}
int main (void)
{
    int i = 99;
    double x = 6.6;

    x=f();
    printf ("%lf\n",i );
    return  0;
}

image.png

return 与 break 的区别

#include <stdio.h>

int f()  
{
   int i;

   for ( i = 0; i < 5; i++)
   {
       printf ("大家辛苦了\n");
       break;
   }
   printf ("同志们好\n");
}
int main(void)
{
    f();
    return 0;
}

image.png

如何合理设计函数

#include <stdio.h>
int main (void)
{
    int val;
    int i;
    
    scanf ("%d",&val);
    for ( i = 2; i < val; i++)
    {
        if (0 == val % i)
            break;
    }
    if ( i == val)
        printf ("Yes\n");
    else 
        printf ("No\n");
        return 0 ;
}

image.png

如何在开发中合理设计函数来解决实际问题

bool IsPrime(int(val))
{
    int i;

    for ( i = 2; i < val; i++)
    {
        if (0 == val%i)
        break;
    }
    if ( (i == val))
        return true;
    else
        return false;
        
}
#include <stdio.h>
int man (void)
{
    int val,i,j;

    scanf ("%d",&val);
    for ( i = 2; i < val; i++)
    {
        //判断i是不是素数,是输出,不是不输出
        for ( j = 2; j < i; j++)
        {
            if (0 == i%j)
                break;
        }
        if (j == i)
            printf ("%d",i);
    }
    return 0 ;
}

image.png

变量

变量的作用域和存储方式:
按作用分:
    全局变量
        在所有函数外部定义的变量叫做全局变量
        全局变量适用范围:从定义位置到程序结束
    局部变量
        在一个函数内部定义的变量或者函数的形参,统称为局部变量
        局部变量使用范围:只在本函数内使用
注意的问题
    全局变量和局部变量命名冲突问题
        在一个函数内部如果定义的局部变量的名字和全局变量名一样时,
        局部变量会屏蔽全局变量
按变量的存储方式
    静态变量
    自动变量
    寄存器变量

全局变量和局部变量

#include <stdio.h>
void g()
{
    printf ("k=%d\n",k );
}    
    int k = 1000;
    void f(void)
{
    g();
    printf ("k = %d\n",k );

}
int main (void)
{
    f(88) ;
    return 0 ;
}  

网上答题

通过情况

image.png

image.png

1. 源代码

#include <stdio.h>

int main(void)
{
    char a,b,c,tmp;
    while(scanf("%c%c%c%*c",&a,&b,&c)!=EOF)
    {
        if(a>b) tmp=a,a=b,b=tmp;   
        if(a>c) tmp=a,a=c,c=tmp;
        if(b>c) tmp=b,b=c,c=tmp;
        printf("%c %c %c\n",a,b,c);
    }
    return 0;
}

其中最重要的是EOF


源代码

#include<stdio.h>
#include<math.h>
void main()
{
float x1,x2,y1,y2;
printf("请输入一组数据:");
while(scanf("%f%f%f%f",&x1,&y1,&x2,&y2))
 {
 printf("两点间的距离为:%.2f\n",sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
 printf("请输入一组数据:");
 }
return 0;
}

报错说complicatio,不知道哪里错了


源代码

#include <stdio.h>

#include<math.h>

#define PI 3.1415927

int main(void)

{

float S,d;

while(scanf("%f",&d)!=EOF)

{

s=(1.0*4)/3*d*d*d*PI;

printf("%.3lf\n",s);

}

return 0;

}

也是complication报错


源代码

#include<stdio.h>
float f(float a);
int main()
{
 float a,b;
 while(scanf("%f",&a)!=EOF)
{
    b=f(a);
    printf("%.2f\n",b);
}
   return 0;
}
float f(float a)
{
float b;
if(a<0)
  b=-a;
else
  b=a;
return b;
}

答案错误 5. 源代码

#include <stdio.h>
int main (void)
{
     int t,score,m;

     scanf ("%d",&m);
     while (m == 1)
     {
     
       printf ("请输入您的成绩");
       scanf ("%d",&t);
       score = t/10;
       switch (score)
      {
        case 9: 
          printf ("A");
          break;
        case 8:
          printf ("B");
          break;
        case 7:
          printf ("C");
          break;
        case 6:
          printf ("D");
          break;
        case 5:
          printf ("E");
          break;
        case 4:
          printf ("E");
          break;
        case 3:
          printf ("E");
          break;
        case 2:
          printf ("E");
          break;
        case 1:
          printf ("E");
          break;
        case 0:
          printf ("E");
          break;
        default:
          printf ("Score is error");
          break;
      }
    scanf ("%d\n",&m);}
    return 0;
}

答案不对 6. 源代码

#include<stdio.h>
int main()
{
    int y, m, d, n;
    while (~scanf("%d/%d/%d", &y, &m, &d))
    {
        if (m == 1)
            n = d;
        else if (m == 2)
            n = 31 + d;
        else if (m == 3)
            n = 31 + 28 + d;
        else if (m == 4)
            n = 31 + 28 + 31 + d;
        else if (m == 5)
            n = 31 + 28 + 31 + 30 + d;
        else if (m == 6)
            n = 31 + 28 + 31 + 30 + 31 + d;
        else if (m == 7)
            n = 31 + 28 + 31 + 30 + 31 + 30 + d;
        else if (m == 8)
            n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + d;
        else if (m == 9)
            n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + d;
        else if (m == 10)
            n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + d;
        else if (m == 11)
            n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + d;
        else if (m == 12)
            n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + d;
        if ((y%4==0&&y%100!=0||y%400==0)&&m>=3)
            n = n + 1;
        printf("%d\n", n);
    }
    return 0;
}

利用枚举法,从1列到12


源代码

#include<stdio.h>
int main()
{
    int m,n,i,temp,sum1,sum2;
    while(scanf("%d%d",&m,&n))
    {sum1=sum2=0;
    if(m>n)
    {temp=m;m=n;n=temp;}
    for(i=m;i<=n;i++)
       {
        if(i%2==0)
            sum1+=i*i;
        else if(i%2==1)
            sum2+=i*i*i;
       }
       printf("%d %d\n",sum1,sum2);
    }
    return 0;
}

源代码


#include<stdio.h>
int main()
{
    int i,n,sum,p;
    while(scanf("%d",&n))
    {sum=1;
        for(i=0;i<n;i++)
        {
            scanf("%d",&p);

            if(p%2==1)
                sum*=p;
        }
        printf("%d\n",sum);
    }
    return 0;
}

写的解题思路较少,不知道怎么表达。