【似现场教学】难人【我劝你擅长】我以卑微的口吻试图教会你,(更新中)

1,基本程序知识

#include<stdlib.h>
#include<stdio.h>
//void main()
int main()
{
printf("你太帅了!\n");
//system("cls");
//system("pause");
printf("是真的吗");//输出  是真的吗
return 0;
}

/*
#include<stdio.h> 是头文件 可以理解为#include< >尖括号里需要加入库文件供程序使用 比如输入 输出功能 printf( ), scanf( )函数.
int main()是程序的入口,当程序遇到第一个花括号{ 时 程序开始 最后一个}时程序结束
写代码时注意一条语句一行(这样代码清晰易读),使用的符号是英文字符 如果分号是中文字符:程序会出错,当一条语句结束时要加上分号;
system(“cls”);时清除指令使用时上一句的 你太帅了不会显示在屏幕上 system(“pause”);是暂停指令 按下任意键后在屏幕上输出 是真的吗
printf(“是真的吗”);叫做printf函数 在这个函数的双引号里输入什么便能显示什么 双引号里的内容成为字符串 \n是换行符 如果没有你太帅了!是真的吗显示在同一行
return 0 ; 结束循环与终止程序运行的作用 函数的返回值是0 当不需要返回值的时候则使用 void main()函数
单行注释//
多行注释
/*
*/
在语句后注释我们想表明的意思能更容易理解程序
*/

2,选择语句之变量 与if

