强制类型转换
强制类型转换有两种方法,一个乘以1.0,二是使用关键字
(一)
上才艺!
#include<stdio.h>
int main(){
int a=4,b=5;
double t;
t=(double)b/a;
printf("%f",t);
return 0;
}
(二)
我们还可以是用第二种方法
#include<stdio.h>
int main(){
int a=4,b=5;
double t;
t=b*1.0/a;//注意这里只能是b乘以1.0 这是c语言的规则 右值的数据类型一般随右值改变
printf("%f",t);
return 0;
}
只有进行数据转换之后,最终输出的t的值在正确,否则输出的只是b/a的舍弃小数部分之后的数的浮点型形式
字母随地大小“变”
差值法
我们可以使用大小字母对应的ASCII码值的大小差来是先大小字母转换
#include<stdio.h>
int main(){
char a='a';
printf("%d %c\n",a,a);
a=a-32;
printf("%d %C",a,a);
return 0;
}
注释:因为A和a的ASCII码的差值是32,而且a的ascii码值比较大,所以我们让减去2就可以得到A了。
函数法
除了我们上面谈到的这个差值法之外,我们还可以使用另一个方法即函数法,也就是通过toupper(小写化成大写)以及tolower来实现大小写互化,同时我们需要使用c头文件type,
#include<stdio.h>
#include<ctype.h>
int main(){
int a='a';
printf("%c\n",a);
a=toupper(a);
printf("%c\n",a);
a=tolower(a);
printf("%c\n",a);
return 0;
}
文件读写
可以原地将电脑里某个文件都打开并根据指令实行一系列的动作,但是不知道为啥我的电脑总是打不开文件,不知道是我有问题还是这破电脑有问题
储存动作的函数有以下几种
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式
我们先来看第一个r吧
#include<stdio.h>
void mlgb() {
FILE* fp = fopen("./touch.txt","r");
if (fp == NULL) //这里判断文件是否打开成功
{
perror("chao!la kua le!");
}
char ch = fgetc(fp);
printf("%c",ch);
fcolse(fp);
}
int main() {
mlgb();
return 0;
}
由于我们的scanf是使用的%c,所以这个程序只能打开文件并读取第一个字符,如果我们要读取文件所东西,需要一个循环
#include<sdbool.h>
char ch=fgetc(fp);
while(true){
printf("%c",ch);
if(ch==EOF){
break;
}
}
fclose(fp);
true在头文件stdbool里面。除此之外,我们还需要使用宏EOF,可以在字符读取完毕之后跳出循环,还有一个就是可以使用while(!feof(fp))feof是个函数也就是没有的意思 !feof也就是 不是没有字符 即还有字符,是不是很巧妙
关于部分单位的换算
位,字节,字,字长,MB,KB,GB,Mbps,Gbps,这几个单位可能让人很迷茫
位(bit)是一个二进制位,字节(Bytes)=8位(bit)
字(word)的定义是处理器单次可以处理的数据长度,用字节来计数,字长就是把字节化成位
1024KB=1MB 1024MB=1GB 1024GB=1TB ,8mbps=1MB,
通常来说1Gbps=1024Mbps 但也有1Gbps=1000Mbps的说法,有的测网速软件是以Mbps为单位,所以一般测出来的数字除以8就可以求出MB了。
结构体
如果我们想让输入两个学生的成绩,名字,学号等一系列乱七八糟的东西并让程序输出成绩较高的人的所有信息,我们可以使用结构体(struct),应该也可以用枚举,先来试试结构体
#include<stdio.h>
struct student{
char name[20];
long number;
int score;
}s1,s2;
int main(){
printf("请输入");
scanf("%s%ld%d%s%ld%d",&s1.name,&s1.number,&s1.score,&s2.name,&s2.number,&s2.score);//通过dev运行总结出,这个scanf引号内不得加括号输入的时候可加可不加
if(s1.score<s2.score){
printf("%s,%ld,%d",s2.name,s2.number,s2.score);
}
else
{ printf("%s,%ld,%d",s1.name,s1.number,s1.score);
}
return 0;
}
如果我们想要先输入一个决定学生数量的数字,在输入学生每位学生那么多的信息,在根据成绩大小排序,我们就需要一个数组了,但这个数组的下标是确定的,(不确定的情况我不会)咳咳咳,正事要紧,上代码!
#include<stdio.h>
struct student{
long number;
char name[20];
int score;
};
int main(void)
{
int n;
int i=0;
scanf("%d",&n);
struct student t;//这里定义工具人 用来完成下方的值数据交换
int j,i;
struct student a[100];//定义结构体变量数组,这里面储存结构体变量, 中括号里的数根据学生数多少而变
for(i=0;i<n;i++){//这里通过循环输入
scanf("%ld%s%d",&a[i].number,&a[i].name,&a[i].score);
} //下面是我们的冒泡排序法
for(j=1;j<=n-1;j++){
for(i=0;i<=n-1;i++){
if(a[i]<a[i+1]){
t=a[i];
a[i+1]=a[i];
a[i]=a[i+1];
}
}
}
for(i=0;i<n;i++){
printf("%ld %s %d",a[i].number,a[i].name,a[i].score);
}
return 0;
}
我是小学生,给我点赞转发,我劝你不要不识好歹
输入未知个数的数列————可变参数
此法需要函数介入,首先输入数列元素的个数,在输入数列的元素,这一大缺点就是比较麻烦,需要手动输入所有元素,暂时没有发现方便的方法 可变参数有可能会用到另一个头文件stdarg和这个头文件里的va_list(建立数列)va_start(初始化数列里的每一个元素)va_arg(访问数列里的元素) va_end结束访问
剩下的就是最麻烦的代码了
v#include<stdio.h>
#include<stdarg.h>
double kebiancanshu(int num, ...)//num是参数的数量
{
int i;
double he = 0.0;
va_list valist;//先定义一个可变数列
va_start(valist, num);//给数列的所有数初始化
for (i = 1; i <= num; i++) {
he = he + va_arg(valist, int);//va_arg用来访问数组的每个元素
}
printf("一共是%d个数\n",num);
va_end(valist);//清理为va_liat保留的内存
double s = he / num;
return s;
}
int main() {
printf("%f",kebiancanshu(6,9,8,7,4,5,6));
//输出数字
//6个实数 6 5 4 9 8 7的平均数是多少
return 0;
}
动态分配内存
在c99之前,如果我们想要参数按心意随意改变,我们可以使用动态分配内存
动态分配内存我们需要用到头文件stdlib
#include<stdio.h>
#include<stdlib.h>
int main(){
int *a;
int i;
int num;
scanf("%d",&num);
a=(int*)malloc(num*sizeof(int));
for(i=0;i<num;i++){
scanf("%d",&a[i]);
}
for(i=num-1;i>=0;i--){
printf("%d ",a[i]);
}
//输入的时候数字之间要用空格隔开呀 如果用逗号会错误
free(a);
return 0;
}
我们也可以使用calloc来替换malloc但是形式不太一样
calloc表示事这个样子
p=(int*)calloc(num,sizeof(int));
这个同样输入的时候要用空格隔开。