高效备考方法-程序设计题
- 2020 年 3 月 4 日
- 筆記
程序设计题
一、程序编程题解题技巧
1.首先仔细审题,了解题目的要求,记下题目给出的输入和输出例示,以便检验在完成指定的函数后,程序运行的结果是否正确。 2.调出源程序后,应对照函数首部的形参,审视主函数中调用函数时的实参内容,以便明确在函数中需要处理的数据对象。 3.理解试题的要求,审视主函数中调用函数的方式,若在表达式中调用函数(如把函数值赋给某个对象),则要求有函数值返回,需注意函数的类型,并在函数中用return语句返回函数值;若主函数中仅用语句形式调用函数,则需要通过形参间接地返回所得结果。 4.选择适当的算法进行编程,输入程序语句。不要忘记及时存盘! 5.编译程序,直到没有语法错误。 6.调试程序,利用试题中给出的例示数据进行输入(若要求输入的话),运行程序,用例示的输出数 据检验输出结果,直到结果相同
二、编程题的基本算法
1. 求和问题 (1)(循环控制变量)计数器的范围。 (2)和变量的初值一般为0。 (3)如是分数求和,请注意整除问题。 (4)在确保前三个条件的情况下,按编程的思路,一步步完善。 2. 求乘积问题 (1)积变量 (2)乘积表达式作分母的时候,是一个整体,请加括号。 3. 找最大值、最小值问题 (1)首先将首元素(行首、列首等)的值赋给保存最大值(或最小值)的变量,如max(或min) (2)然后将max(或min)和后面的元素一一比较,如果出现更大的值(或更小的值),则将该值赋给max(或min),直到全部比完为止,利用一个临时变量j记录max所在位置。 (3)一维数组的首元素为a[0],二维数组的首元素为a[0][0],二维数组的行首元素为a[i][0],二维数组的列首元素为a[0][i]。 例:找出2×M整型二维数组中最大元素的值
int fun (int a[][M]) { int i,j,max=a[0][0]; for(i=0;i<2;i++) for(j=0;j<M;j++) if(max<a[i][j]) max=a[i][j]; return max; }
4. 求素数问题
(1)判断一个素是否为素数。 (2)求某个范围内素数的个数、和、平方根和等。 5. 求最小公倍数、最大公约数问题
最小公倍数求法:用从1开始的数去整除,若能同时整除,则此数为最小公倍数,否则继续加1再整除,直到找到为止。
for(k=1; k++) { if(k%a==0&&k%b==0) break; }
最大公约数求法(碾转相除法) (1)将两数中的大数去除以小数,如果除不断,转入(2),若能整除,转入(3)。 (2)将小数变成被除数,它们的余数为除数,再相除。如果除不断,转入(2)。若能整除,转入(3)。 (3)则此除数为最大公约数。
int a(int x,int y) { int temp; temp=x%y; if(temp==0) { return y; } else { return a(y,temp); } }
6. 字符串问题
(1)串重新组合问题。 ①原串中去掉(或添加)一部分组成成分(如数字、*号) ②奇数或偶数重排 (2)在串中查找字符或字符串问题。 (3)前两个问题中涉及到的字符移动问题(前移、后移) (4)将串中的某些前移,某些后移,实质是先选出来,存在不同的数组中,再重新合并。 (5) 逆序。 (6)字符型的数字转换为成其面值相同的整数,并进行相关运算。如‘5’转换为数值5怎么转换?‘5’-‘0’=5 或‘5’-48=5 (7)字符大小写转换。如‘A’转换为‘a’怎么转换? ‘A’-‘a’=-32 或‘a’-32=‘A’。 7. 排序问题(假定有n个元素)
(1)冒泡排序。 从数组的首元素开始,依次对相邻的两个元素进行比较,当发现前面的数字大于(或小于)后面时就进行依次交换,从头到尾比较完一遍就挑出一个最大(或最小)的数,将其排在最后面,n个数要比较n-1遍,其中第j遍要两两相比n-j遍。 主要参数说明: i (循环次数n-1次): 0—-n-2 如果a[i]<a[i+1] {t=a[i];a[i]=a[j];a[j]=t; }则为降序 如果a[i]>a[i+1] {t=a[i];a[i]=a[j];a[j]=t; }则为升序. (2)选择排序。 选择排序分升序和降序,其中降序排序,首先从数组中挑选一个最大的元素,把它和第一个元素交换,接着从剩下的n-1个元素中再挑出一个最大的元素,把它和第二个元素交换,不断重复以上过程,直到比较完最后两个元素。 主要参数说明: i (循环次数n-1次): 0—-n-2 j (被比较元素的下标):i+1 —–n-1 如果a[i]<a[j] {t=a[i];a[i]=a[j];a[j]=t; }则为降序。 如果a[i]>a[j] {t=a[i];a[i]=a[j];a[j]=t; }则为升序 8. 逻辑与(&&)和逻辑或(||)的应用
例如:求100以内能被5整除或7整除,但不能被11整除。if((i%5==0||i%7==0)&&i%11!=0) 9. 算术运算符%与/的应用
求商用/ 求余数用% (1)截尾数问题,取一个数的后n-1位。 (2)求一个数的每一位上的数字。 (3)奇数:X%2==1;偶数:X%2==0; 10. 结构体编程问题
请区分b.score[i]与b[i].score 11. 结点引用问题
12.两个数重新合并成一个新数
13.统计字符串中单词的个数,单词中间用若干个空格隔开
请掌握指针文件相关函数及字符串相关函数的使用方法。FILE *fp;fopen(fp)与fclose(fp)对称。
三、 C编程时常犯的错误。
1.书写标识符时,忽略了大小写字母的区别
main() { int a=5; printf("%d",A); }
编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。 2. 忽略了变量的类型,进行了不合法的运算
main() { float a,b; printf("%d",a%b); }
%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。 3. 将字符常量与字符串常量混淆
char c; c="a";
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“