一.实验题目,设计思路,实现方法
第十一次作业(二维数组):
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
思路:杨辉三角是一道经典的数学题目,看到输出样例,我们可以很容易的相到用二维数组,之后先打印为1的数,然后利用数学方法,一个元素的值等于上面相邻两个元素的和,然后控制好打印空格与换行。
实现方法:C语言中的二维数组,以及对下标的数学运算。
二.部分源程序
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
if(j==1)a[i][1]=1;
else if(j==i)a[i][i]=1;
else {
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
三.遇到的问题及解决方法,心得体会
此题首先要想到率先打印1的元素,才好进行运算,还有一个点是简单数学方法的应用, a[i][j]=a[i-1][j-1]+a[i-1][j],此题难度不高,尽量能做到一遍通过。
第十二次作业(字符串)
一.实验题目,设计思路,实现方法
12-6 字符串转换成十进制整数(15 分)
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
思路:第一步是先虑去不和法的字符。
二.对合法字符进行进制转换运算。
三.对数字的的正负进行判断。
实现方法:先将字符串读入到数组之中,然后对每一项进行考究。
二.部分源程序
while((a[i]=getchar())!=‘#‘)i++;
a[i]=‘\0‘;
for(i=0;a[i]!=‘\0‘;i++){
if(a[i]>=‘0‘&&a[i]<=‘9‘){
number=number*16+a[i]-‘0‘;h=1;
}else if(a[i]>=‘a‘&&a[i]<=‘f‘){
number=number*16+a[i]-‘a‘+10;h=1;
}else if(a[i]>=‘A‘&&a[i]<=‘F‘){
number=number*16+a[i]-‘A‘+10;h=1;
}
t=i;
if(h==1&&q==1){
q=2;
for(j=0;j<t;j++){
if(a[j]==‘-‘){
flag=-flag;
break;
} } }}
三.遇到的问题及解决方法,心得体会
此题虑去不合法字符后,还要对合法字符进行分类讨论,有时候会分不清楚,还有“如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数”,这个设下了一个小陷阱,要对正负标志进行专门的判断。
第十三次作业(指针)
一.实验题目,设计思路,实现方法
13-5 判断回文字符串(20 分)
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
函数接口定义:
bool palindrome( char *s );
函数palindrome
判断输入字符串char *s
是否为回文。若是则返回true
,否则返回false
。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXN 20
typedef enum {false, true} bool;
bool palindrome( char *s );
int main()
{
char s[MAXN];
scanf("%s", s);
if ( palindrome(s)==true )
printf("Yes\n");
else
printf("No\n");
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
thisistrueurtsisiht
输出样例1:
Yes
thisistrueurtsisiht
输入样例2:
thisisnottrue
输出样例2:
No
thisisnottrue
思路:率先定义一个指针指向这个字符串,然后头尾相互比较字符是否相等,如果相等向中间移动,否则判断不为回文字符。
实现方法:按照题目给定的条件与主函数,利用指针判断。
二.部分源程序
for(int i=0;s[i]!=‘\0‘;i++)
count++;
if(count==1)
return 1;
count--;
while(count>a)
{
if(*(s+a)==*(s+count))
k=1;
else k=0;
count--;
a++;
}
return k;
三.遇到的问题及解决方法,心得体会
先要计算出字符串的长度,因为没有“string.h”的头文件,就 for(int i=0;s[i]!=‘\0‘;i++) count++;来计算,若用指针算长度,要记得指回头,还有如果
第十四次实验报告(指针与结构)
一.实验题目,设计思路,实现方法
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;
}
思路:核心思想还是分类讨论,对出现的字符是否会在字符串内进行分析,如果两个都在字符串内输出什么,如果第二个不在字符串内输出什么,
如果都不在字符串内输出什么。
实现方法:对指针的灵活运用,以及指向字符数组的分析。
二.部分源程序
for(i=0;i<len;i++){
if(s[i]==ch1){
p=&s[i];
for(j=i;j<len;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[len-1]=‘\n‘;
p=&s[len-1];
return p;
三.遇到的问题及解决方法,心得体会
这题本来问题不大,但是有一句很重要的一句话:返回ch1
的地址。这句话导致了一个很重要的测试点一直让我过不去,就是两个字符都不在字符串内的时候要输出的是两个空行,
但是其中一个空行是要ch1的地址指向,不能直接输出,这个问题点困扰我好久,第二天早上在食堂突发奇想才明白。
第十五次作业:
一.实验题目,设计思路,实现方法
15-5 建立学生信息链表(20 分)
本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。
函数接口定义:
void input();
该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:
struct stud_node {
int num; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
struct stud_node *next; /*指向下个结点的指针*/
};
单向链表的头尾指针保存在全局变量head和tail中。
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *head, *tail;
void input();
int main()
{
struct stud_node *p;
head = tail = NULL;
input();
for ( p = head; p != NULL; p = p->next )
printf("%d %s %d\n", p->num, p->name, p->score);
return 0;
}
/* 你的代码将被嵌在这里 */
二.部分源程序
if(head==NULL)
{
head=p;
head->next=NULL;
}
if(tail!=NULL)
tail->next=p;
tail=p;
tail->next=NULL;
三.遇到的问题及解决方法,心得体会
一开始对链表不是十分熟悉,不是很懂链表创建的问题,经过对建立学生信息库的多次练习才明白,链表的强大之处以及链表结点的创建,以及对指针的应用更加
得心应手。