(PTA)实验1

119 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

7-1 基于顺序存储结构的图书信息表的创建和输出 (40 分)

定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。

输入格式: 输入n+1行,其中前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。

输出格式: 总计n+1行,第1行是所创建的图书表中的图书个数,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

输入样例: 在这里给出一组输入。例如:

9787302257646 Data-Structure 35.00

9787302164340 Operating-System 50.00

9787302219972 Software-Engineer 32.00

9787302203513 Database-Principles 36.00

9787810827430 Discrete-Mathematics 36.00

9787302257800 Data-Structure 62.00

9787811234923 Compiler-Principles 62.00

9787822234110 The-C-Programming-Language 38.00 0 0 0

结尾无空行

输出样例: 在这里给出相应的输出。例如:

8

9787302257646 Data-Structure 35.00

9787302164340 Operating-System 50.00

9787302219972 Software-Engineer 32.00

9787302203513 Database-Principles 36.00

9787810827430 Discrete-Mathematics 36.00

9787302257800 Data-Structure 62.00

9787811234923 Compiler-Principles 62.00

9787822234110 The-C-Programming-Language 38.00

结尾无空行

实现代码:

 #include <stdio.h>
 typedef struct book{
     char no[14];
     char name[50];
     double price;
 }book;
 int main() {
     book booklist[100];
     int i = 0,j;
     while (1){
         scanf("%s %s %lf",booklist[i].no,booklist[i].name,&booklist[i].price);
         if (booklist[i].no[0] == '0' && booklist[i].name[0] == '0' && booklist[i].price == 0) break;
         i++;
     }
     printf("%d\n",i);
     for (j = 0;j < i;j++){
         printf("%s %s %.2f\n",booklist[j].no,booklist[j].name,booklist[j].price);
     }
     return 0;
 }

7-2 递增有序顺序表的插入 (20 分)

实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现 已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。

输入格式: 第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。

输出格式: 对每一组输入,在一行中输出插入X后的递增的顺序表。

输入样例: 在这里给出一组输入。例如:

5

1 3 5 7 9

6

结尾无空行

输出样例: 在这里给出相应的输出。例如:

1,3,5,6,7,9,

结尾无空行

实现代码:

 #include <stdio.h>
 int main(){
     int n,x,i;
     scanf("%d",&n);
     int a[n+1];
     for (i = 0;i < n;i++){
         scanf("%d ",&a[i]);
     }
     scanf("%d",&x);
     int loc,j;
     for (i = 0;i < n;i++){
         if (a[i] > x){
             loc = i;
             break;
         }
     }
     if (i > n-1){
         loc = i;
         a[loc] = x;
     }else{
         for (j = n-1;j >= loc;j--){
              a[j+1] = a[j];
         }
         a[loc] = x;
     }
     for (i = 0;i <= n;i++){
         printf("%d,",a[i]);
     }
     return 0;
 }

7-3 删除指定位置的元素(数组) (15 分)

在一个数组中存入1~10的整数。输入一个位置k,把数组中第k个元素删除,输出原数组和结果数组。

输入格式: k 位置k从0算起。

输出格式: 如果位置k不合理,超出有效值,输出error. 其它情况先输出原数组,再输出结果数组。

输入样例1:

4

结尾无空行

输出样例1:

1 2 3 4 5 6 7 8 9 10

1 2 3 4 6 7 8 9 10

结尾无空行

输入样例2:

10

结尾无空行

输出样例2:

error. 结尾无空行

实现代码:

 #include <stdio.h>
 int main(){
     int k,i;
     scanf("%d",&k);
     int a[10] = {1,2,3,4,5,6,7,8,9,10};
     if (k < 0 || k >= 10){
         printf("error.");
     }else{
         for (i = 0;i < 10;i++){
              printf("%d ",a[i]);
         }
         printf("\n");
         for (i = 0;i < 10;i++){
             if (i == k) continue;
             printf("%d ",a[i]);
         }
     }
     return 0;
 }

7-4 最长连续递增子序列 (25 分)

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。

输入格式: 输入第1行给出正整数n(≤10^5); 第2行给出n个整数,其间以空格分隔。

输出格式: 在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。

输入样例:

15

1 9 2 5 7 3 4 6 8 0 11 15 17 17 10

结尾无空行

输出样例:

3 4 6 8

结尾无空行

实现代码:

 #include <stdio.h>
 int main(){
     int n,i,j,a[100000];
     scanf("%d",&n);
     for (i = 0;i < n;i++){
         scanf("%d",&a[i]);
     }
     i = 0;
     int len = 1,maxlen = 0,start = 0,end = -1;
     while (i < n) {
            i = end + 1;
            for (j = i;j < n;j++){
                 if (a[j] >= a[j + 1]){
                     if (len > maxlen){
                         maxlen = len;
                         start = i;
                     }
                     end = j;
                     len = 1;
                     break;
                 }else{
                     len++;
                 }
            }
     }
     for (i = start;i < start + maxlen - 1;i++){
          printf("%d ",a[i]);
     }
     printf("%d",a[i]);
     return 0;
 }