#include<stdio.h>
#include<stdlib.h>
int main()
{
 //if语      

int main()
{
	int age;
	printf("人的年龄范围\n");
	scanf_s("%d", &age);
		if (age>0&&age<150);
	{
		printf("正常范围\n");
	}
	return 0;

}

/*
C语言中判断条件非0值为真,0为假 if (0<agr<150); 加入输入的是200 则0<agr条件为真 age<150为假 最终条件为真
这样写是错的 两个判断条件得用 逻辑符号“&&” ”与“链接
*/

#include<stdio.h>
int main()
{
int b1 = 5, c1 = 8;
	if (b1 == c1)

		printf("牛牛\n"); //多条语句需要花括号 
		printf("两者相等\n"); 
  //无花括号 条件不满足 不执行第一条输出 直接执行第二条输出  如果有花括号两条都不执行  
     
int b = 100,c=54;//定义变量的时候称为初始化 int b; b=66;这样不是初始化 可以同时赋值多个同种数据类型的变量
float e = 5.45869796856858658645;
const int f = 90;//常量
printf("b c的值分别为:%d %d  %f\n",b,c,e);// %d是格式字符 将b的内容显示出来   b的值为可称为其他字符(其他字符原样输出)  #d与%d之间不用,隔开 b与c之间要 
//如果浮点型变量e的格式字符用%d则不能输出原数 单精度浮点型只能精确到小数点后六位并且(四舍五入)

// if  else语句  两种情况
if (b == c)
{
	
	printf("两者相等\n");
}
//b = 1; 出错      一个if 对应一个最最近且能匹配着的 else
else
{
	printf("两者不相等\n");
}

//判断语两种以上情况 if else else if
if(b==c)
	printf("b=c\n");
else if(b==e)
printf("b=e\n");
else
printf("没有相等的\n");


return 0;
}

/*
if(b=c)判断条件这样是错误的 =是赋值符号 ==是判断两边条件是否相等
变量相当于一种容器 如洗发水瓶子得装洗发水 如果装酱油那不符合常理int 是整型 b是一个变量 =是赋值号将右边的东西赋值给左边 int解释说b是什么东西可以存放什么物品
变量命名规则:1,可以有下划线 _ 字母 数字组合 如:_a1 2,只能是下划线或者字母开头 如 1a是错的 3,不能是关键字如:main ,int ,printf。
4,不含空格如a b错误 5,区分大小写,如PRINtf是可以的。
变量:赋值后值仍可以改变 常量:赋值后值不可以改变 如f=7 则错误
*/

2.1 变量声明周期

#include<stdio.h>
int main()
{
int a = 1;
if (a == 1)
{
	int a = 5;
	printf("%d\n",a);// 5
}

printf("%d\n", a);// 1


return 0;

}

/*
为什么变量a定义了两次却没有出错: 因为这涉及到变量的生命周期 if里的a 遇到花括号{ }便会结束
*/

3,选择语句之switch

include <stdio.h>
int main()
{
    /*
   switch语句
   switch (整型表达式)
	{
	case 整型常量表达式:
			语句;
	}
   */
    int i ;
    int j ;
    scanf_s("%d %d",&i,&j);
    switch (i)
   {
    case 1:
           printf("第一名\n"); 
        break;
    case 2:
         printf("第二名\n"); 
        break;
    case 3:
             switch (j)
           {
             case 1:
            printf("特等奖\n"); 
               break;     
             case 2:
              printf("进步奖\n");      
                    break;
           }
    case 4:
    printf("第三名\n"); 
             break;
    default:
    printf("无排名\n"); 
             break;
             
             


	
    int ball ;
    printf("进球等级90至100为A 以此类推 B C .70个无等级\n");
    scanf_s("%d", &ball);

    switch (ball/10)
    {
    case 10:
        printf("等级A\n");
        break;
    case 9:
        printf("等级 A\n");
        break;
    case 8:
        printf("等级 B\n");
        break;
    case 7:
        printf("等级 C\n");
        break;
    default:
        printf("无等级");
    }
   
}

    return 0;
    }
/*
break只跳出所在层级的switch语句

/*
break;跳出整个switch循环 得出当前符合条件的选项 假如case 10,9,8,7都没有breake则会执行到最后一条语句 也就是全输出选项等级
如果case 10到case9都没有breake则输出 等级A,B 没有对应的选项执行default语句。

*/

4,循环语句 之 while do while goto

#include<stdio.h>
int main()
{
	char a[] = { 'w','o','r','l','d' };//字符数组
	int i = 0;
 //run:
	while (i < 5) 
	{
              if(i==3)
              break;//i=3时 跳出while不再执行循环
		printf("%c \n", a[i]);
		i++;
	}

	int j = 0;
 //goto run;
	do {
     if(j==2)
     continue;//不执行j等于2这次循环,
		printf("%c \n", a[j]);
		j++;
	} while (j <5);

}

/*
当i<5时一直循环 循环体里的内容 当不满足条件则跳出循环
while语句先判断条件 如果是真则循环 do while至少会执行一次再去判断条件
if与while的区别 如果:判断条件为真,if语句只执行一次语句,而while语句会一直执行至条件为假
break是终止所在循环层 循环
continue作用是终止本次循环 j==2此时不循环 不执行 printf("%c \n", a[j]);与j++语句。
然后再回到while循环处判断条件从新运行;但是j没有++ j=2条件为真进入死循环 只输出wo
当运行到int j = 0;又跳到上面的while循环 goto 语句可以跳转到任意位置
*/

5,循环语句之for

#include<stdio.h>
int main()
{
/*
char a[] = { 'w','o','r','l','d' };

int i;
for (i = 0; i < 10; i++) //注意:用分号隔开;
{
	printf("%c", a[i]);//world烫烫?
	/*
	1,原因:i<10循环本来循环5次就可以把hello显示出来了 但是得循环10次
	2,变量存储在一个地址中;数组在内存中是连续存放的,循环数组时沿着数组最开始的变量依次往下找值,
	如果你设置循环过头了也会找到对应的值。
	简单来说 a{0}-a[4]有world来初始化 a[5]-a[9]没有初始化 但是内存中
	有遗留值 上次使用的内容没清理干净 于是就给他们“赋值”便出现乱码
*/
}


*/

//嵌套循环
int i, j;
for (i = 1; i < 10; i++) //行
{
	for (j = 1; j < i + 1; j++)//列
	{
		printf("%d * %d = %d ", i, j, i * j);
	}
	printf("\n");
}
return 0;

}

/*
嵌套循环的执行顺序: (1 )i = 1; (2) i < 10;(3)j = 1; (4)j < i + 1; (5)printf("%d * %d = %d “, i, j, i * j); (6)printf(”\n");
(7)当j<i+1不满足时j++ (8)(j = 1; (9)j < i + 1; (10)printf("%d * %d = %d ", i, j, i * j); 以此类推当j < i + 1;不满足时 到 i++在从头开始循环
*/

6,字符数组与getchar()函数

#include<stdio.h>
int main()
{
char a = 'a'; //单个字符
printf("%d %c\n",a,a);
char str[] = "sgsihiough";//多个字符称为字符串
printf("%s\n",str);

return 0;
}

