目录
第二种:输出num1~num2之间的随机数 num1、num2可以输入或者随机指定
第三种:通过输入关键字来决定输出num1~num2之间的随机数
一.学会创造结构体
1.创造
结构体的创造不需要内存
\
struct Stu
{
char name[10];//字符数组必须初始化
int age;
char sex[10];
double score;
};
1.表达
int main()//创造结构体STRUCT
{
struct Stu s1 = { "账上",18,"男",90.0};
printf("请输入你的信息");
scanf("%s %d %s %lf", s1.name,&(s1.age),s1.sex,&(s1.score) );//数组名就是地址所以不需要取地址符号
//printf("%s %d %s %lf", s1.name, s1.age, s1.sex, s1.score);//第一种表达方法.
//注意字符串表达是%s 字符的表达是%c
struct Stu* ps1 = &s1;//取地址道ps1中
printf("%s %d %s %lf", (*ps1).name,(*ps1).age,(*ps1).sex,(*ps1).score);//第二种表达方法.
printf("%s %d %s %lf", ps1->name, ps1->age, ps1->sex, ps1->score);
//第三种表达方法.与二种同理.但是更直观表示指针
//-> 结构成员访问操作符 结构体指针->结构体成员
//return 0;
}
3.Vs编译器自身BUG
int main()
{
int n = 0;
while (scanf("%d", &n) != EOF)
{
printf("error\n");
}
return 0;
}
二.好的代码风格
推荐书本《/高质量c/c++编程》
IF语句
1:最好跟大括号,不然容易出错
这样就会误认为else与第一个if对齐
2:判断相等 的时候最好数字放在左边
if
else if
else if
…
else
一定要这样写全了,像编译器一样,严谨一点-。-
#include<stdio.h>
int fun(int a)
{
if (a < 0)
{
return 1;
}
else if(0 == a)
{
return 0 ;
}
else
{
return -1;
}
}
int main()
{
int x = 0;
int y = 0;
scanf("%d", &x);
y = fun(x);
printf("%d\n", y);
return 0;
}
错误的
#include<stdio.h>
int fun(int a)
{
if (a < 0)
{
return 1;
}
else if(0 == a)
{
return 0 ;
}
else if(a > 0)
{
return -1;
}
}
int main()
{
int x = 0;
int y = 0;
scanf("%d", &x);
y = fun(x);
printf("%d\n", y);
return 0;
}
3.一定要注意大小写
题目
#include<stdio.h> int main() { int a = 0; scanf("%d",&a); if( (a >= 1) && (a <= 100000)) { if(a%5) { printf("NO\n"); } else { printf("YES\n"); } } else { printf("输入错误\n"); } return 0; }
error
三.赋值表达式
结果为0
四.switch语句
switch语句必须是整型表达式
1.case:
switch是用来进行多分支选择的语句,一般结构是:
switch(整型变量表达式)
{
case xx1:
// ...
break;
case xx2
// ...
break;
default:
// ...
}
当变量表达式的内容与某个case后的常量相等后,就执行该case下的语句,break表示该case以后的内容不会执行,如果没有跟break,会继续执行当前case之后的case分支。
当变量表达式的内容没有与那个case匹配,就会执行default下的内容。
switch中常用的关键字:case 、break、 default,当然case中语句比较复杂时,可能会用if进行判断。
continue是用来结束本次循环的,而switch不是循环,因此其中不能使用continue关键字。
且需要break不然会执行后面的分支
switch(条件表达式)
{
case:
{
break
}
default:
{
break
}
}
2.编程好习惯
在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
3.做题的错误
关键字具有特殊含义,不能作为变量名
static的特性
1. static修饰变量
a. 函数中局部变量:
声明周期延长:该变量不随函数结束而结束
初始化:只在第一次调用该函数时进行初始化
记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
存储位置:不会存储在栈上,放在数据段
b. 全局变量
改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用
c. 修饰变量时,没有被初始化时会被自动初始化为0
2. static修饰函数
改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用
五.缓冲区的概念
scanf和getchar从缓冲区找数据,
键盘输入密码后按回车获得\n.scanf读取道\n之前的数据,
所以getchar直接在缓冲区找打了\n,
所以直接来到if语句中的else语句,所以输出"输入错误"
.所以需要一个函数读取\n.
方法1
学会用GETCHAR 只能用一个字符
方法2
输入字符,只打印数字字符
int main()//读取字符,只打印数字字符
{
int ch = '0';
while ((ch = getchar()) != EOF)
if ((ch < '0') || (ch > '9'))
{
continue;
}
else
{
putchar(ch);
}
return;
}
六.C语言生成随机数的方法
前提:头文件包含stdlib.h
第一种:输出0~RAND_MAX之间的随机数
magic = rand();
第二种:输出num1~num2之间的随机数 num1、num2可以输入或者随机指定
int num1=100,num2=0; magic = rand()%num1+num2;
第三种:通过输入关键字来决定输出num1~num2之间的随机数
int seed=...; srand(seed); magic = rand()%num1+num2;
第四种:通过时间来控制输出num1~num2之间的随机数
srand(time(NULL)); magic rand()%num1~num2;
————————————————
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));
int ret = rand();
printf("%d\n", ret);
return 0;
}
注意"生成范围随机数公式:
很多时候我们需要生成一个带范围的随机值:例如1~100。
其实这个很简单:
srand((unsigned int)time(NULL));
int ret1 = rand() % 10 + 1;//生成1~10的随机数
int ret2 = rand() % 100 + 1;//生成1~100的随机数
int ret3 = rand() % 34 + 66;//生成66~99的随机数
int ret4 = rand() % (n - m + 1) + m;//生成m~n的随机数
七.二分查找法
int main()//在一个有序数组查找某个数
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;
int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
while (left <= right)
{
int mid = left+(right-left) / 2;//直接用left+right容易越界
if (arr[mid] < k)
{
left = mid + 1;
continue;
}
else if (arr[mid] > k)
{
right = mid - 1;
continue;
}
else
{
printf("找到了下标是%d\n", mid);
break;
}
}
if (left > right)
{
printf("没找到\n");
}
return 0;
}
八.平均数算法
一般来说不用
int avg =(a+b)/2
因为算出来的值容易越界
尽量使用
int avg=a+(a-b)/2
九.计算数组元素个数
1.数字数组计算方法
int main()
{
int arr[] = { 1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sz);
}
2..字符串数组计算方法
方法1
因为字符串结尾以'/0',所以要多一个,顾要减1个,跟数组要区分
方法2
使用strlen函数,注意要引用头文件string.h
int main()
{
char arr[] = { "abcd" };
int sz = sizeof(arr) / sizeof(arr[0])-1;
printf("%d\n", sz);
}
注意,数字数组用不了这个函数
十.程序休眠函数
Sleep(100),程序休眠100ms运行//注意大写
需要引用头文件Windows.h\
十一.清屏函数
system("cls")
需要引用头文件stdlib.h
十二.strcmp函数
两个字符串的比较是不能直接使用==//应该使用strcmp
两个字符比较是可以的
strcmp(" " , " " )如果相等则返回0
今日心得
太累了太累了,,,算是复习了之前学的,之后学到没学过的,估计要爆炸,,不过还是慢慢来,给自己定的目标就是小代码5-10分钟.增加思考能力,不过学了好多东西,感觉今天很充实.冲冲冲!