C语言集训-温宇骏-第四次作业

273 阅读7分钟

C语言集训-温宇骏-第四次作业

数组

1.数组的简单使用

#include <stdio.h>
int main(void)
{
  int a[5]={1,2,3,4,5};
  int i;
  for(i=0;i<5;++i)
  printf("%d\n",a[i]);
  return 0;
}

image.png

a是数组的名字 5表示数组的个数 a[0]表示第一个数,a[1]表示第二个数 以此类推

2.为什么需要数组

  • 为了解决大量同类型数据的存储和使用问题(避免使用多个变量)
  • 为了模拟现实世界(可定义平面 a[x] [y] 和空间 a[x] [y] [z] )

3.数组的分类

1.一维数组

定义一维数组

  • 为n个变量连续分配存储空间
  • 所有的变量数据类型必须相同
  • 所有变量所占的字节大小相等
一维数组的操作
1. 初始化

完全初始化:int a[5]={1,2,3,4,5};

不完全初始化:int a[5]={1,2,3};

不初始化:int a[5]; 所有元素都为垃圾值

清零:int a[5]={0};

未被初始化的元素自动为0

把a数组中的值全部复制给b数组

b=a

正确写法:for(i=0;i<5;++i)

​ b[i]=a[i]

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;
} 

image.png

未被初始化的都是垃圾值

2.二维数组

定义二维数组

int a[3] [4]

总共是12个元素 看做三行四列

a[0] [0]a[0] [1]a[0] [2]a[0] [3]
a[1] [0]a[1] [1]a[1] [2]a[1] [3]
a[2] [0]a[2] [1]a[2] [2]a[2] [3]

a[i] [j] 表示i+1行,j+1列 例如 a[3] [4] 表示第二行第三个数。最大数 a[i-1] [j-1]

3.多维数组

不存在多维数组

内存是线性一维的,n维数组可以单做每个元素是n-1维数组的一维数组

eg:int a [3] [4] 含三个元素的一维数组 每个元素有四个小元素

三维数组为 二维数组的一维数组

四维数组为三维数组的一维数组

函数

1.为什么需要函数

#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>
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;
} 

image.png

1.函数可以解决大量同类型问题

2.函数可以避免重复性操作

3.有利于程序的模块化

2.什么是函数

逻辑上

能够完成特定功能的独立代码块

物理上

  • 能够接收数据(也可以不接收)
  • 能够对接收的数据进行处理
  • 能够将数据处理的结果返回(也可以不返回)

函数是为了解决大量类似性问题

3.如何定义函数

函数的返回值 函数的名字(函数的形参列表)

{

​ 函数的执行体

}

函数的返回值以函数名前的返回值类型为准

4.return和break的区别

1.break

#include <stdio.h>
void f(void)
{
 int i;
 for(i=0;i<6;++i)
 {
   printf("大家辛苦了!\n");
   break;
 }
 printf("同志们好!\n");
} 
int main(void)
{
  f();
  return 0;
}

image.png

break 终止循环和switch

2.return

#include <stdio.h>
void f(void)
{
 int i;
 for(i=0;i<6;++i)
 {
   printf("大家辛苦了!\n");
  return;
 }
 printf("同志们好!\n");
} 
int main(void)
{
  f();
  return 0;
}

image.png

return 终止被调函数 向主调函数返回表达式的值

如果表达式为空 则只终止函数 eg:void f()

5.函数的分类

  • 有参函数 和 无参函数
  • 有返回值函数 和 无返回值函数
  • 库函数 和 用户自定函数
  • 值传递 和 地址传递函数
  • 普通函数 和 主函数(main函数)一个程序必须有且只能有一个主函数

主函数可以调用普通函数 普通函数不能调用主函数

普通函数可以相互调用

主函数是程序的入口 也是程序的出口

判断一个数是否为素数

#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!\n");
  return 0;
  
}

image.png 调用函数后

#include <stdio.h>
bool IsPrime(int val)
{
 int i;
 for(i=2;i<val;++i)
  {
    if(val%i==0)
    break;
  }
  if(i==val)
return true;
  else
return false;
}
int main(void)
{
  int m;
  scanf("%d",&m);
  if(IsPrime(m))
  printf("是\n");
  else
  printf("不是\n");
  return 0;
}