/*
char 是字符类型 一个变量a只能存放一个字符(char a = ‘etyerg’;出错容量有限),单引号里的就是字符 双引号里的称为字符串
%c输出的是输出单个字符,比如,a,b,c这种。%d是输出十进制整数 字符a用%d输出是97 ,字符A用%d输出是65 参考ASCII码表
大小写之间的十进制差是32 因为char范围在整型范围内所以可以用整型字符%d输出十进制
使用多个字符就得使用数组来储存格式字符为%s
*

#include<stdio.h>
int main()
{
int c_char = 0;
char str[10] = { 0 };
printf("please input str\n");
scanf_s("%s",str,10);//数组名是首元素的地址不需要取地址符
//str=getchar();//(第一步)
printf("please input c_char\n");
scanf_s("%c",&c_char);
printf("%c\n",c_char);
return 0;
}

/*
输入abc gj只是显示abc 原因:第一次输入当遇到空格scanf_s只读取空格前面的内容,所以 gj留在了缓冲区当下一次scanf_s在读取到缓冲区的空格所以暂停读取。
所以我们需要getchar()来清除缓冲区里的空格看第一步 getchar()只能读取一个字符所以读取了空格缓冲区里还剩下gj因此字符c_char获取到g
缓冲区:相当于商人 他从产家拿货卖给客户这么一个过程。键盘输入的字符,字符串等等先缓存在缓冲区再通过scanf_s(),getchar等函数获取的过程。
getchar()函数从缓冲区获取一个字符(本质是ASCII值),返回值是整数所以可以用整型变量来接收,可获取显示字符,也可以获取到的字符如回车,换行等等转义字符会暂停获取。
当在scanf_s输入jfgjksh \n,它只读取jfgjksh这一部分 遇到空格 \n 等将其留在缓冲区 等下一次scanf_s在被调用时 缓冲区第一个是空格读取时出错 需要getchar()来
清理缓冲区 清理全部后scanf_s()才能从新输入最后处理的一定是\n因为我们输入结束后按的是回车键 输入fd空格+回车则需要两个getchar()来清理缓冲区。
*/

#include<stdio.h>
int main()
{
	int c_char = 0;
	char str[10] = { 0 };
	printf("please input str\n");
	scanf_s("%s", str, 10);//数组名是首元素的地址不需要取地址符
	printf("%s\n",str );
	while (c_char=getchar() != '\n')
	{
		continue;
	}
	scanf_s("%c", &c_char);
	printf("%c\n", c_char);
	while (c_char = getchar() != '\n')
	{
		continue;
	}
	return 0;

}

/*
当我们输入如:jfkdg dshfg fj f gh s f g h j e t y j g 得需要很多的getchar()去清理缓冲区 为了更方便使用while()循环解决。
当输入isr ghhs回车 str获取isr暂停获取 空格ghhs回车留在缓冲区 输出isr 往下运行1,c_char存储空格不等于’\n’满足条件
遇到continue不执行本次循环 ,第二次,第三次,第四次运行类似,知道第五次运行c_char存储回车等于’\n’不满满足条件,
执行下面的输入输出语句,输入t g输出t 再来个fwhile循环清除缓冲区避免残留

*/

7,逻辑与运算符

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
int main()
{
int a;
float b;
char c;

scanf_s("%d %f %c",&a,&b,&c,1);//scanf_s("%d, %f ,%c",&a,&b,&c,1);
//有逗号情况下输入第一个后按逗号继续输入   无逗号第一个后按回车键
printf("%d %f %c",a,b,c);//&是取地址符号

char     st, s[10];//10就是数组的长度
scanf_s("%c %s" ,  &st, 1,s,80); 
 //字符c输入1个,c后面跟1,s字符数组10个,所以s后面加80。 体现scanf_s的安全性
printf("%c %s",st,s );

char str[3];
scanf_s("%s",str,3);
//表示最多读取2个字符,因为buf[2]要放'\0'  str是字符数组的首地址,不需要&来取地址
printf("%s",str);

return 0;

}

/*
scanf_s输入函数是scanf()的前身,由于编译器的原因使用scanf_s更加安全
trcmp作用就是比较两个字符串在strcmp函数的圆括号中传入两个内容,分别用逗号进行隔开,如果相等,那么它就会返回一个0
*/

8,字符串函数


