题目一 11-6 方阵循环右移(20 分)
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
题目二 12-6 字符串转换成十进制整数(15 分)
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则 代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
题目三 13-4 使用函数的选择法排序(25 分)
函数接口定义:
void sort( int a[], int n );
其中a
是待排序的数组,n
是数组a
中元素的个数。该函数用选择法将数组a
中的元素按升序排列,结果仍然在数组a
中。
题目四 14-4 输出月份英文名(15 分)
函数接口定义:
char *getmonth( int n );
函数getmonth
应返回存储了n
对应的月份英文名称的字符串头指针。如果传入的参数n
不是一个代表月份的数字,则返回空指针NULL。
函数接口定义:
double P( int n, double x );
其中n
是用户传入的非负整数,x
是双精度浮点数。函数P
返回P(n,x)函数的相应值。题目保证输入输出都在双精度范围内。
部分源代码
#include<stdio.h>
int main()
{
int m,n,a[6][6],i,j,k,b[6][6];
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
k=(j+m)%n;
b[i][k]=a[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
12-6 字符串转换成十进制整数
#include<stdio.h>
int main()
{
int i,c,n,j=0;
char str[80];
char b[80];
i=0;
while((str[i]=getchar())!='#')
i++;
str[i]='\0';
for(i=0;str[i]!='\0';i++)
{
if(str[i]>='0'&&str[i]<='9'||str[i]>='a'&&str[i]<='f'||str[i]>='A'&&str[i]<='F'){
b[j]=str[i];
j++;}
}
int number=0;
for(i=0;b[i]!='\0';i++)
{
if(b[i]>='0'&&b[i]<='9')
number=number*16+b[i]-'0';
else if(b[i]>='A'&&b[i]<='F')
number=number*16+b[i]-'A'+10;
else if(b[i]>='a'&&b[i]<='f')
number=number*16+b[i]-'a'+10;
}
for(i=0;str[i]!='\0';i++)
{
if(str[i]=='-')
continue;
if(str[i]>='0'&&str[i]<='9'||str[i]>='a'&&str[i]<='f'||str[i]>='A'&&str[i]<='F')
number=-number;
}
printf("%d",number);
return 0;
}
13-4 使用函数的选择法排序
裁判测试程序样例
#include <stdio.h>
#define MAXN 10
void sort( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);
sort(a, n);
printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");
return 0;
}
代码:
void sort( int a[], int n )
{
int j,t,i,index;
for(i=0;i<n;i++)
{
index=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[index])index=j;
}
t=a[index];
a[index]=a[i];
a[i]=t;
}
}
14-4 输出月份英文名
裁判测试程序样例
#include <stdio.h>
char *getmonth( int n );
int main()
{
int n;
char *s;
scanf("%d", &n);
s = getmonth(n);
if ( s==NULL ) printf("wrong input!\n");
else printf("%s\n", s);
return 0;
}
代码
char a[12][10]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char *getmonth( int n )
{
char *month;
month=NULL;
if(n<=12&&n>0)
{
month=a[n-1];
return month;
}
else
return NULL;
}
15-9 递归计算P函数
裁判测试程序样例
#include <stdio.h>
double P( int n, double x );
int main()
{
int n;
double x;
scanf("%d %lf", &n, &x);
printf("%.2f\n", P(n,x));
return 0;
}
代码:
double P( int n, double x )
{
double result;
if(n==0)
result=1;
else if(n==1)
result=x;
else
result= ((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;
return result;
}
遇到的问题,解决方法和心得体会
1.根据题目要求寻找数据之间的规律,这样解决问题就更快。
2.要学会十进制转n进制,n进制转十进制的方法。
3.要熟练掌握数组的各种排序法:选择排序法,冒泡排序法。
4.指针的难度还是很明显的,数组可以定义函数外。
5.程序若的多用递归的思想很多问题都会简化。