循环嵌套
#include <stdio.h>
int main(){
int i,j;
for (int i = 1; i<= 9, i++;) {
for (int j = 1; j <= i; j++) {
printf("%d*%d=%d", i, j, i * j);
}
}
printf("\n");
}
#include <stdio.h>
int main() {
float f = 1;
int n;
for (n = 1;; n++){
f *= n;
if (f > 1000)break;//积大与1000,跳出循环
}
printf("n=%d,%d!=%f\n", n, n, f);
}
如果在给定区间内进行操作,一般用for循环;
步长:1 2 3 1 i++ i=i+1
1 3 5 2 i+=2 i=i+2
1 4 7 3 i+=3
continue语句是跳过循环体中剩余的语句,强行执行下一次循环
#include <stdio.h>
int main() {
int i = 0;
int n;
for (n = 1; n <= 100; n++) {
if (n % 5 == 0)
continue;
printf("%3d,n");
i++;
if (i % 10 == 0)printf("\n");
}
}
素数,只有1和他本身
两种区间方式。数本身到它的一般
根号10 1----根号10之间
判断m是不是素数
#include <stdio.h>
#include <math.h>
int main()
{
int i,m,k;
scanf_s("%d",&m);
k = (int)sqrt(m);//开根号sqrt是小数,所以在前面加了int变成整数
for (i = 2; i <=k; i++)
if (m % i == 0)break;
if (i >k+1)
printf("%d是素数。\n",m);
else
printf("%d不是素数。\n",m);
}
偶数一定不是素数
求100~200之间的素数,并且统计素数个数
#include <stdio.h>
#include <math.h>
int main()
{
int i, m, k, n = 0;
for (m = 101; m <= 200; m = m + 2) {
k = (int)sqrt(m);
for (i = 2; i <= k; i++)
if (m % i == 0)break;
if (i >=k + 1) {
printf("%5d", m);
n = n + 1;
}
if (n % 10 == 0)
printf("\n");
}
printf("\n共有%d个素数。\n", n);
}
sqrt根号 fabs绝对值
#include <stdio.h>
#include <math.h>
int main()
{
int s = 1;
float n = 1.0f, t = 1.0f, pi = 0.0f;
while ((fabs(t)) >= 1e-6) {
pi = pi + t;
n = n + 2;
s = -s;
t = (float)s / n;
}
pi = pi * 4;
printf("pi=%-10.6f", pi);
}
1234
1234/100=12//取前面的
1234%100=34//取余
#include <stdio.h>
#include <math.h>
int main()
{
int k, m, n;
printf("以下这些数满足条件:\n");
for (k = 1000; k < 10000; k++) {//四位数k的取值范围1000~9999
n = k % 100;//截止k的后两位数存于n
m = k / 100;//截止k的前两位数存于n
if ((m + n)*(m + n) == k);//判断k是否符合条件
printf("%d",k);
}
第一遍看着题目自己写,遇到不会和忘记了,就看看书;
第二遍看看书和网课,分析怎么做题的,然后再去推到重做一遍;
第三遍如果还是有不记得的,就照抄,找出问题出在哪里了;
3月13日以上
巩固一下基础
float是单精度浮点型
double是双精度浮点型
""双引号是字符串,"单引号是字符型
做了两道循环嵌套的题,一道数组的题
#include <stdio.h>
int main(){
int a, b, i, n;
printf("以下这些数是亲密数:\n");
for (a = 1; a < 3000; a++) {//穷举3000以内的全部整数
b = 0;
for (i = 1; i <= a / 2; i++)
if (a % i == 0)b += i;//计算数a的各因子,将各因子之和存于b
n = 0;
for (i = 1; i <= b / 2; i++)
if (!(b % i))n += i;//计算b的各因子,将各因子之和存于n
if (n == a && a < b)
printf("%4d %4d\t",a,b);
}
当天和同学卢标讨论题目,学到了一下做题的方法和解题的思路
14日以上
15日被专升本的消息搞的人心惶惶,晚上久违去跑了8公里放松一下心情
#include <stdio.h>
void main(void) {
int x, y, z, j = 0;
printf("下面是百钱买鸡的答案:\n");
for (x = 0; x <= 20; x++)//外层循环控制公鸡数x在0~20之间变化
for (y = 0; y <= 33; y++) {//内层循环控制母鸡数y在0~33之间变化
z = 100 - x - y;//内层循环控制下,雏鸡数受x,y值的制约
if (z % 3 == 0 && 5 * x + 3 * y + z / 3 == 300)//验证z值的合理性及该组解的合理性
printf("%2d:公鸡=%2d母鸡=%2d雏鸡=%2d\n", ++j, x, y, z);
}
}
#include <stdio.h>
void main(void) {
int i, a[5];
float s = 0, ave;
printf("请输入五个整数: \n");
for (i = 0; i < 5; i++)
scanf_s("%d",&a[i]);
for (i = 0; i < 5; i++)
s += a[i];
ave = s / 5.0f;
printf("平均值为:%4.2f\n", ave);
}
一维数组的定义
由一组类型相同的相关数据项构成的集合称为数组(array),在内存中占据连续的存储空间;构成数组的数据类型称为数组的元素(elements of array)。同一数组中的元素,具有相同的数据类型
定义一维数组的语法格式:
储存类型 数据类型 数组名[数组长度]
储存类型是auto类型或者static类型,缺省时系统默认为auto类型。如果定义为auto类型,数组存放在动态存储区;如果定位为static类型,数组存放在静态数据区。
数据类型表示的是数组中个元素的数据类型,可以是任何基本类型和构造类型。但同一数组中个元素必然是同一个数据类型。
定义数组时,数组长度是数组中元素的个数,只能用常量或符号常量表示,不能是变量和包含变量的表达式
数组的下标从零开始,没有给数组赋值时,单元内存储的值是随机的。
花括号中的数据要与定义的数据类型相同,否则就会系统会继续数据类型转换。
可以只给数组的前一部分元素赋值。例如‘int a【6】={0,3,2};’数组前三照常赋值,后三由系统赋值成0;
在定义时如果对数组全部元素赋值,就可以省略数组的长度。
#include <stdio.h>
void main() {
int i, a[10];
for (i = 0; i <= 9; i++)
scanf_s("%d,&a[i]");
for (i = 9; i >= 0; i--)
printf("a[%d]=%d ",i,a[i]);
}
#include <stdio.h>
#define N 10
void main() {
int i;
float a[N], max, min;
printf("请输入十个数据:\n",N);
for (i = 1; i <= N - 1; i++)
scanf_s("%f,&a[i]");
max = min = a[0];
for (i = 0; i <= N - 1; i++) {
if (a[i] > max) max = a[i];
if (a[i] < min) min = a[i];
}
printf("max=%f\t min=%f\n ",max,min);
}
冒泡排序:交换排序
#include <stdio.h>
#define N 10
void main() {
int i, j, t, a[N];
printf("请输入%d个待排序的数据:\n", N - 1);
for (i = 1; i < N; i++)
scanf_s("%d,&a[i]");//输入数组元素的值
for (i = 1; i <= N - 1; i++)//控制轮数,共N-1轮
for (j = 1; j <= N - i; j++)//控制每轮的比较次数,共N-1轮
if (a[j] > a[j + 1]) {//比较相邻元素,将较大值后移
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
printf("\n排序后的数据为:\n");
for (i = 1; i < N; i++);
printf("%d ", a[i]);
}
#include <stdio.h>
void main() {
int j, i, a[4][5];
for (j = 0; j < 5; j++)
for (i = 0; i < 4; i++)
a[i][j] = i * j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++)
printf("a[%d][%d]=%2d ", i, j, a[i][j]);
printf("\n");
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}
二维数组在内存中是按照先行后列的顺序存放数组元素的
用来存放字符型数据的数组是字符数组
在c语言中,每一个字符串,都是以\0结尾的
getchar()输入一个字符
putchar()输出一个字符
gets()输入一个字符串
puts()输出一个字符串
2024/3/16日
#include <stdio.h>
void main(){
static char c[11] = {'I',' ','a','m',' ','h','a','p','p','y','!'};
int i;
for (i = 0; i < 11; i++)
printf("%c", c[i]);
printf("\n");
}
#include <stdio.h>
void main() {
char ch, st[50];
int i = 0, words = 0, flag = 0;
printf("请输入一行英文句子:\n");
gets_s(st);
while ((ch = st[i] != '\0')) {
if (ch == ' ')
flag = 0;
else if (flag == 0) {
flag = 1;
words += 1;
}
i++;
}
printf("该句子有%d个单词。\n",words);
}
一个字符序列组成的集合就形成了一个字符串,字符串是用字符数组来存放的。
\0作为字符串结束标志,系统会自动在字符串的后面加上字符\0
将一个字符串常量赋给一个字符数组时,首先要保证该字符数组长度足够大,如果有长度为n的字符串,那么字符数组ch的最小长度应该为n+1
字符数组可以没有花括号{}可以没有定义长度【10】
当用字符形式存储式,末尾有一个反斜杠\0代表是字符串
c语言并不要求字符数组的最后一个字符为空字符\0,但是在存储字符串时,最后一定包含一个空字符\0
字符串用字符数组存储
字符用%c存储,%c接受的是一个字符
%s格式输入的是字符串,遇到回车符或者空格符就结束本次输入。
如果字符数组中包含不止一个\0,则以第一个\0作为输出结束标志。
结束标志\0不是输出字符,只会输出\0前一个字符为止
必须使用字符数组名作为printf()函数的输出参数。
%s,不用取地址符
for(i=0;ch[i]!='\0';i++)
printf("%c",ch[i]);
printf(“%s”,ch)
puts()函数
将以\0为结束标志的字符串输出到终端。
char str【20】=“people”
puts(str)
gets函数
gets(str)
strcat()函数
语法格式(字符数组,字符串)
将字符串连接到字符数组中存放的字符串的后面,并存储在字符数组中。
char s1【30】=“hello”;
char s2【10】=“jack”;
strcat=(s1,s2)
puts(s1);
输出 hellojack
执行时,系统现将数组s1后面的\0删除,然后在新的字符串的后面加上\0
字符数组的长度要足够大,以便存放新字符串。
2024年3月17日以上
strcmp()函数
功能:比较两个字符串的大小。比较两个字符串各个字符的ASCII值
如果字符串1=字符串2,则函数值为0;
如果字符串1>字符串2,则函数值为1;
如果字符串1<字符串2,则函数值为-1;
不能使用关系运算符比较两个字符串的大小
例:if(sl>good)//错误
strcpy()函数
功能:将字符串复制到字符数组中,函数返回字符数组的起始地址。
在c语言中不能直接将字符串或者字符数组用赋值号赋值给一个已经定义过的字符数组;
只能使用strcpy函数实现赋值:
strcpy(str,"computer")
在使用以上函数的时候,要包含头文件string.h
strlen()函数
功能:求字符串的长度,不包括\0在内
strlwr()函数
功能:将字符串中的大写字母转换为小写字母。
strupr()函数
功能:将字符串中的小写字母转换为大写字母
define 预编译,全局定义
#include <stdio.h>
#define NUM 255
int main() {
int i;
char c, ident[NUM + 1];
printf("请输入字符串:\n");
for (i = 0; i < NUM; i++) {
if ((c = getchar() >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c == '_'))
ident[i] = c;
else if (c == ' ' || c == '\n') {
i++;
break;
}
else goto error;
}
ident[i] = '\0';
if (ident[0] < '0' || ident[0]>'9')printf("标识符为:s\n", ident);
if (ident[0] < 'A' || ident[0]>'Z' && ident[0] < 'a' && ident[0] != '_' || ident[0]>'z')
error:printf("不是标识符!\n");
}
算数运算符优先级最高,关系运算符居中,赋值运算符最后
返回类型 函数名(数据类型 参数1,数据类型 参数2,){
函数体
【返回结果;】//返回什么类型的值,函数就是什么类型
}
void//空类型 函数就不需要返回值,既不需要return 语句
其余类型跟变量类型对应
int Max(int a,int b){
int max=a;
if(b>max){
max=b;
}
printf("%d",max);
//return max;// return 什么,就代表这个函数的值是多少
}
return语句执行完之后,函数剩余部分不再执行,也就是函数执行结束
函数要先声明后调用,而函数的定义可以放在任意位置。
函数调用结束后向调用者返回一个执行结果,该结果称为函数的返回值
当自定义函数定义在main函数之后时,需要在调用之前声明函数;
如果不声明,就需要将函数定义在main函数之前;
3月18日
如果定义函数时没有制定函数的类型,将自动定义为int类型
【#include <stdio.h>
int main() {
float avg(float a[], int n);//求和要用float类型储存
int i;
float sum = 0;
float avg;
for (i = 0; 1 < n; i++) {
sum += a[ i];
}
avg=sum / i;
printf("");
return avg;//函数是什么类型就返回什么类型
}】
#include <stdio.h>
#define N 5//定义了一个常量N为5
float aver(int b[], int n);
int main() {
int i, a[5];
float ave;
printf("请输入五个整数:\n");
for (i = 1; i < N; i++)//对数组赋值,需要下标索引,for的循环条件:区间;
scanf_s("%d", &a[i]);//对数组操作,i仅仅代表下标
ave = aver(a, N);
printf("\n平均值为:%4.2f\n", ave);
}
float aver(int b[], int n) {
int i;
float s = 0;
for (i = 0; i < n; i++)
s += b[i];
return s / n;
}
1.对数组进行操作时,要用下标索引(定位)
2.输入输出语句,输出什么类型的数据,输出的是谁。
3.数组作为参数传到函数中时,只需传入数组名。
4.return后面可以跟表达式
3月19日以上
函数声明,在调用函数之前,声明所要调用的函数
可以在调用函数之内声明,也可以在程序开始处声明。
如果定义函数的时候没有指定函数的类型,将自动定义为int类型
在调用函数中对被返回的函数进行声明,目的是使编译系统知道被调用函数返回值的类型、函数名、以及形参的类型、个数,以便按类型对返回值作相应的处理。
以下几种情况可以省略对被调用函数的函数声明:
当被调用函数出现在它的调用函数之前时
把该函数的头文件用include命令包含在源文件前面即可。
直接使用函数名。调用格式为函数名():
welcome();
函数的调用出现表达式中。调用歌颂为“变量名=函数名(实参列表)”
m=average(a,b,c);
函数调用还可以作为函数参数。
printf(“average=%f”,average(a,b,c));
在参函数定义的时候,函数声明中的参数称之为形式参数(简称为形参),各参数用逗号隔开。
在函数调用时,写在函数名后面括号中的参数,称之为实际参数(简称为实参)。
用人话来讲,函数声明和定义的时候,括号里面的是形参。
函数调用的时候,运行起来的括号内就是实参。
实参的值不随形参的变化而变化
形参变量只有在函数调用时才分配存储单元,在调用结束后,即刻释放所分配的存储单元。
无论实参是何种类型的变量,在进行函数调用的时候,它必须具备有确定的值,以便把这些值传送给形参。
实参和形参在数量、类型、顺序应严格一致。
数组元素作为参数使用。数组元素与普通变量并无区别。
数组名作为函数的形参和实参使用。
形参数组取得了首地址之后,它与实参数组为同一数组,共用一段存储空间。如果形参的值改变了,返回到调用函数时,实参数组的值也发生了改变。
形参数组和实参数组的类型必须一致。
形参数组和实参数组的长度可以不相同,因为在调用的时候,只传递首地址而不检查形参数组的长度。
3月20日以上
c语言不允许函数嵌套定义,各函数之间是独立平行的,但是c语言允许函数嵌套调用。
n%2==0 关系表达式的值判断条件是否成立(true/false)。(<>==)布尔类型只有真和假两个值
n%2 算数运算符的值 来判断条件是否成立(非零为真)(+-*/)
一个函数直接地或者间接地调用它自身称之为函数的递归调用,这种函数称之为递归函数。
21日准备英语测试22日英语测试
函数中的变量按照作用域(即指变量在程序中的有效范围)可以分为局部变量和全局变量
局部变量,也称内部变量,它是在函数内部定义的。作用域仅限与函数内,离开定义它的函数后再使用该函数就是非法的。
main函数定义的变量也只能在main()函数中使用,不能在其他函数中使用。
形参也是一种局部变量。
允许在不同的函数中使用相同的变量名,因为他们代表着不同的对象,分配有不同的存储单元,互不干扰。
在复合语句中定义的变量,其作用域只在复合语句范围内有效。
全局变量的作用域
同一文件中如果全局变量和局部变量同名,函数内局部变量有效,此时全局变量被屏蔽;函数之外,全局变量有效。
需要扩充全局变量的作用域时,就需要声明全局变量。
若在文件开头定义全局变量,则全程有效;如果不在文件开头定义,又想在定义点之前使用该全局变量,只要在函数中使用extern进行声明,即可对该变量的作用域进行扩充。
局部变量的定义和声明是同一个概念,不加以区分;全局变量只能定义一次,但可以多次声明。
定义的时候可赋初值,但声明时不能赋初值,只能表明在该范围内要使用全局变量,声明的一般格式。
变量声明和变量定义的区别,定义变量即给变量分配存储单元、变量声明只是说明变量的性质,并不分配存储空间。
根据变量的作用域不同,可以将变量分为全局变量和局部变量。如果从变量的存在时间来区别,可以分为静态储存方式和动态储存方式。
int main() {
double f, c;
printf("输入温度:");
scanf_s("%lf",&f);
c = (5.0 / 9.0) * (f - 32);
printf("%.3lf",c);
}
32位-32根地址线-物理线-通电-1/0
64位
电信号转换成数字信号:1和0组成的二进制序列
bit,byte,KB,MB,GB,TB,PB
3月21日以上
买了作业,之后几天基本在写作业,没怎么看网课啊
指针大小在32位平台是4个字节,64位平台是8个字节
#include <stdio.h>
struct stu {
char name[20];
int age;
double score[30];
};
int main() {
struct stu s = { "张三",20,85.5 };//结构体的创建和初始化
printf("1:%s %d %lf\n",s.name,s.age,s.score);//结构体变量.成员变量
struct stu* ps = &s;
printf("2:%s %d %lf\n", (*ps).name, (*ps).age, (*ps).score);
printf("3:%s %d %lf\n", ps->name, ps->age, ps->score);
}
编号--地址(指针变量)--指针
指针类型的意义
1.指针类型决定了:指针解引用的权限有多大
2.指针类型决定了:指针走一步,能走多远(步长)(char +1,int +4,double +8)
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
int *p;//p是一个局部的指针变量,局部变量不初始化的话,默认是随机值
*p=20//非法访问内存
2.指针越界访问
当指针指向的范围超出数组的范围时,p就是野指针
3.指针指向的空间被释放
如果规避野指针
1.指针初始化
2.指针越界
3.指针指向空间释放即使置NULL
4.指针使用之前检查有效性