🌈博客主页:卿云阁
💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
🍈 基础必备
0️⃣数据类型和表达式
1️⃣简单的程序设计
2️⃣C语言指针的初步了解
3️⃣指针进阶(一)(C语言)
4️⃣指针进阶(二)(C语言)
7️⃣结构体与枚举类型
🍉常考的大题
1.简单的if-else-语句(一般第一题很简单的)
eg.
#include <stdio.h> int main(void) { float x,y; scanf("%f",&x); //从键盘接收x的值。 if(x<=1) y=x; if(x>1 && x<10) //逻辑表达式值为1时,执行下面的这条语句。 y=x*2.0f-1; if(x>=10) y=3*x-11; printf("%5.2f",y); return 0; }
2.实现用*画一个平行四边形
#include<stdio.h> #include<math.h> int main(void) { int i=1,j,k,r=5; //r表示行数 for(i=-1*r;i<=r;i++) { for(k=1;k<=abs(i);k++) //输出一行前的空格 { printf(" "); /*加自己的代码,abs(i)为求i的绝对值*/ } //下面输出一行中的所有*。 for(j=1;j<= 2 *(5-abs(i))+1;j++) { printf("*"); } printf("\n"); } return 0; }
3.冒泡算法
#include <stdio.h> int main(void) { int i,j,z,temp; int a[10]={1, 0, 4, 8, 123, 65, -76, 100, -45, 12}; for(j=1;j<10;j++) { for (i=0;i<10-j;i++) { if (a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } } for(z=0;z<10;z++) printf("%d ",a[z]); return 0; }
4.编程输入某班同学的姓名以及C_language、higher_mathematics两门课的成绩,并按各学生总分从高到低进行排序后输出。
分析:首先定义两个一维数组存放两门课的成绩,然后,再定义一个二维字符数组存放同学的姓名,每一行存放一个姓名。
本例通过冒泡排序算法进行排序,前面讲的冒泡算法是比较相邻两个数据,如果前者比后者小,互换两个数据。但这里要求按学生总分排序,因此,在用冒泡算法时,要把前一同学与后一个同学的总分进行比较,如果前者总分小则互换,因为这里有三个数组,互换时同一个学生的信息(包括姓名、两门课的成绩)要同时互换。同时注意到姓名是字符串,它们之间不能用赋值符号进行赋值,所以互换时要用strcpy函数。为了互换方便,先定义一个临时的一维字符数组tempName,在互换姓名时使用。整个程序代码如下。
#include <stdio.h> #include <string.h> #define LEN 20 //一个学生姓名占用的长度。 int main(void) { int i, j, N; //N为学生人数。 float C_language[N], higher_mathematics[N], temp; printf("输入学生个数:"); scanf("%d", &N); char name[N][LEN], tempName[LEN]; //第一步,用一个循环输入数据。 for (i = 0; i < N; i++) { printf("请输入第%d个同学的姓名,输完按Enter键:\n", i + 1); gets(name[i]); //接收姓名字符串。 printf("请输入第%d个同学的两门成绩,中间用空格隔开,输完按Enter键:\n", i + 1); scanf("%f%f", &C_language[i], &higher_mathematics[i]); } //第二步,用冒泡法排序。 for (j = N; j >= 1; j--) { for (i = 1; i < j; i++) /*前一个学生的总分比后一个的小,互换成绩和姓名*/ if (C_language[i] + higher_mathematics[i] >C_language[i - 1] + higher_mathematics[i - 1]) { //互换C_language中的成绩。 temp = C_language[i - 1]; C_language[i - 1] = C_language[i]; C_language[i] = temp; //互换higher_mathematics中的成绩。 temp = higher_mathematics[i - 1]; higher_mathematics[i - 1] = higher_mathematics[i]; higher_mathematics[i] = temp; //下面对姓名进行互换,要用strcpy。 strcpy(tempName, name[i - 1]); //name[i-1]看成一维数组名。 strcpy(name[i - 1], name[i]); strcpy(name[i], tempName); } } //排序完毕。 printf("\n按总分排序的结果:\n"); for (i = 0; i < N; i++) printf("%s,%3.0f,%3.0f\n", name[i], C_language[i], higher_mathematics[i]); return 0; }
strcpy函数
strcpy函数的一般形式为strcpy(字符串1,字符串2,n)。其功能是将字符串2的前n个字符复制到字符串1中,并在其后加上'\0'。如果没有n,则是把字符串2全部制给字符串1。这里字符串1必须放在可修改值的内存空间中。
例如,char str2[]="math",str1[10]; 则执行strcpy(str1,str2);后,str1就变成了串"math"。执行strcpy(str1,str2,2); 后将str2的前面2个字符复制到str1中,然后再加一个'\0',所以str1就是"ma"。
字符串之间不能直接用=来赋值,即不能写成str1=str2;进行字符串的复制。使用strcpy时,要注意存放字符串1的一维数组内存空间要大于等于字符串2字面量(即不包括\0的字符个数)加1。
strcmp函数
strcmp函数的一般形式为strcmp(字符串1,字符串2);。其功能是比较两个字符串的大小。
比较的规则是对两个字符串自左至右逐个字符比较(包括串结尾字符'\0'),直到出现不同的字符或遇到'\0'为止。如全部字符相同,则认为相等;若出现不相同的字符,则字符ASCII码值大的所在串大,否则就小。
比较的结果由函数返回,当字符串1与字符串2相等,函数返回值为0;当字符串1大于字符串2,函数返回值为正整数;当字符串1小于字符串2,函数返回值为负整数。例如,
x=strcmp("A","B"); //x是一个负整数,注意A、B不能用单引号引起。
x=strcmp("a","A"); //x是一个正整数。
x=strcmp("compare","computer"); //x是一个负整数。
x= strcmp("ab","a"); //x是一个正整数。
x= strcmp("ab","ab"); //x为0。
5.指向一维数组的指针,指针数组
指向一维数组的指针指向的类型类型是一个一维数组。定义一个指向一维数组的指针变量格式如下。
数据类型 (*指针变量名)[n];
意思是定义了一个指针变量,这个指针变量指向具有n个元素的一维数组,且这个一维数组中每个元素都是给定的数据类型。
1.ch指向由十个char类型的数据组成的一维数组
#include <stdio.h> int main(void) { char str[3][10]={"123","456","789"}; char(*ch)[10]; ch=str+1; //ch可以赋值,str不能赋值 putchar(ch[0][1]); //ch[0]就相当于一维数组名str[1] putchar('\n'); ch=ch+1; //改变ch的值可以改变不同的数据 putchar(ch[0][1]); //ch[0]就相当于一维数组名str[2] return 0; }
如果一个数组,它里面的变量全部是指针类型,且每个指针指向的数据类型相同,则称这种数组称为指针数组。定义指针数组的一般格式为:
数据类型 *数组名[n];
这实质上就是一个一维数组,只是它的元素存放的是指针值,数据类型不是其元素的数据类型,而是元素指向的数据类型。
#include<stdio.h> int main(void) { int a[3]={1,2,3}; int b[3]={20,30,40}; int c[3]={50,60,70}; int *ar[3]={a,b,c}; printf("%d\n",ar[0][1]); //ar[0]就相当于一维数组名a printf("%d\n",ar[1][1]); printf("%d\n",ar[2][1]); return 0; }
6.函数参数(特容易出读程题,把3个代码运行观察是否改变a,b的值)
#include <stdio.h> void exchange(int a,int b) //定义函数,形参为a、b,并实现a、b互换。 { int temp; temp=a; a=b; b=temp; printf("a=%d,b=%d\n",a,b); } int main(void) { int a=10,b=20; exchange (a,b); //调用函数,执行两数互换。 printf("a=%d,b=%d\n",a,b); return 0; } #include <stdio.h> void exchange(int a[],int b[]) //改动点 { int temp; temp=a[0]; //改动点 a[0]=b[0]; //改动点 b[0]=temp; //改动点 } int main(void) { int a=10,b=20; exchange (&a,&b); //改动点 printf("a=%d,b=%d\n",a,b); return 0; } #include <stdio.h> void exchange(int a[],int b[]) //改动点 { int temp; temp=a[0]; //改动点 a[0]=b[0]; //改动点 b[0]=temp; //改动点 printf("a=%d,b=%d\n",a,b); } int main(void) { int a=10; int b=20; exchange (&a,&b); //改动点 printf("a=%d,b=%d\n",a,b); return 0; }
7.结构体数组,文件的写入。
#include <stdio.h> typedef struct student { int num; char name[10]; char sex; char addr[10]; }Student; int main(void) { /*定义两个变量结构体变量stu1和stu2,并初值化stu1 */ Student stu[2]={{202018080,"qingyun",'m',"xiaoxian"}, \ {202018081,"wenzhu",'w',"xiaoxian"}}; printf("no.:%d name:%s sex:%c address:%s\n",stu[0].num,stu[0].name, \ stu[0].sex, stu[0].addr); printf("no.:%d name:%s sex:%c address:%s\n",stu[1].num,stu[1].name, \ stu[1].sex, stu[1].addr); return 0; }
从键盘输入一组字符,并它存入文件save.txt中,并在显示器上输出。
分析:以写方式打开save.txt,循环用fgetc(stdin)获取从键盘上的字符,并用一个int型变量ch接收,然后分别用fputc(ch,stdout)和fputc(ch,fp)把字符ch输出到显示器和文件中。代码如下。
#include<stdio.h> #include<stdlib.h> int main () { char filename[10]="save.txt"; FILE * stream=fopen (filename, "w") ; //以写模式打开文件。 int ch; if(NULL== stream) { printf ("Failed to open the file !\n"); exit(0); } printf ("Please input characters and press enter to finish:\n"); while ((ch=fgetc (stdin)) != '\n') //循环从键盘获取字符,遇换行符结束。 { fputc(ch, stream); //向打开的文件输出同样的字符。 fputc (ch, stdout); //向显示器输出字符。 } fputc ('\n', stdout); //向显示器输入字符,也可以不写此语句。 fclose (stream); //关闭指向save.txt文件的流。 }
执行后在显示器上的效果如下。
Please input characters and press enter to finish:
abcdefg↙
abcdefg
文件save.txt的内容显示如图11-1所示。