您的位置:首页 > 其它

2008年北京航空航天大学上机题

2013-04-17 11:18 190 查看
可能不完善,不保证完全正确,仅供参考。

1.素数

输入一个整数,要求输出所有从1到这个整数之间个位为1的素数,如果没有则输出-1(30分)

#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[])
{
int n, count = 0, bound;
scanf ("%d", &n);
bound = (int)sqrt(n) + 1;//判断素数的边界
for (int i = 11; i < n; i += 10)//1不是素数,所以从11开始判断
{
int flag = 0;//标志整数i有没有被整除
for(int j = 3; j <= bound; j ++)
{
if(i % j == 0)
{
flag = 1;
break;
}
}
if (flag == 0)//没被整除,则为素数
{
count ++;
printf ("%d ", i);
}
}
if (count == 0)
printf("-1\n");
else
putchar('\n');
return 0;
}


2.旋转矩阵

任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。

要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。(60分)


#include <stdio.h>
#define MAX 9
int array0[MAX][MAX], array1[MAX][MAX];

int main(){
int i, j, n;
while (scanf ("%d", &n) != EOF){
//接收第一个矩阵
for (i = 0; i < n; i ++){
for (j = 0; j < n; j ++){
scanf ("%d", &array0[i][j]);
}
}

//接收第二个矩阵
for (i = 0; i < n; i ++){
for (j = 0; j < n; j ++){
scanf ("%d", &array1[i][j]);
}
}

while (1){
for (i = 0; i< n; i ++)//0度判断{
for (j = 0; j < n; j ++){
if (array0[i][j] != array1[i][j]){
break;
}
}
}
if (i == n && j == n){
printf("0\n");
break;
}

for (i = 0; i< n; i ++)//90度判断{
for (j = 0; j < n; j ++){
if (array0[i][j] != array1[j][n - i -1]){
break;
}
}
}
if (i == n && j == n){
printf("90\n");
break;
}

for (i = 0; i< n; i ++)//180度判断{
for (j = 0; j < n; j ++){
if (array0[i][j] != array1[n - i -1][n - j - 1]){
break;
}
}
}
if (i == n && j == n){
printf("180\n");
break;
}

for (i = 0; i< n; i ++)//270度判断{
for (j = 0; j < n; j ++){
if (array0[i][j] != array1[n - j -1][i]){
break;
}
}
}
if (i == n && j == n){
printf("270\n");
break;
}
printf ("-1\n");
break;
}
}
return 0;
}


3.字符串匹配

从string.in中读入数据,然后用户输入一个短字符串。要求查找string.in中和短字符串的所有匹配,输出行号、匹配字符串到string.out文件中。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。(60分)


【貌似有点小问题。。】

//比较方法是:必须从文件中把一行之内的字符串读到一个字符数组中,
//然后再和匹配数组进行匹配。不能直接对文件一个一个字符的匹配,
//否则,当不匹配时,需要移动到上一个匹配字符串的第二个字符比较困难
//行号在读入字符串时就应该有个变量来表示
//模式匹配只需匹配一个字符,然后跳出模式匹配
#include <stdio.h>
#include <stdlib.h>

FILE* in = fopen("D:\\string.in", "rt+");//打开文件string.in
FILE* out = fopen("D:\\string.out", "wt+");//打开文件string.out

void compare (char* x, char* y, int n)//x为匹配字符串,y为文件字符串,n为行号
{
if(out == NULL)
{
printf("\nerror on open D:\\string.out!");
getchar();
exit(1);
}
int i = 0, j = 0, k = 0, m, flag = 0;
printf("*\n");
while (y[i] != '\0')//文件字符串比较部分的头指针为到字符串末尾
{
while (x[j] != '\0')//不到匹配字符串结尾
{
printf("%c ", y[i]);
if (x[j] == y[k] || abs(x[j] - y[k]) == 32)//当前匹配,同时后移
{
printf("**\n");
j ++;
k ++;
}
if (y[k] == '[')//进入到模式匹配
{
printf("***\n");
while (y[k] != ']')//不到模式匹配结尾
{
if (x[j] == y[k] || abs(x[j] - y[k]) == 32)//当前匹配,则文件字符串后移,准备跳出匹配模式
flag = 1;
k ++;
}
if (flag == 1)//模式匹配成功,跳出,继续后边的比较
{
j ++;
k ++;
}
else//模式匹配不成功,则当前比较终结,继续下一轮比较,从上一字符串第二个字符开始比较
{
j = 0;
k = ++i;
}
}
else//不匹配,重新比较
{
j = 0;
k = ++i;
}
}
printf("****\n");
//到达匹配字符串末尾,说明匹配成功,输出匹配字符串
fprintf(out, "%d ",n + 1);
printf ("%d", n + 1);
for (m = j; m < k; m ++)
{
fputc(y[m], out);
printf ("%c", y[m]);
}
fputc('\n',out);
printf ("\n");
i = 0;
k = ++i;
}
}

int main ()
{
qsort(
char str0[100], str1[100], ch0, ch1;
int i = 0, j  = 0;//i控制字符串的读入,j代表行号

//从控制台输入匹配字符串
ch0 = getchar();
while (ch0 != '\n')
{
str0[i] = ch0;
ch0 = getchar();
i ++;
}
str0[i] = '\0';

//从文件中获取字符串
i = 0;
if (in == NULL)
{
printf("\nerror on open D:\\string.in!");
getchar();
exit(1);
}

ch1 = fgetc(in);
while (1)
{
str1[i] = ch1;
if (ch1 == '\n')//碰到换行,表示当前字符串获取结束,一行为一个字符串,文件仍有数据
{
str1[i] = '\0';//加字符串结束符
compare(str0, str1, j);//比较两个字符串
j ++;//行号加1
i = 0;
}
else if (ch1 == EOF)//到文件末尾
{
str1[i] = '\0';
compare(str0, str1, j);
break;//完成全部匹配,退出
}
else//没换行也没到文件结束,行号不变,准备读下一个字符
i ++;
ch1 = fgetc(in);
}
fclose(in);
fclose(out);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: