目录
2.7 while语句、do……while语句、for语句的区别
#考研数据结构必备C语言基础
1.什么是分支?
C语言是一门 结构化 的程序设计语言。
无非存在这三种结构:①顺序结构;②选择结构;③循环结构
分支语句(选择结构)
1.1 if语句
例:输入一个整数,如果该数大于60,则输出“你帅!”;
如果该数不大于60,则输出“你贼帅!”。
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
if(a>60)
{
printf("你帅!\n");
}
else
{
printf("你贼帅!\n");
}
return 0;
}
例:
#include <stdio.h>
int main()
{
int x, y;
scanf("%d", &x);
if(x<0)
y=-1;
else
if(x>0)
y=1;
else
y=0;
printf("x=%d, y=%d\n", x, y);
return 0;
}
1.2 分支语句中常见的表达式形式
例:请编一程序,判断某一年是否是闰年。(注:当年份不是100的倍数且是4的倍数时,该年是闺年;当年份是100的倍数且是400的倍数时,该年也是闰年)
#include <stdio.h>
int main()
{
int a;
printf("请输入年份\n");
scanf("%d", &a);
if((a % 100 != 0 && a % 4 == 0) || a % 400 == 0)
printf("%d年是闰年\n",a);
else
printf("%d年不是闰年\n",a);
return 0;
}
例:输入一个字符,判断它是否为大写字母,若是则将其转换成小写字母,若不是则不转换,然后输出最后得到的字符。
#include <stdio.h>
int main()
{
char ch;
scanf("%c", &ch);
if(ch>='A'&&ch<='Z')
ch=ch+32;
printf("%c\n", ch);
return 0;
}
1.3 表达式1?表达式2:表达式3
例:输入一个字符,判断它是否为大写字母,若是则将其转换成小写字母,若不是则不转换,然后输出最后得到的字符。
#include <stdio.h>
int main()
{
char ch;
scanf("%c", &ch);
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
printf("%c\n", ch);
return 0;
}
1.4 switch语句
例:某课成绩原为A、B、C、D四个等级,现要将其转成百分制分数段,规则是:A等转成85~100,B等转成70~84,C等转成60~69,D等转成<60。请编一程序,成绩等级由键盘输入,输出分数段。
#include <stdio.h>
int main()
{
char dengji;
scanf("%c", &dengji);
switch(dengji)
{
case'A':printf("该生分数为85~100\n");break;
case'B':printf("该生分数为70~84\n");break;
case'C':printf("该生分数为60~69\n");break;
case'D':printf("该生分数为<60\n");break;
default:printf("该生的等级输的不对!\n");break;
}
return 0;
}
例:某课成绩原为百分制,现要将其转成等级,规则是:90分以上为A、80~89分为B、70~79分为C、60~69分为D、60分以下为E。请编一程序,分数由键盘输入,输出等级。
#include <stdio.h>
int main()
{
double fenshu;
printf("请输入分数:");
scanf("%lf", &fenshu);
switch((int)(fenshu/10))
{
case 10:
case 9:printf("该生等级为A\n");break;
case 8:printf("该生等级为B\n");break;
case 7:printf("该生等级为C\n");break;
case 6:printf("该生等级为D\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("该生等级为E\n");break;
default:printf("该生的成绩输的不对!\n");break;
}
return 0;
}
2.什么是循环?
2.1 用while语句循环做数学运算
方法:
例:求2+4+6+……+100
#include<stdio.h>
int main()
{
int n=1, sum=0, a=2;
while(n<=50)
{
n=n+1;
sum=sum+a;
a=a+2;
}
printf("计算结果是%d\n", sum);
return 0;
}
2.2 用while语句循环
例:导演今儿选演员,有一堆人排着队一个接一个地给他表演才艺以求被选上。导演总共只肯看她们300分钟。请编程统计300分钟后,导演看了多少人。
#include<stdio.h>
int main()
{
float zongshijian=0, shijian;
int n=0;
while(zongshijian<300)
{
printf("请输入第%d个人的表演时间(单位为分钟):",n+1);
scanf("%f", &shijian);
zongshijian=zongshijian+shijian;
n=n+1;
}
printf("导演看了%d个人\n",n);
return 0;
}
例:请编程输出100~300之间(包括100与300)的数。
#include<stdio.h>
int main()
{
int n=99;
while(n<300)
{
n=n+1;
printf("%d\t", n);
}
return 0;
}
2.3 用break语句提前终止循环
例:导演今儿选演员,有一堆人排着队一个接一个地给他表演才艺以求被选上。导演总共只肯看她们300分钟。并且最多看100个人,请编程统计导演看了多少个人,总共看了多长时间?
#include<stdio.h>
int main()
{
float zongshijian=0, shijian;
int n=0;
while(zongshijian<300)
{
printf("请输入第%d个人的表演时间(单位为分钟):",n+1);
scanf("%f", &shijian);
zongshijian=zongshijian+shijian;
n=n+1;
if(n>=100)
break;
}
printf("导演看了%d个人\n",n);
return 0;
}
2.4 用continue语句提前结束本次循环
例:请编程输出100~300之间(包括100与300)不能被4整除的数。
#include<stdio.h>
int main()
{
int n=99;
while(n<300)
{
n=n+1;
if(n%4==0)
continue;
printf("%d\t", n);
}
return 0;
}
2.5 用do……while语句循环
例:求2+4+6+……+100
#include<stdio.h>
int main()
{
int n=1,sum=0,a=2;
do
{
n=n+1;
sum=sum+a;
a=a+2;
}
while(n<=50);
printf("计算结果是%d\n", sum);
return 0;
}
2.6 用for语句循环
方法:
语句1:初值变量
语句2:循环条件
语句3:自加or自减
例:
#include<stdio.h>
int main()
{
int sum, a, n;
for(sum=0, a=1, n=1;n<=20;n=n+1)
{
a=n*a;
sum=sum+a;
}
printf("计算结果是%d\n", sum);
return 0;
}
2.7 while语句、do……while语句、for语句的区别
1.do while语句和其他两种语句的区别:
1)for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)
2)do…while语句至少可以执行一次,另外两种有可能一次都执行不了
2.while语句和for的区别:
1)代码层面: while语句声明的初始化变量,在while结束之后,还能继续使用;
for中声明的初始化变量,在for结束之后,就无法使用了.
2)设计层面: 循环次数确定的话,建议使用for;循环次数不确定建议使用while。
详细例子如下:
编程计算1+2+3+……+100
- 用for循环
#include <stdio.h>
int main()
{
int i,sum=0;
for(i=1;i<=100;i++)
{
sum+=i;
}
printf("%d",sum);
return 0;
}
- 用while循环
#include <stdio.h>
int main()
{
int i=1,sum=0;
while(i<=100)
{
sum+=i;
i++;
}
printf("%d",sum);
return 0;
}
- 用do……while循环
#include <stdio.h>
int main()
{
int i=1,sum=0;
do{
sum+=i;
i++;
}while(i<=100);
printf("%d",sum);
return 0;
}
3.什么是数组?
3.1 定义一维数组
理解一维数组内部结构:
例:输入10个数(整数),对它们有小到大排序并输出排序后的结果。
#include<stdio.h>
int main()
{
int a[10];
int i, j, t;
printf("请输入10个数:\n");
for(i=0;i<=9;i++)
scanf("%d", &a[i]);
for( i=0;i<=8;i++)
for( j=i+1;j<=9;j++)
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("排序后的数字依次是:\n");
for( i=0;i<=9;i++)
printf( "%d\t",a[i] );
printf( "\n");
return 0;
}
3.2 定义二维数组
理解二维数组内部结构:
例:
思维:
#include<stdio.h>
int main()
{
int a[2][3]={1, 2, 3, 4, 5, 6};
int b[3][2], i, j;
for(i=0;i<=1;i++)
for(j=0;j<=2;j++)
b[j][i]=a[i][j];
printf("数组b为:\n");
for(j=0;j<=2;j++)
{
for(i=0;i<=1;i++)
printf( "%d\t", b[j][i]);
printf( "\n");
}
return 0;
}
3.3 定义字符数组
理解字符数组内部结构:
3.4 输出字符数组
- 挨个输出printf ("%c", )
例:定义一个字符串“hello world”,然后输出这个字符串。
#include<stdio.h>
int main()
{
char c[11]={'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
int i;
for(i=0;i<=10;i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
- 整体输出printf("%s", )
例:定义一个字符串“hello world”,然后输出这个字符串。
#include<stdio.h>
int main()
{
char c[11]={'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
printf("%s\n",c);
return 0;
}
- puts()
例:定义一个字符串“hello world”,然后输出这个字符串。
#include<stdio.h>
int main()
{
char c[12]={'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd','\0'};
puts(c);
return 0;
}
3.5 输入字符数组
- 挨个单词输入scanf("%s%s....", )
- 整句输入gets()
例:键盘输入“hello world”时,将这句话存入数组。(挨个输入)
-
#include<stdio.h> int main() { char c1[6], c2[6]; scanf("%s%s", c1, c2); return 0; }
例:键盘输入“hello world”时,将这句话存入数组。(整句输入)
-
#include<stdio.h> int main() { char char[15]; gets(c); return 0; }
例题:输入一行由空格和单词组成的字符(字符数在8O以内),请统计有多少个单词。
#include<stdio.h>
int main()
{
char c[81];
int i, dancishu=1;
gets(c);
if(c[0]==' ')
dancishu=0;
for(i=0;c[i]!='\0';i++)
if(c[i]==' '&&c[i+1]!=' '&&c[i+1]!='\0')
dancishu++;
printf("有%d个单词",dancishu);
return 0;
}
4.什么是函数?
4.1 调用有参函数
例:编写一程序,要求用户输入4个数字,输出前两个数中的最大数、后两个数中的最大数,以及四个数中的做大数。
#include<stdio.h>
int main()
{
float max(float x, float y);
float a[4];
int i;
float t, u, v;
for(i=0;i<=3;i++)
{
printf("请输入第%d个数字:", i+1);
scanf("%f", &a[i]);
}
t=max(a[0], a[1]);
u=max(a[2], a[3]);
v=max( t, u);
printf("前两个数中的最大数为%f\n", t);
printf("后两个数中的最大数为%f\n",u);
printf("四个数中的最大数为%f\n", v);
return 0;
}
float max(float x, float y)
{
return(x>y?x:y);
}
例:有两个小组,分别有5名学生和10名学生。请编程输入这些学生的成绩,并调用一个aver函数求这两个小组的平均分。
#include<stdio.h>
int main()
{
float aver(float a[], int n);
float zu1[5], zu2[10];
int i;
printf("请输入第一组的学生成绩:\n");
for(i=0;i<=4;i++)
scanf("%f", &zu1[i]);
printf("请输入第2组的学生成绩:\n");
for(i=0;i<=9;i++)
scanf( "%f", &zu2[i]);
printf( "第一组平均分是%f\n", aver( zu1, 5));
printf( "第二组平均分是%f\n", aver( zu2, 10));
return 0;
}
float aver( float a[], int n)
{
float sum=a[0], pingjunshu;
int i;
for( i=1;i<n;i++)
sum=sum+a[i];
pingjunshu = sum/n;
return(pingjunshu);
}
4.2 调用无参函数
例:请编程输出以下内容:
1234567
你是大帅比
7654321
你是大帅比
7654321
你是大帅比
#include<stdio.h>
int main()
{
void a();
void b();
void c();
a();
b();
c();
b();
c();
b();
return 0;
}
void a()
{
printf("1234567\n");
}
void b()
{
printf("你是大帅比\n");
}
void c()
{
printf("7654321\n");
}
4.3 函数的嵌套
例:请编程输入4个整数,并找出其中最大的数。
#include<stdio.h>
int main()
{
int max4(int a,int b,int c,int d);
int a,b,c,d,zuidashu;
printf("请输入4个整数:\n");
scanf("%d %d %d %d", &a,&b,&c,&d);
zuidashu=max4(a,b,c,d);
printf("最大数为%d\n",zuidashu);
return 0;
}
int max4(int a,int b,int c,int d);
{
int max2(int a,int b);
return(max2(max2(max2(a,b), c), d));
}
int max2(int a,int b)
{
return(a>b?a:b);
}
4.4 函数的递归
例:用递归方法求n!
#include<stdio.h>
int main()
{
int jiecheng(int n);
int n;
printf("请输入一个整数:");
scanf("%d", &n);
printf("%d!=%d\n", n,jiecheng(n));
return 0;
}
int jiecheng(int n)
{
int jieguo;
if(n<0)
printf("n<0, 数字输入的不对!");
else if(n==0||n==1)
jieguo=1;
else
jieguo=jiecheng(n-1)*n;
return(jieguo);
}
5.什么是指针、什么是地址?
指针:指明方向和位置的针。类似于身份证,通过身份证可以找到一个人的住址。
- 计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
- 我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。
5.1 指针变量与普通变量
指针=&变量 *指针=指针指定的变量的值
int *p,a=5;
p=&a;
int *q,b=10;
q=&b;
int c,d;
c=*p+1; 6
d=*q+1; 11
*p = 99; a=99;
*q = 100; b=100;
例:输入两个整数,按先大后小的顺序输出这两个数。请用指针来编程。
#include<stdio.h>
int main()
{
int a, b, *p, *q, *r;
printf("请输入两个整数:\n");
scanf("%d, %d", &a, &b);
p=&a;
q=&b;
if(a<b)
{
r=p;
p=q;
q=r;
}
printf("较大数为%d 较小数为%d\n", *p, *q);
return 0;
}
5.2 指针变量与一维数组
- 指针=&数组名[某数]
- *指针=指针指定的变量的值
- 指针+i = &数组名[某数=i]
- &数组名[某数] 相当于 数组名+某数
- 数组名[某数] 相当于 *(数组名+某数)
例:一个整型数组里的5个元素由键盘输入,将每个元素变为原来的两倍后再依次输出。
#include<stdio.h>
int main()
{
int a[5];
int i, *p;
p=&a[0];
printf("请输入5个整数:\n");
for(i=0;i<=4;i++)
{
scanf("%d", p+i);
*(p+i)=*(p+i)*2;
}
printf("加倍后的各整数为:\n");
for(i=0;i<=4;i++)
printf("%d\t", *(p+i));
printf("\n");
return 0;
}
5.3 指针变量与函数
例:输入两个整数,然后让用户选择1或2,选1时调用max函数输出二者中的较大数,选2时调用min函数输出二者中的较小数。
#include<stdio.h>
int main()
{
int max(int x, int y);
int min(int x, int y);
int (*p)(int, int);
int a, b, xuanze;
printf("请输入俩整数:\n");
scanf("%d, %d", &a, &b);
printf("请输入1或2:");
scanf("%d", &xuanze);
if(xuanze==1)
p=max;
else if(xuanze==2)
p=min;
else
printf("您选的不对!");
printf("结果为%d\n", (*p)(a, b));
return 0;
}
int max(int x, int y)
{
return(x>y?x:y);
}
int min(int x, int y)
{
return(x<y?x:y);
}
5.4 返回指针值的函数
例:有3名学生学习4门课,学生一的成绩分别是65、67、70、60,学生二的分别是80、87、90、81,学生三的分别是90、99、93、98。用指针函数来编程,要求在用户输入学生序号以后,能输出该学生的各科成绩。
#include<stdio.h>
int main()
{
float *chazhao(float(*hang)[4], int n);
float a[3][4]={{65,67,70,60},{80,87,90,81},{90,99,93,98}};
float *p;
int xuhao, i;
printf("请输入学生序号:");
scanf("%d", &xuhao);
printf("第%d名学生的成绩:\n", xuhao);
p=chazhao(a, xuhao-1);
for(i=0;i<=3;i++)
printf("%f\t", *(p+i));
printf("\n");
return 0;
}
float *chazhao(float(*hang)[4],int n)
{
int *q;
q=(hang+n)[0];
return(q);
}
5.5 指针与一维二维数组的数值关系
&a[i] = a + i
a[i] = *(a+i)
注:关于指针的知识还有很多,有兴趣的下去可以自学。
6.什么是struct结构体?
6.1 定义结构体
结构体的基本知识:
struct student
{
int xuehao;
char name[30];
char sex;
float chengji;
};
struct student a={001,"Zhangsan",'M',100};
上面两块合起来可以这样写:
struct student
{
int xuehao;
char name[30];
char sex;
float chengji;
}a={001,"Zhangsan",'M',100};
a.xuehao = 001;
a.name = "Zhangsan";
a.sex = 'M';
a.chengji = 100;
例:把一个学生的信息(学号:001、姓名: houge、性别:M、住址: beijing)放在一个结构体变量中,然后输出这个学生的信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
char sex;
char adress[60];
}a={001, "Zhangsan", 'M', "beijing"};
int main()
{
printf("学号:%d\n姓名:%s\n性别:%c\n住址:%s\n", a.xuehao, a.name, a.sex, a.adress);
return 0;
}
例:输入两个学生的学号、姓名和成绩,输出成绩较高者的学号、姓名和成绩。若二者相等,则输出两个学生的全部信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
float chengji;
}a, b;
int main()
{
printf("请输入第一个学生的学号、姓名、成绩:\n");
scanf("%d, %s, %f", &a.xuehao, a.name, &a.chengji);
printf("请输入第二个学生的学号、姓名、成绩:\n");
scanf("%d, %s, %f", &b.xuehao, b.name, &b.chengji);
printf("成绩较高者的信息如下:\n");
if(a.chengji>b.chengji)
printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
else if(a.chengji<b.chengji)
printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
else
{
printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
}
return 0;
}
6.2 结构体数组
基本结构:
struct student
{
int xuehao;
char name[30];
float chengji;
}xuesheng[2]={{001,"zhangsan",90},{002,"lisi",100}};
xuesheng[0].xuehao=001; xuesheng[0].name="zhangsan";
xuehsneg[1].xuehao=002; xuesheng[1].name="lisi";
例:有三名学生的3项信息:学号、姓名和成绩。请编程按成绩由高到低输出各学生的信息。信息为:001,zhangsan,99;002,lisi,20;003,wangwu,90
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
float chengji;
}xuesheng[3]={{001,"zhangsan",99},{002,"lisi",20},{003,"wangwu",90}};
int main()
{
struct student linshi;
int i, j;
for(i=0;i<2;i++)
for(j=i+1;j<3;j++)
if(xuesheng[j].chengji>xuesheng[i].chengji)
{
linshi=xuesheng[i];
xuesheng[i]=xuesheng[j];
xuesheng[j]=linshi;
}
printf("排序后的各学生信息如下:\n");
for(i=0;i<3;i++)
printf("%d\t%s\t%f\n", xuesheng[i].xuehao, xuesheng[i].name, xuesheng[i].chengji);
return 0;
}
6.3 使用结构体变量做函数参考
例:键盘输入五名学生的信息(包括学号、姓名和2门课程的成绩),并输出平均分最高的学生的信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
float fen1;
float fen2;
}sheng[5];
int main()
{
struct student max(struct student a[]);
struct student xueba;
int i;
for(i=0;i<=4;i++)
{
printf("请输入第%d名学生的学号、姓名和2门成绩:\n", i+1);
scanf("%d, %s, %f, %f", &sheng[i].xuehao, sheng[i].name, &sheng[i].fen1, &sheng[i].fen2);
}
xueba=max(sheng);
printf("平均分最高的学生信息如下:\n");
printf("学号:%d\n姓名:%s\n2门成绩:%f, %f\n", xueba.xuehao, xueba.name, xueba.fen1, xueba.fen2);
return 0;
}
struct student max(struct student a[])
{
float average[5];
int i, highest;
for(i=0;i<=4;i++)
average[i]=(a[i].fen1+a[i].fen2)/2;
for(highest=0,i=1;i<=4;i++)
if(average[highest]<average[i])
highest=i;
return(a[highest]);
}
6.4 结构体变量与指针变量
例:把一个学生的信息(包括学号、姓名、性别3项信息)放在一个结构体变量中,然后输出这个学生的信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
char sex;
}a={001, "zhangsan", 'M'};
int main()
{
struct student *p;
p=&a;
printf("学号:%d\n姓名:%s\n性别:%c\n", p->xuehao, p->name, p->sex);
return 0;