关于这个实验2,考察的知识点不难,就是有关一维数组、二维数组、字符串的知识。题目难度上中等偏上(对于一个初学程序设计的student来说),很综合全面地考察了对一维数组、二维数组、字符串的理解。
A题(有序数列插入数)考察有序数列的插入排序,涉及一维数组的使用,难度不大。
B题(十进制转二进制)考察将十进制通过循环除二取余并将余数存储在数组中,将数组反向输出从而“转换”成二进制,难点在于对于负数的处理,可以通过先将十进制数字“转换”成二进制,最后在二进制结果前面填上一个负号实现。
C题(矩阵对角线求和)考察二维数组及位于矩阵主副对角线上的元素位置上的规律的理解。对于3*3矩阵主对角线上的元素,其所在的行数等于其所在的列数,而对于矩阵副对角线上的元素,其所在的行数与列数之和为一定值2(即3-1,对于n*n的矩阵副对角线上的元素其行数与列数之和为n-1),从而解决问题。
D题(井字棋)考察二维数组及对题意的理解。我的方法是分情况逐个元素判断并使用状态变量flag对“No winner”的特殊情况进行判断。
先简述一下题目:
KiKi和BoBo玩 “井”字棋。也就是在九宫格中,只要任意行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。请根据棋盘状态,判断当前输赢。
输入描述: 三行三列的字符元素,代表棋盘状态,字符元素用空格分开,代表当前棋盘,其中元素为K代表KiKi玩家的棋子,为O表示没有棋子,为B代表BoBo玩家的棋子。
输出描述: 如果KiKi获胜,输出“KiKi wins!”; 如果BoBo获胜,输出“BoBo wins!”; 如果没有获胜,输出“No winner!”。
我写的代码:
#include <iostream> using namespace std; int main() { char a[3][3]; int i,j,flag=0; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cin>>a[i][j]; } } for(i=0;i<3;i++) { if(a[i][0]==a[i][1]&&a[i][1]==a[i][2]&&a[i][0]!='O') { if(a[i][0]=='K') { cout<<"KiKi wins!"<<endl; }else { cout<<"BoBo wins!"<<endl; } flag=1; break; } if(a[0][i]==a[1][i]&&a[1][i]==a[2][i]&&a[0][i]!='O') { if(a[0][i]=='K') { cout<<"KiKi wins!"<<endl; }else { cout<<"BoBo wins!"<<endl; } flag=1; break; } } if(a[0][0]==a[1][1]&&a[1][1]==a[2][2]&&a[0][0]!='O') { if(a[0][0]=='K') { cout<<"KiKi wins!"<<endl; } else{ cout<<"BoBo wins!"<<endl; } flag=1; } if(a[0][2]==a[1][1]&&a[1][1]==a[2][0]&&a[0][2]!='O') { if(a[0][2]=='K') { cout<<"KiKi wins!"<<endl; }else { cout<<"BoBo wins!"<<endl; } flag=1; } if(flag==0) cout<<"No winner!"<<endl; return 0; }
虽然很麻烦,但实在没想出好的方法。
E题(字符串连接)考察字符串/字符数组的使用及有关字符串的知识。由两个字符串合并组成的新字符串末尾没有结束符‘\0’,需要填上‘\0’作为结束符。
F题(文章统计:有一篇文章,共有三行文字,每行有80个字符,要求分别统计出英文大写字母,小写字母,数字,空格以及其他字符的个数)考查字符串/字符数组的使用及有关字符串的知识。需要注意的是gets函数在无指令的情况下只能读取并输入一行字符串,只有在有循环的前提下才能读取多行字符串,如定义一个char型的字符数组str[3][100],则需用一个for循环,定义一个循环变量i,使得gets函数能够逐行读取字符串并输入字符串:gets(str[i])