#一、设计题目,设计思路,实现方法
##设计题目
15-10 找最长的字符串,14-5 指定位置输出字符串,13-6 数组循环右移,12-5 查找指定字符,11-5 打印杨辉三角。
##设计思路
15-10:通过strlen()函数比较字符串长度。
14-5:通过数组遍历找到指定位置。
13-6 :定义两个数组,进行赋值,进而改变数组的下标。
12-5 :数组遍历,找到指定字符。
11-5:定义一个二维数组,先对特殊部分处理(即杨辉三角外围的一)。
##实现方法
15-10:与数组比较大小的代码相似,但其运用了strcpy()函数,操作步骤上也有细微差别。
14-5:运用指针,通过返回指针地址实现最终目的
13-6 :通过index = (j+m)%n语句将数组向右移,并通过for循环进行循环。
12-5 :通过for循环遍历
11-5:双重for循环,规律为一个数为其肩上两个数之和。
————————————————————————————
#二、源程序
##15-10 找最长的字符串
本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最长的字符串:
The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。
输入样例:
5
li
wang
zhang
jin
xiang
输出样例:
The longest is: zhang
#include<stdio.h>
#include<string.h>
int main()
{
int n,i;
scanf("%d\n",&n);
char s[80],max[80];
scanf("%s",s);
strcpy(max,s);
for(i=0;i<n;i++)
{
scanf("%s",s);
if(strlen(s)>strlen(max))
{
strcpy(max,s);
}
}
printf("The longest is: %s\n",max);
return 0;
}
##14-5 指定位置输出字符串(20 分)
本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。
函数接口定义:
char *match( char *s, char ch1, char ch2 );
函数match应打印s中从ch1到ch2之间的所有字符,并且返回ch1的地址。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 10
char *match( char *s, char ch1, char ch2 );
int main()
{
char str[MAXS], ch_start, ch_end, *p;
scanf("%s\n", str);
scanf("%c %c", &ch_start, &ch_end);
p = match(str, ch_start, ch_end);
printf("%s\n", p);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
program
r g
输出样例1:
rog
rogram
输入样例2:
program
z o
输出样例2:
(空行)
(空行)
输入样例3:
program
g z
输出样例3:
gram
gram
char *match( char *s, char ch1, char ch2 ){
int i,j;
char *p=NULL;
for(i=0;s[i]!='\0';i++){
if(s[i]==ch1){
p=&s[i];
for(j=i;s[j]!='\0';j++){
if(s[j]!=ch2){
printf("%c", s[j]);
}
if(s[j]==ch2){
printf("%c\n", s[j]);
return p;
}
}
printf("\n");
return p;
}
}
s[i-1]='\n';
p=&s[i-1];
return p;
}
##13-6 数组循环右移(20 分)
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a
0
a
1
⋯a
n−1
)变换为(a
n−m
⋯a
n−1
a
0
a
1
⋯a
n−m−1
)(最后m个数循环移至最前面的m个位置)。
函数接口定义:
int ArrayShift( int a[], int n, int m );
其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
int ArrayShift( int a[], int n, int m )
{
int i,index,j,b[100];
for(j=0;j<n;j++)
{
index = (j+m)%n;
b[index]=a[j];
}
for(i=0,j=0;i<n;i++,j++)
{
a[i]=b[j];
}
return a;
}
##12-5 查找指定字符(15 分)
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式:
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式:
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
输入样例1:
m
programming
输出样例1:
index = 7
输入样例2:
a
1234
输出样例2:
Not Found
#include<stdio.h>
int main(void)
{
int i,flag,index;
char s[80],ch;
scanf("%c",&ch);
s[0]=getchar();
i=0;
while((s[i]=getchar())!='\n')
i++;
s[i]='\0';
flag=0;
for(i=0;s[i]!='\0';i++){
if(s[i]==ch){
index=i;
flag=1;
}
}
if(flag==0)
printf("Not Found");
else
printf("index = %d",index);
return 0;
}
提交返回
编程题
1234567
##11-5 打印杨辉三角(20 分)
本题要求按照规定格式打印前N行杨辉三角。
输入格式:
输入在一行中给出N(1≤N≤10)。
输出格式:
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。
输入样例:
6
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
作者: 徐镜春
单位: 浙江大学
时间限制: 400ms
内存限制: 64MB
代码长度限制: 16KB
for( i=0;i<10;i++)
{
a[i][i]=1;
a[i][0]=1;
}
scanf("%d",&n);
if(n>2){
for( i=1;i<n;i++)
{
for ( j=1;j<i;j++)
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
for( i=0;i<n;i++)
{
for(k=n-i-1;k>0;k--)printf(" ");
for( j=0;j<=i;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
————————————————————————————
#三、遇到的问题,心得及体会。
##问题:
1.审题不清:在15-10 找最长的字符串中误以为找的是最大字符串
2.对数组的界限不清:导致运行结果出现乱码
##心得与体会:
1,审清题意是关键,一定要认真看题
2.多做多练是重点:熟能生巧