10. week3-day9作业
Description
读取一个字符串,字符串可能含有空格,将字符串逆转,原来的字符串与逆转后字符串相同,输出0,原字符串小于逆转后字符串输出-1,大于逆转后字符串输出1。例如输入 hello,逆转后的字符串为 olleh,因为hello 小于 olleh,所以输出-1
注意最后的判断一定要这么写,因为strcmp标准C中并不是返回-1和1,而是负值和正值
int result = strcmp(c, d);
if (result < 0)
{
printf(“%d\n”,-1);
}
else if (result > 0)
{
printf(“%d\n”, 1);
}
else {
printf(“%d\n”, 0);
}
Input
输入一个字符串,例如 hello,当如输入的字符串也可能是 how are you,含有空格的字符串
Output
输出是一个整型数,如果输入的字符串是hello,那么输出的整型数为-1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char c[100] = { 0 }, d[100] = {0};
int len,i,j;
gets(c);
len = strlen(c) - 1;
j = len;
for ( i = 0; i <= len; i++)
{
d[j] = c[i];
j--;
}
int result = strcmp(c, d);
if (result < 0)
{
printf("%d\n", -1);
}
else if (result > 0)
{
printf("%d\n", 1);
}
else {
printf("%d\n", 0);
}
}
11.week4-day10作业
Description
输入一个整型数,存入变量i,通过子函数change把主函数的变量i除2,然后打印i,例如如果输入的为10,打印出5,如果输入的为7,打印出3
Input
一个整型数
Output
对应整型数除2后的商
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void change(int *j)
{
*j = *j / 2;
return *j;
}
int main()
{
int i;
scanf("%d",&i);
change(&i);
printf("%d",i);
}
12.week4-day11作业
Description
输入一个整型数,然后申请对应大小空间内存,然后读取一个字符串,字符串的输入长度小于最初输入的整型数大小,最后输出输入的字符串即可(无需考虑输入的字符串过长,超过了内存大小);
注意下面问题:
char *p;
scanf(“%d”,&n);
p=malloc(n);
scanf(“%c”,&c);//注意在scanf和gets中间使用scanf(“%c”,&c),去除换行
gets§;
Input
一个整型数和一个字符串,例如
10
hello
Output
输出输入的字符串,上面输入的是hello,那么输出hello
int main()
{
int n;//定义数组的长度
char* p;
scanf("%d", &n);
p = (char*)malloc(n);//动态获取内存空间
scanf("%c", &p);//注意在scanf和gets中间使用scanf("%c",&c),去除换行
gets(p);
puts(p);
}
13.week4-day12作业
Description
假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?为便于读者理解题意,这里举例说明如下:假如有3个台阶,那么总计就有3种走法:第一种为每次上1个台阶,上3次;第二种为先上2个台阶,再上1个台阶;第三种为先上1个台阶,再上2个台阶。输入为n,输出为走到第n个台阶有几种走法
Input
比如输入是3
Output
如果输入是3,走到第3个台阶的走法总计有3种,1,1,1 和 1,2 和2,1,输出为3
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int fun(int t)
{
int total;
if (t == 1)
{
return 1;
}
if (t==2)
{
return 2;
}
total = fun(t - 1) + fun(t - 2);
return total;
}
int main()
{
int n;//台阶总数
scanf("%d",&n);
fun(n);
printf("%d", fun(n));
}
14.Description
输入一个学生的学号,姓名,性别,用结构体存储,通过scanf读取后,然后再通过printf打印输出
Input
学号,姓名,性别,例如输入 101 xiongda m
Output
输出和输入的内容一致,如果输入的是101 xiongda m,那么输出也是101 xiongda m
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct student
{
int num;
char name[100];
char sex;
};
int main()
{
struct student s;
scanf("%d %s %c",&s.num,&s.name,&s.sex);
printf("%d %s %c", s.num, s.name, s.sex);
}
15.中级-day2作业
Description
使用C++的引用,注意提交时把代码选为C++;在主函数定义字符指针 char *p,然后在子函数内malloc申请空间,通过fgets读取字符串,然后在主函数中进行输出;要求子函数使用C++的引用,注意在C++中从标准输入读取字符串,需要使用fgets(p,100,stdin)
Input
输入一个字符串,例如 I love C language
Output
如果输入的是I love C language,那么输出也是I love C language
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void modify(char*& p)
{
p = (char*)malloc(100);
fgets(p, 100, stdin);
}
int main()
{
char* p;
modify(p);
puts(p);
free(p);
return 0;
}
16.中级day3作业
Description
初始化顺序表(顺序表中元素为整型),里边的元素是1,2,3,然后通过scanf读取一个元素(假如插入的是6),插入到第2个位置,打印输出顺序表,每个元素占3个空格,格式为1 6 2 3,然后scanf读取一个整型数,是删除的位置(假如输入为1),然后输出顺序表 6 2 3,假如输入的位置不合法,输出false字符串。提醒,Language一定要选为C++。
Input
第一次输入插入的元素值,第二次输入删除的位置
Output
假如插入的元素为6,那么输出为
1 6 2 3
假如删除的位置为1,那么输出为
6 2 3
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;//typedef重命名顺序表元素类型
#define Maxsize 50//顺序表的最大长度50
typedef struct {
ElemType data[Maxsize];//定义了一个类型为ElemType名称为data的数组,数组大小为Maxsize,用来存放顺序表的元素
int length;//顺序表的当前长度
}sqList;//定义结构体
//打印顺序表
void PrintList(sqList L)
{
for (int i = 0; i < L.length; i++)
{
printf("%3d", L.data[i]);//要求打印到一排
}
printf("\n");
}
//插入,给顺序表中增加一个元素,失败返回false,成功返回true
bool ListInsert(sqList& L, int i, ElemType e)//要修改的线性表L,插入位置i,插入的元素e
{
if (i<1 || i>L.length + 1)
{
return false;
}//插入位置不合法
if (L.length + 1 > Maxsize)
{
return false;
}//插入元素之后该顺序表的长度大于定义的最大长度则不合法
for (int j = L.length; j >= i - 1;j--)
{
L.data[j] = L.data[j - 1];//元素后移
}
L.data[i - 1] = e;//数组下标与实际位置相差1
L.length++;
return true;
}
//按位删除,删除顺序表中的第几个元素,失败返回false,成功返回true
bool ListDelete(sqList& L, int i, ElemType& e)//要修改的线性表L,删除位置i,删除的元素用e返回
{
if (i<1 || i>L.length)
{
return false;
}//删除位置不合法
if (L.length == 1)
{
return false;
}//当前线性表中无元素
e = L.data[i - 1];
for (int j = i - 1; j < L.length - 1;j++)
{
L.data[j] = L.data[j + 1];//元素前移
}
L.length--;
return true;
}
int main()
{
sqList L;//顺序表名称
ElemType del;//返回删除的元素
ElemType e;//插入的数据元素
int i;//记录删除位置
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;//手动给顺序表存放3个元素
L.length = 3;//顺序表当前长度为3
scanf("%d", &e);
scanf("%d", &i);
ListInsert(L, 2, e);
PrintList(L);
del = ListDelete(L, i, del);
if (del)
{
PrintList(L);
}
else
{
printf("false");
}
return 0;
}
17.Description
输入3 4 5 6 7 9999一串整数,9999代表结束,通过头插法新建链表,并输出,通过尾插法新建链表并输出。
注意输出要采用如下代码(因为OJ判题对空格敏感,因此需要用下面的打印代码来做):
//打印链表中每个结点的值
void PrintList(LinkList L)
{
L=L->next;
while(L!=NULL)
{
printf(“%d”,L->data);//打印当前结点数据
L=L->next;//指向下一个结点
if(L!=NULL)
{
printf(" “);
}
}
printf(”\n");
}
Input
3 4 5 6 7 9999,第二行也是3 4 5 6 7 9999,数据需要输入两次
Output
如果输入是3 4 5 6 7 9999,那么输出是7 6 5 4 3,数之间空格隔开,尾插法的输出是3 4 5 6 7
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;//typedef重命名顺序表元素类型
//定义结构体
typedef struct LNode {
ElemType data;//数据域存放数据,链表元素类型为ElemType,变量名为data
struct LNode* next;//指针域存放指针,指向下一个节点
}LNode, * LinkList;//struct LNode *=LinkList,强调链表时使用LinkList
//打印链表
void PrintList(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf("%d", L->data);//打印当前结点数据
L = L->next;//指向下一个结点
if (L != NULL)
{
printf(" ");
}
}
printf("\n");
}
//头插法创建链表
LinkList List_HeadInsert(LinkList& L)
{
LNode* s;ElemType x;
L = (LinkList)malloc(sizeof(LNode));//创建头节点
L->next = NULL;//创建空链表
scanf("%d", &x);
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));//创建要插入的节点
s->data = x;//输入新结点的数据x
s->next = L->next;
L->next = s;//头插法插入节点
scanf("%d", &x);
}
return L;
}
//尾插法创建链表
LinkList List_TailInsert(LinkList& L)
{
ElemType x;//插入的数据
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode* s;//记录插入的节点
LNode* r = L;//记录表尾指针
scanf("%d", &x);
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));//创建要插入的节点
s->data = x;//输入新结点的数据x
r->next = s;//尾法插入节点
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
int main()
{
LinkList L1;//链表名称
LinkList L2;
List_HeadInsert(L1);
List_TailInsert(L2);
PrintList(L1);
PrintList(L2);
return 0;
}
18.中级-day5作业
Description
输入3 4 5 6 7 9999一串整数,9999代表结束,通过尾插法新建链表,查找第二个位置的值并输出,在2个位置插入99,输出为 3 99 4 5 6 7,删除第4个位置的值,打印输出为 3 99 4 5 6 7。
输出函数如下:
void PrintList(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf(“%3d”, L->data);//打印当前结点数据
L = L->next;//指向下一个结点
}
printf(“\n”);
}
针对双向链表,有时间的同学自己练习即可,这道题同样也可以用双向链表来实现一遍
Input
输入是3 4 5 6 7 9999
Output
输出是
4
3 99 4 5 6 7
3 99 4 6 7
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;//typedef重命名顺序表元素类型
//定义结构体
typedef struct LNode {
ElemType data;//数据域存放数据,链表元素类型为ElemType,变量名为data
struct LNode* next;//指针域存放指针,指向下一个节点
}LNode, * LinkList;//struct LNode *=LinkList,强调链表时使用LinkList
//打印链表
void PrintList(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf("%3d", L->data);//打印当前结点数据
L = L->next;//指向下一个结点
}
printf("\n");
}
//尾插法创建链表
LinkList List_TailInsert(LinkList& L)
{
ElemType x;//插入的数据
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode* s;//记录插入的节点
LNode* r = L;//记录表尾指针
scanf("%d", &x);
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));//创建要插入的节点
s->data = x;//输入新结点的数据x
r->next = s;//尾法插入节点
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
//链表的按序号查找
LNode* GetElem(LinkList L, int i)//因为返回的是节点值强调的是结点,所以函数返回类型为LNode*
{
int j = 1;//记录位置
LNode* p = L->next;//遍历链表
if (i == 0)
{
return L;//i=0,返回头节点
}
if (i < 1)
{
return NULL;//i为负值,返回null
}
while (p && j < i)//该链表存在节点并且j<i
{
p = p->next;
j++;
}
return p;
}
//插入节点,输入插入的位置以及元素
LinkList ListInsert(LinkList& L, int i, ElemType e) //i为插入位置,e为插入的元素
{
int j = 1;//记录位置
LNode* p = L->next;//遍历链表
LNode* s;//创建新的空间
s = (LNode*)malloc(sizeof(LNode));
s->data = e;
if (i < 1)
{
return NULL;//i为负值,返回null
}
if (i == 1)
{
s->next = p;
L->next = s;
}
else
{
while (p && j < i - 1)//该链表存在节点并且j<i
{
p = p->next;
j++;
}
s->next = p->next;
p->next = s;
}
return L;
}
//按序号删除节点
LinkList List_LocateDelete(LinkList& L, int i) //i为删除的位置
{
int j = 1;//记录位置
LNode* q;//q指向被删除节点
LNode* p = L->next;//遍历链表
if (i < 1)
{
return NULL;//i为负值,返回null
}
if (i == 1)
{
q = p;
L->next = q->next;
free(q);
}
else
{
while (j < i - 1)//该链表存在节点并且j<i
{
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
free(q);
}
return L;
}
int main()
{
LinkList L;//链表名称
LNode* search;//记录查找的返回值
ElemType e;//元素
LNode* del;//记录删除的返回值
List_TailInsert(L);//3 4 5 6 7 9999//1 3 5 7 9 9999
search=GetElem(L, 2);
printf("%d\n", search->data);
search = ListInsert(L,2,99);
PrintList(L);
List_LocateDelete(L,4);
PrintList(L);
return 0;
}
19.中级-day6作业
Description
新建一个栈,读取标准输入3个整数3 4 5,入栈3 4 5,依次出栈,打印 5 4 3,新建循环队列(Maxsize为5),读取标准输入3 4 5 6 7,入队7时,队满,打印false,然后依次出队,输出 3 4 5 6
Input
读取标准输入,内容依次是3 4 5,换行后,接着是3 4 5 6 7
Output
如果输入是3 4 5,换行,接着是3 4 5 6 7,那么输出是
5 4 3
false
3 4 5 6
注意每个数字占用两个字符的位置,5之前是有一个空格的,第三行的3之前也是有一个空格的
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//定义顺序栈的结构体
typedef int Elemtype;
#define Maxsize 5 //最多可以放5个元素
typedef struct {
Elemtype data[Maxsize];//定义一个数组用来存放栈中元素
int top;//定义栈顶指针
}Sqstack;
//初始化顺序栈S
void InitSqstack(Sqstack& S)
{
S.top = -1;
}
//进栈
bool Push(Sqstack& S, Elemtype e)
{
if (S.top == Maxsize - 1)
{
return false;
}
else
{
S.top = S.top + 1;
S.data[S.top] = e;
return true;
}
}
//出栈
bool Pop(Sqstack & S)
{
Elemtype x;
if (S.top == -1)
{
return false;
}
else
{
while (S.top != -1)
{
x = S.data[S.top];
printf("%2d",x);
S.top--;
}
return true;
}
}
//定义队列顺序存储的结构体
typedef struct {
Elemtype data[Maxsize];//定义一个数组用来存放元素
int front, rear;//定义队头和队尾指针
}SqQueue;
//初始化循环队列
void InitSqQueue(SqQueue& Q)
{
Q.front = Q.rear = 0;
}
//判断循环队列满
bool QueueMax(SqQueue Q)
{
if (Q.front == (Q.rear + 1) % Maxsize)
{
return true;
}
else
{
return false ;
}
}
//循环队列入队
bool EnQueue(SqQueue& Q, Elemtype e)
{
if (Q.front == (Q.rear + 1) % Maxsize)//判断循环队列满
{
return false;
}
else//队列不满入队从队尾入队
{
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % Maxsize;
return true;
}
}
//循环队列出队
bool DeQueue(SqQueue& Q)
{
Elemtype e;
if (Q.front == Q.rear)//判断循环队列空
{
return false;
}
else//队列不空入队从队头出队
{
while (Q.front != Q.rear)
{
e = Q.data[Q.front];
printf("%2d", e);
Q.front = (Q.front + 1) % Maxsize;
}
return true;
}
}
int main()
{
Sqstack S;
SqQueue Q;
bool flag;//记录队列满
Elemtype m = 0;
InitSqstack(S);//初始化栈
//入栈
Elemtype a, b, c;//记录进栈元素
scanf("%d %d %d",&a,&b,&c);
Push(S, a);
Push(S, b);
Push(S, c);
//栈元素出栈
Pop(S);
printf("\n");
InitSqQueue(Q);//初始化队列
//入队
Elemtype d, e, f, g, h;//记录进队元素
scanf("%d %d %d %d %d", &d, &e, &f, &g, &h);
EnQueue(Q, d);
EnQueue(Q, e);
EnQueue(Q, f);
EnQueue(Q, g);
EnQueue(Q, h);
flag = QueueMax(Q);
if (flag)
{
printf("false\n");
}
//出队
DeQueue(Q);
return 0;
}