```cpp
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
//gets函数  输入字符串
char str[10]={0};
gets_s(str);
//puts()函数 输出字符串
puts(str);

//strcat();将str1字符数组里的字符串ok连接到str字符串的后面 
//只需输出str即可
char str1[] = "ok";
strcat_s(str,str1);
puts(str);

//strcpy 字符串赋值函数 str1的内容复制到str
strcpy_s(str,str1);
puts(str);//ok

// strncat()函数 
strncat_s(str, str1,2);//将str1中两个字符 复制到str字符数组中
printf("%s\n",str);//okok

//strcmp()函数 比较字符串  if(str==str1)错误,字符串不能用==来比较
char s[5] = "iii";
char st[] = "iii";
int a=strcmp(s,st);
printf("%d\n",a);//0  (ascii)值相等返回0 s>st返回1 s<st返回-1

//strncmp()函数
char s1[] = "itji";
char st1[] = "tidr";
int b=strncmp(s1,st1,2);
//st1 1的两个字符与s1中前两个字符比较  (ascii)值相等返回0 s1>st1返回1 s1<st1返回-1
printf("%d\n",b);//-1

//strlen()函数 测字符串长度 函数的值为字符串实际的长度(不包括 '\0' 在内)
int c=strlen(s1);
printf("%d\n", c);//4

//strlwr函数 将字符串中的大写字母转换成小写字母
char s2[] = "fjDJFSHSfjk";
strlwr(s2);
printf("%s\n",s2);

//strupr函数 转换为大写的函数
 strupr(s2);
 printf("%s\n", s2);

 //strstr函数  查找字符串的函数  函数用于判断字符串str2是否是str1的子串。
 //如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
 char t[] = "abcdefg";
 char f[] = "bc";

 char* ret = strstr(t,f);

 if (ret == NULL) {
	 printf("Can not find!\n");
 }
 else {
	 printf("%s\n", ret);  //输出 bcdefg
 }
return 0;
}

/*
字符串函数得用#include<string.h>头文件 提示 可能没有为字符串添加零终止符 是因为字符串数组没有初始化
注意:将第二个函数复制 链接等等于第一个函数,第一个函数的内存得大于它两的总内存
*/

9,数组

#include<stdio.h>
int main()
{
int array[6] = { 1,4,5,7,7,5};
printf("%d\n",array[2]);
array[2] = 111;
printf("%d\n", array[2]);

//字符数组
char str[] = "ewrtewtt";
str[2] = 'i';
printf("%s\n",str);// ewitewtt
printf("%c\n", str[2]);// i

}

/*
数组:相同数据类型 数据的集合 array[2];输出的是5 下标+1则对应数组的元素
数组元素的个数也可以改。 当[]里没有数字 会自动分配长度 有时则限制长度
*/

10,自定义函数

#include<stdio.h>
void c_prin(int girl)
{
printf("你有%d个女朋友\n",girl);
}
int product(int a, int b)
{
int u = a * b;
	return u * a;//5*4*5

}
int main()
{
int g = 66;
c_prin(g);
int c = product(5,4);
printf("%d",c);

return 0;
}

/*
避免用一个菜单,需要重复打原来的代码 void c_prin(int girl)是一个自定义函数((void函数返回类型(无返回值)) (c_prin函数名) (int girl形参 int形参类型))
c_prin(g);里面的g是实参 后面的圆括号是标准的格式,圆括号后面的花括号中就编写这个自定义功能的代码, 表示这个自定义函数有什么功能。menu();调用自这个定义函数。
a,b都是整数所以 返回值得需要int 来接受 当函数运行到 product()函数时便会调用函数 函数通过return 将运算结果传给int返回值 在返回给product函数,再赋值给c。
*/

11,指针与多重指针

#include<stdio.h>
int main()
{
int* ptr;//创建int类型的指针 整型指针 指针名:ptr
int a = 5;
ptr = &a;//&取地址符 将a的地址赋值给ptr ptr拥有对a直接操控的权限
printf("a的值为:%d\n", a);// 5
*ptr = 36;//*取值符号   * 号对这个变量地址的内容进行更改。
printf("此时a的值为:%d\n",a);// 36

int**ptr1;//多重指针 指向指针的指针  *ptr1也是一个变量 也有内存地址
ptr1 = &ptr;// 
printf("二重指针值:%d\n",**ptr1);// 36

return 0;

}

/*
ptr1指向指针*ptr *ptr指向变量a 最终ptr1操控的就是变量a 以此类推
*/

12,结构体

#include<stdio.h>
struct student
{
int ID;
int grade;

}xiaowang,xiaoniu;//第一种方法
int main()
{
struct student xiaoge, xiaomei {7583773,97};//第二种方法
xiaoge.ID = 190004356;
xiaoge.grade = 99;
printf("xiaoge ID为:%d\n", xiaoge.ID);
printf("xiaoge grede为:%d\n", xiaoge.grade);

printf("xiaomei ID为:%d\n", xiaomei.ID);
printf("xiaomei grede为:%d\n", xiaomei.grade);

return 0;

}

/*
我们平时使用的数据类型有 int float char 等等 我们也可以创建自己的数据类型
student是结构体名 xiaowang,xiaoniu分别是结构体变量名1,结构体变量名2
结构体变量名声明的两种方式 看上方
点.可以理解为访问的意思 如xiaoge.ID 访问xiaoge的ID
直接连着结构体的结构体变量名不能直接赋值 建一个结构体变量名则可以直接赋值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值