c语言for循环自定义数据类型,二级C语言操作题十种类型总结精解

注:以下内容均为从历年NCRE二级C真题(截止到2019年12月)中提炼总结,实用性强,特别适合考前强化记忆。以下所有内容均为作者原创,如有转载请注明出处(作者昵称:一介愚夫,b站UID:482284274)

一、取数字与进制转换

1、单独取数字:

令整数m,取个位的数字用m%10

取十位上的数字用m/10%10,或者m%100/10

取百位上的数字用m/100%10,或者m%1000/100

……以此类推

2、循环取数字,一般从低位到高位取最容易。程序结构是:

while(原整数m!=0)

{当前最末尾数字=m%10;

……此处将最末尾数字取出做其他用途……

原整数=原整数/10;}

3、进制转换:

2进制基数:0、1

8进制基数:0、1、2、3、4、5、6、7

16进制基数:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F

10转2、8、16:除以基数2、8、16,倒取余数

2转10:从低位开始展开为多项式,例如2进制1101转为10进制,1*20+0*21+1*22+1*23

2转8:每3位2进制数(000~111的组合)先转10进制,再转1位8进制数

2转16: 每4位2进制数(0000~1111的组合)先转10进制,再转1位16进制数

二、穷举法

1、穷举法的总体程序结构:

(1)第一种单循环,例如求水仙花数、四叶玫瑰数、某个数是不是素数、爱因斯坦阶梯等。程序结构是:

For(从最小数开始;直到最大数;数自增)