image.png

6.函数的声明

  • 定义函数要放在调用函数的前面

  • 系统函数不需要声明

  • 函数声明是一个语句 末尾必须加分号

7.形参和实参

  • 个数相同
  • 位置一一对应
  • 数据类型必须相互兼容

8.常用系统函数

  • double sqrt(double x); 求x的平方根
  • int abs(int x);求x的绝对值
  • double fabs(double x); 求x的绝对值

9.变量的作用域和存储方式

1.局部变量

在一个函数内部定义的变量或函数的形参

只能在本函数内使用

2.全局变量

在所有函数外部定义的变量

如果局部变量和全局变量冲突,则局部变量会屏蔽全局变量


作业

5.11-T8

#include<stdio.h>
int main(void)
{
    int i,j;
    printf("输入一个值为求模运算的第二个运算对象\n");
    scanf("%d",&j);
    printf("输入一个值为第一个运算对象\n");
    scanf("%d",&i);
    while(i>0)
{
    printf("%d %% %d is %d\n",i,j,i%j);
    printf("输入一个值为第一个运算对象\n");
    scanf("%d",&i);
}
retur

image.png

6.16-T5

#include<stdio.h>
int main(void)
{
    char lets[5]={1,2,3,4,5};
    int i;
    for(i=1;i<=5;i++)
    {
        for(lets[i];i<5;i--);
        {
            printf("%d",lets[i]);
        }
    
    }
    return 0;
}

image.png

第五题属实看不懂 照着第三题写的 没输出成功

6.11-T12

#include <stdio.h>
int main (void)
{
    long int limit;
    float sign = 1.0f;
    float series1 = 0,series2 = 0;

    printf ("Enter a number of terms to sum");
    scanf ("%ld",&limit);

    for (long int i = 1;i<=limit;i++)
    {
        series1 += 1.0f/i;
        series2 +=(1.0f/i)*sign;
        sign = -sign ;
    }
    printf ("The %ld partial sum for series1 is: %.5f\n",limit,series1);
    printf ("The %ld partial sum for series2 is: %.5f\n",limit,series2);
    return 0 ;
}

image.png

答案看懂了,想是真想不到

6.11-T18

#include <stdio.h>
int main (void)
{
    int friends=5;
    int weeks=0;
    do
    {
        weeks++;
        friends=(friends-1)*2;
        printf("第%d 周有 %d 个朋友\n",weeks,friends);
    }
while(friends<150);
 printf("第%d 周有150个朋友\n ", weeks);
return 0;
}

image.png

7.11-T2

  • number>=90 && number<100
  • ch !='q' && ch !='k'
  • (number>=1 && number<=9)&& number !=5
  • number<1 && number>9

7.11-T10

#include<stdio.h>
int main()
{
	char ch;
	while ((ch = getchar()) != '#')
	{
		if (ch !='\n')
	       {
			printf("Step 1\n");
			if (ch == 'b')
				break;
			else if (ch != 'c')
			{
				if (ch != 'h')
				printf("Step 2\n");
				printf("Step 3\n");
			}
		}
	}
	printf("Done\n");
	return 0;
}

image.png

先判断第一步 continue表示跳过该循环 若去掉continue 则判断否命题是否成立,成立则执行第一步,再判断最后一步是否执行 反之则为第二步


杭电oj

ASCII码排序

思路:输入三个字符 取char将字符转化为数字进行大小比较 取一个中间变量 将较大的值赋给c 较小的值赋给a

再将a,b,c按顺序输出

#include<stdio.h>
int main()
{
char a,b,c,i;
scanf("%c%c%c",&a,&b,&c);
if(a>b)
{
    i=a;
    a=b;
    b=i;
}
if(a>c)
{
    i=a;
    a=c;
    c=i;
}
if(b>c)
{
    i=b;
    b=c;
    c=i;
}
printf("%c %c %c",a,b,c);
return 0;

}

没通过,没加语句 和getchar()函数

#include<stdio.h>
int main(void)
{
char a,b,c,i;
while (scanf("%c%c%c",&a,&b,&c))
{
getchar();
if(a>b)
{
    i=a;
    a=b;
    b=i;
}
if(a>c)
{
    i=a;
    a=c;
    c=i;
}
if(b>c)
{
    i=b;
    b=c;
    c=i;
}
printf("%c %c %c",a,b,c);
}
return 0;

}

image.png

image.png

计算两点间的距离

思路:两点点距离 用到求根号函数 double sqrt(double x); 求x的平方根,取浮点数

#include<stdio.h>
#include<math.h>
int main(void)
{
 float x1,x2,y1,y2,a;
 scanf("%f%f%f%f",&x1,&x2,&y1,&y2);
 a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
 printf("%.2f\n",a);
 return 0;
}

image.png

image.png

错误答案 但简单输出和题目中的一样

计算球的体积

思路:球的体积 4/3πr³pow指幂

#include<stdio.h>
#include<math.h>
int main(void)
{
float r;
float V;
scanf("%f",&r);
printf("%f\n",V=3.14*pow(r,3)*4/3);
return 0;
}

image.png

image.png

求绝对值

思路: 利用函数:int abs(int x) ;求x的绝对值

double fabs(double x) ;求x的绝对值

#include <stdio.h>
#include<math.h>
int main(void)
{
 double x;
 scanf("%lf",&x);
 printf("%.2lf\n",fabs(x));
 return 0;
} 

image.png

image.png

printf("%.2lf\n",fabs(x)); fabs()函数前 不用加double double fab()

成绩转换

思路:学习视频中出现过,用if else 语句

#include <stdio.h>
int main(void)
{
 int i;
 scanf("%d",&i);
 if(i>=90 && i<=100)
 printf("A\n");
 else if(i>=80 && i<=89)
 printf("B\n");
 else if(i>=70 && i<=79 )
 printf("C\n");
 else if(i>=60 && i<=69)
 printf("D\n");
 else if(i>=0 && i<=59)
 printf("E\n");
 else
 printf("Score is error!\n");
 return 0;
} 

image.png

image.png

第几天?

思路:先确定是年份是闰年还是非闰年 在确定每个月是有30天还是31天 将所有的天数相加即得结论

#include <stdio.h>
int main(void)
{
  int a[12]={31,0,31,30,31,30,31,31,30,31,30,31};//确定每个月的天数,二月因为有闰年的关系单独赋值
  int year,month,day;
  int all;
  int i;
  printf("请按 年/月/日 输入\n");
  scanf("%d/%d/%d",&year,&month,&day);
  if(year%4==0)
  a[1]==29;
  else
  a[1]==28;
  for(i=0;i<month;i++)
  all+=a[i];//月数之前的天数相加
  all+=day;//加这个月天数
  printf("%d\n",all);
  return 0;
} 

image.png

image.png

不知道为什么测试会出现小数 测试结果也和题目中的不一样 不知道缺了什么

求奇数的乘积

思路:取奇数 if(x%2 != 0) 取一个y 当x满足奇数这一条件时 循环取x y=y*x得奇数项的乘积

#include <stdio.h>
int main(void)
{
    int n,x,y;
    y=1;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&x);
        if(x%2!=0)
        y=y*x;
    
    }
    printf("%d",y);
    return 0;
​
}

image.png image.png

取循环语句 while if

平方和和立方和

思路:偶数 if(x%2==0) 奇数 if(x%2!=0)用for 循环相加得结果 连续整数需要先判断输入的两个数

哪个数在前 哪个数在后 比如 3 1 就应该变为 13 在进行相应的操作

#include <stdio.h>
int main(void)
{
    int i,j,x,y;  
    int t;
    scanf("%d%d",&i,&j);
    x=0;y=0;
    if(i>j)
    {
    t=i;
    i=j;
    j=t;
    }//将较小的数赋给第一个值
    for(;i<=j;i++)
    {
        if(i%2==0)
        x +=i*i;
        else
        y +=i*i*i;
    }
    printf("%d %d",x,y);
    return 0;
}

image.png

image.png

for 语句中 一定要有(A;B;C)如果没有A 就for(;B;C)

一定是将用户输入的较小的值当做第一个变量 即i 在把++i 使其循环相加

image.png