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;
}
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;
}
未被初始化的都是垃圾值
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;
}
使用取最大值函数后
#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;
}
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;
}
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;
}
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;
}
调用函数后
#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;
}
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
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;
}
第五题属实看不懂 照着第三题写的 没输出成功
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 ;
}
答案看懂了,想是真想不到
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;
}
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;
}
先判断第一步 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;
}
计算两点间的距离
思路:两点点距离 用到求根号函数 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;
}
错误答案 但简单输出和题目中的一样
计算球的体积
思路:球的体积 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;
}
求绝对值
思路: 利用函数: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;
}
printf("%.2lf\n",
fabs(x)); fabs()函数前 不用加doubledouble 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;
}
第几天?
思路:先确定是年份是闰年还是非闰年 在确定每个月是有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;
}
不知道为什么测试会出现小数 测试结果也和题目中的不一样 不知道缺了什么
求奇数的乘积
思路:取奇数 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;
}
取循环语句 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;
}
for 语句中 一定要有(A;B;C)如果没有A 就for(;B;C)
一定是将用户输入的较小的值当做第一个变量 即i 在把++i 使其循环相加