{if(该数满足某个条件(或者多个条件,用逻辑与&&,用逻辑或||,或者常用关系表达式==)

则取出该数做存储操作,或者返回逻辑表达式为真;}

(2)第二种多层嵌套循环,例如百元买百鸡、4个数字组成互不相同3位数、某范围数哪些是素数等问题

①对于百元买百鸡类型的题,

x+y+z=100;

5x+3y+z/3=100;

类似这种变量个数大于等式个数,不定方程。适合穷举法!程序结构是:

设有n个变量则有n层循环

For(变量1从最小数开始;直到最大数;数自增)

For(变量2从最小数开始;直到最大数;数自增)

For(变量3从最小数开始;直到最大数;数自增)

……

{if(变量1满足某个条件&&变量2满足某个条件&&变量3满足某个条件&&……

或者用关系表达式==)

则取出以上n个变量的值做某个操作,或者返回逻辑表达式为真;}

②求某范围的数哪些是素数,程序结构是:用二层嵌套循环

For(i=2;i<=最大数;i++)

{     设定一个标志变量flag初值=1;

For(i=2;j

If(当前数i%j==0)

{则flag=0;用break结束当层循环;}

If(flag==0){则i不是素数;}

Else {则i是素数;打印输出或者做存储}

}

三、多项式和迭代法

1、方法总结:

(1)除号两端操作数为整数是整除运算,要得到浮点数的话两端的操作数一定要是浮点数。比如1/5得0,1.0/5或者1/5.0或者1.0/5.0得0.200000

(2)类型总结

①最简单的多项式累加,例如给定i值到某个界限时求多项式和

s=0;

for( i=1; i<=n; i++)

s=s+□;//方框处为某一个复合项

②利用公式进行迭代,求多项式的和Sn,条件是直到Sn-Sn-1的绝对值小于某个值(例如0.000001)为止,例如83-3、93-3

double  s0=0.0, s1;

do

{     s1=s0;

此处各种计算多项式的某一个单项,要准确代入某一项的公式;

s1得到一个新值;

循环变量累加;

}while(fabs(s1-s0)>=0.000001);//题干是直到Sn-Sn-1的绝对值小于0.000001为止,故此处要用>=0.000001

四、排序

掌握一种排序方法即可,用于编程题,例如最简单的冒泡法。

五、递归

1、递归的本质:

函数嵌套调用,要调用的函数是函数自身。常见的结构:

int  f(int 形参)

{int 函数返回值;

If(形参满足递归条件,需要递归调用函数本身)

函数返回值=f(形参);       //或者直接return 函数返回值

else//形参不满足递归条件,递归调用结束

函数返回值=某个确定值;   //或者直接return 函数返回值

return函数返回值;}

Void main()

{int 实参;

f(实参); }

2、递归调用一般分为两个阶段:

第一阶段是从外到里重复递归调用,直到最里一层时函数调用取得一个确定值作为函数返回值;第二阶段从里到外反复返回当前层次函数调用的结果,直到最外一层。

3、递归与循环迭代的用途区别:

如果循环迭代很难轻易的计算出结果,例如存在迭代规律不好把握,初值不确定造成嵌套循环的层数不确定等问题,但可以从数学角度归纳规律,或者推导出递归公式,此时就更适合用递归。典型的递归问题有汉诺塔问题、排列和组合、集合划分等。当然,理论上递归问题也都可以用栈和迭代来实现。

六、数组与指针

1、数组与指针类型总结:

(1)一维数组:

假定数组a[n]

①求最大值、最小值:数组n个元素,先将数组a[0]赋值给最大值max(或者最小值min),再用循环依次比较a[i](从1、2、…..、n-1)是否大于max(或者小于min),是则a[i]重新赋值给max(或者min)。

②求平均值:和sum初值为0,循环每个元素并求sum=sum+a[i],最后平均值avg=sum/n;或者avg初值为0,直接循环每个元素并求avg=avg+a[i]/n。

③在数组中插入某个元素或者删除某个元素

A、如果是单个数组:

插入:要从数组最末端元素开始,依次往后挪一位置(即赋值),直到腾出要插入位置的数组单元,再插入元素到此处。

删除:要从被删除的元素开始先删除,再从后一个元素依次往前挪一位置(即赋值)

本质上是要考虑数组的每个存储单元有哪些值,怎么赋值,赋值前是否需要把原来的值复制出来到另外的存储单元。

B、如果可以创建另一个临时数组:

一般用于编程题,更便于操作。

④指针可以用数组方式来访问,例如定义数组a[10],定义*p=a,则访问数组元素可以用两种方式,一是 p[0]、p[1]…;二是*p,但需要将p向后移动(p++),向前移动(p--)来访问不同位置的数组元素。

⑤其他:例如,移动比最大值或者最小值的元素,计算低于平均数的平均数,计算数组中奇数和偶数个数的较大者及平均值,统计数组中偶数个数、偶数的平均值等等。方法都是做循环、if判断满足某个条件就再做赋值、删除等操作,核心是把控数组元素的存储单元。

注意:数组元素不要越界。

(2)二维数组:

假定二维数组a[m][n],行号下标i,列号下标j

①矩阵操作:本质上是把控行号和列号满足的条件

右上半角元素:i

左下半角元素:i>j

主对角线元素:i==j,如果行数等于列数则形如a[i][i]

反(次)对角线元素:i+j==m

周边元素:i==0||i==M-1||j==0||j==N-1

转置矩阵:一般有两个二维数组,转置矩阵b[j][i]=a[i][j]

②求二维数组的每行、每列求最大和最小值等问题

对单行或者单列的若干元素操作类似一维数组,则在内循环中参考一维数组做法,再在外面套一个循环,用另一个一维数组来存储对于内循环计算出来的最大或者最小值。

(5)二维数组与指向一维数组的指针(即行指针)的关系。见“七、字符串与指针”中的总结

七、字符串与指针

1、类型总结:

(1)改错题常见错误:函数返回值缺失、形参类型不匹配、某些关键字错误(例如For改为for)、语句结束要有分号、字符串结束标志由”\0” 改为‘\0’或者’0’ 改为‘\0’

(2)算法难度稍大的填空题、改错题:一般考语法或者比较简单的空,例如=改为==,>改为

(3)稍简单的题型:统计字符串中的字母或者数字个数、字母大小写转换、ASCII码值的大小或者奇偶性判断等

(4)同根题:例如删除字符串中最前面的若干个*(104-3),删除字符串中前面和中间的若干个*(100-3),删除字符串中最后面的若干个*(52-3);又如两个字符串交替合并,顺序合并(116-2)或者逆序合并(118-2)等。

(5)二维数组与指向一维数组的指针(即行指针)、一级指针(即列指针)的关系

例如:char a[3][10]={'abc','defg','hijkl'}, char  (*c)[10], char *max ;

c=a;

①二维数组名(行地址)可赋值给指向一维数组的指针(行指针),反过来错误因为二维数组名是常量

正确的赋值:c=a; 错误的赋值:a=c

指向一维数组的指针可以用二维数组方式访问元素

c[0][0]即是字符’a’,等价于a[0][0]  //类似真题8-1、9-1、10-1、

指向一维数组的指针取元素可赋值给一级指针

max=c[0];或者max=*(c+0);  // 见真题9-3

二维数组取列地址也可以赋值给一级指针

max=a[0];或者max=*(a+0);

②对指向一维数组的指针用二级指针方式取值

上例中**c代表字符’a’ //见真题119-2

(6)常用方法:

①单指针法或者数组下标法;

②双指针定位法,例如*p1指向字符串前面、*p2指向字符串后面,由于字符串的存储空间是顺序递增的,故p1

③新增一个数组(字符串)法:适合编程题(比双指针法好理解一点),例如删除字符串中所有的空格(空格可能不止一个)、在某个位置插入某些字符并顺序将其后字符串向后挪动等。

④注意字符串结束标志’\0’的作用:一般对字符串进行操作必定用循环判断某指针指向字符!=’\0’,接着指针向后移动,并注意循环结束后,指针最后是指向‘\0’的,类似的题目比较多;二是新生成的字符串末尾不要忘记赋值’\0’;

八、结构体

主要考点:

①单个结构体变量成员的访问35-1、58-1、112-1、117-3等

②结构体数组及成员、结构体指针、typedef类型定义、strcpy函数等相关语法。典型题目2-3:结构体数组存储了10个学生的学号及分数,求最低分:

typedef  struct  ss//结构体类型名叫struct ss,该数据类型有多个成员共同来描述一个变量

{ char num[10]; //成员1

int s; //成员2

} STU; //什么是typedef:自定义的数据类型,可理解为将struct ss定义一个别名STU

void  fun(STU a[], STU *s)

//什么是结构体数组:数组,元素是结构体型变量

//什么是结构体指针:指针,指向结构体型变量

{int i;

*s=a[0];//结构体数组的元素赋值给结构体指针指向的变量

for(i=1;i

if(s->s>a[i].s)//结构体指针s指向的变量引用成员s->s,结构体数组元素引用成员a[i].s

{*s=a[i];// 方法1:结构体数组元素整体赋值给结构体指针指向的变量

//方法2:结构体数组元素的两个成员分别赋值给结构体指针指向变量的两个成员

//s->s=a[i].s;

//strcpy(s->num,  a[i].num);//num成员是数组,不能直接赋值,用字符串拷贝

}

}

void main()

{ STU a[10]={{ 'A01',81},{ 'A02',89},{ 'A03',66},{ 'A04',87},{ 'A05',77},

{ 'A06',90},{ 'A07',79},{ 'A08',61},{ 'A09',80},{ 'A10',71}}//结构体数组定义并初始化

STU    m; //结构体变量定义

fun(a,&m);//调用fun函数,数组名a赋值给形参STU a[],&m赋值给形参STU *s

printf('最小值是:%s, %d\n', m.num, m.s);

}

九、链表

典型语法总结(基本上只考填空或改错,高频考点见红色字体部分):

typedef  struct  aa

{  int  data;//数据域

struct  aa  *next;//指针域

} NODE;//

NODE *fun(NODE * h, char  ch) //*h是链表头指针,节点类型为NODE

{

NODE  *p,*h ;

p=(NODE *)malloc(sizeof(NODE));//动态内存分配创建一个链表节点,强制转换为结构体指针型

while(p!=NULL)//当前节点不等于链表末尾

{……

p=p->next;//当前节点更新为下一个节点

……}

return h;//返回链表头指针(此外,如果该函数如果是用于创建、查找链表等操作,那么main()中调用该函数时,主函数里面调用语句也通常把头指针作为实参传递过来!例如fun(h);)

}

十、文件

1、典型语法总结(基本上只考填空或改错,高频考点见红色字体部分):

typedef  struct

{  int  num;

char  name[10];

char  tel[10];

} STU;

void fun(char  *filename, STU  n,  STU *std)// *filename是文件名, *std是指向结构体STU的指针

{

FILE  *fp,*fw,*fr;//文件指针定义关键字

char str[81]={“bcdefghijklmnopqrstuvwxyz”},ch;

fp = fopen(filename, 'rb+');//文件打开时要用文件名字符串的指针,或者类似”student.dat”字符串

fp = fopen(filename, 'r');//文件打开方式用只读

fp = fopen(filename, 'w');//文件打开方式用写入

while(!feof(fp))//文件结束标志feof

{  fputc(ch,fp);//单字符写入函数,将单个字符变量ch写入文件fp

ch=fgetc(fp); //单字符读取函数,从文件fp读取单个字符写入到ch变量

}

fputs(str,fw);//字符串写函数,将数组str写入到文件指针fw

fgets(str,n,fr); //字符串读函数,从文件指针fr读取n-1个字符存入到数组str

fwrite(&std[i], sizeof(STYPE), 1, fp)//二进制文件写函数,读取&std[i]内容到文件指针fp中

fseek(fp, -(long)sizeof(STU), SEEK_END);//二进制文件定位函数,从文件fp中定位

另,看到大段的文件操作程序,先做大方向判断,首先从文件打开方式是“r”还是“w”判断是文件的读取操作还是写入操作,再做答!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值