首页 > 编程语言 >2022-2023-1 20221320 《计算机基础与程序设计》第十四周学习总结

2022-2023-1 20221320 《计算机基础与程序设计》第十四周学习总结

时间:2022-12-04 21:37:44浏览次数:63  
标签:10 int void printf next 2022 2023 20221320 STACK

学期(2022-2023-1) 学号(20221320) 《计算机基础与程序设计》第十四周学习总结

作业信息

各项要求 具体内容
<班级的链接> 2022-2023-1-计算机基础与程序设计
<作业要求的链接> 2022-2023-1计算机基础与程序设计第十四周作业
作业的目标 1.学习目标: 无
作业的目标 2.学习任务:加入云班课,参考本周学习资源、《C语言程序设计》第13章并完成云班课测试
作业的目标 3.参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学年 学号 《计算机基础与程序设计》第十四周学习总结”,博客(随笔)要通过作业提交,截至时间本周日 23:59。
作业正文

教材学习内容总结

二进制文件和文本文件
文件的开和关闭
按字符读写文件
按格式读写文件
按数据块读写文件

教材学习中的问题和解决过程

  • 问题1:文件处理方式的汇总
  • 问题的解决方案:

代码调试中的问题和解决过程

  • 问题1:
    用动态数组编程输入任意m个班学生(每班n个学生)的某门课的成绩,计算最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。其中,m和n的值由用户从键盘任意输入(不限定m和n的上限值)。
    输入提示信息:
    "Input array size m,n:"
    "Input %d*%d array:\n"
    输入格式:"%d,%d"
    输出提示信息和格式:"maxScore = %d, class = %d, number = %d\n"
  • 问题1解决方案:
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int m,n,i,j;
    int max = 0;
    int x,y;
    printf("Input array size m,n:");
    scanf("%d,%d", &m,&n);
    printf("Input %d*%d array:\n", m,n);
    int* p = (int*)malloc(m*n*sizeof(int));
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d", p+i+j );
            if(max < *(p+i+j))
            {
                max = *(p+i+j);
                x = i+1;
                y = j+1;
            }
        }
    }
    free(p);
    p == NULL;
    printf("maxScore = %d, class = %d, number = %d\n", max, x, y);
}
  • 问题2:
    按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。
    void InputArray(int *p, int m, int n);
    int FindMax(int *p, int m, int n, int *pRow, int pCol);
    输入提示信息:
    "Input m, n:"
    "Input %d
    %d array:\n"
    输入格式:"%d,%d"
    输出提示信息和格式:"max = %d, row = %d, col = %d\n"
    我的错误代码:
#include <stdio.h>
#include <stdlib.h>
void InputArray(int *p, int m, int n);
int  FindMax(int *p, int m, int n, int *pRow, int *pCol);
int main()
{
    int m,n,max,*p=NULL,*pRow=NULL,*pCol=NULL;
    printf("Input m, n:");
    scanf("%d,%d",&m,&n);
    if(m>10||n>10)
        exit(0);
    p=(int*)calloc(m*n,sizeof(int));
    if(p==NULL)
    {
        printf("No enough memory!\n");
        exit(1);
    }
    InputArray(p,m,n);
    max=FindMax(p,m,n,pRow,pCol);
    printf("max = %d, row = %d, col = %d\n",max,*pRow,*pCol);
    free(p);
    return 0;
}

void InputArray(int *p, int m, int n)
{
    printf("Input %d*%d array:\n",m,n);
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&p[i*n+j]);
        }
    }
}
int  FindMax(int *p, int m, int n, int *pRow, int *pCol)
{
    int i,j,max=0;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if(max<p[i*n+j])
            {
                max=p[i*n+j];
                *pRow=i;
                *pCol=j;
            }
        }
    }
    return max;
}

问题:程序运行结果没有输出。

  • 问题2解决方案:
    不一定要用动态内存分配
#include <stdio.h>
#define M 10
#define N 10
void InputMatrix(int *p, int m, int n);
int FindMax(int *p, int m, int n, int *pRow, int *pCol);
int main()
{	  		 	      
    int a[M][N], m, n, row, col, max;
    printf("Input m, n:");
    scanf("%d,%d", &m, &n);
    InputMatrix(*a, m, n);
    max = FindMax(*a, m, n, &row, &col);
    printf("max = %d, row = %d, col = %d\n", max, row, col);
    return 0;
}	  		 	      
/* 函数功能:输入m*n矩阵的值 */
void InputMatrix(int *p, int m, int n)
{	  		 	      
    int i, j;
    printf("Input %d*%d array:\n", m, n);
    for (i = 0; i < m; i++)
    {	  		 	      
        for (j = 0; j < n; j++)
        {	  		 	      
            scanf("%d", &p[i * n + j]);
        }
    }
}	  		 	      
/* 函数功能:在m*n矩阵中查找最大值及其所在的行列号 */
int FindMax(int *p, int m, int n, int *pRow, int *pCol)
{	  		 	      
    int i, j, max = p[0];
    *pRow = 0;
    *pCol = 0;
    for (i = 0; i < m; i++)
    {	  		 	      
        for (j = 0; j < n; j++)
        {	  		 	      
            if (p[i * n + j] > max)
            {	  		 	      
                max = p[i * n + j];
                *pRow = i;              /*记录行下标*/
                *pCol = j;              /*记录列下标*/
            }
        }
    }
    return max;
}	  		 
  • 问题3:
    用二维数组的列指针作为函数实参,实现矩阵转置。按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。
    void Transpose(int *a, int *at, int m, int n);
    void InputMatrix(int *a, int m, int n);
    void PrintMatrix(int *at, int n, int m);
    输入提示信息:"Input m, n:"
    输入格式:"%d,%d"
    输出提示信息和格式:"The transposed matrix is:\n"
    系统反应的问题:

  • 问题3解决方案:

#include <stdio.h>
#include <stdlib.h>
#define M 10
#define N 10
void Transpose(int *a, int *at, int m, int n);
void InputMatrix(int *a, int m, int n);
void PrintMatrix(int *at, int n, int m);
int main()
{
    int m,n;
    int A[M][N],AT[N][M];
    printf("Input m, n:");
    scanf("%d,%d",&m,&n);
    if(m>10||n>10)
        exit(0);
    InputMatrix(*A,m,n);
    Transpose(*A,*AT,m,n);
    PrintMatrix(*AT,n,m);
    return 0;
}

void Transpose(int *a, int *at, int m, int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            at[j*m+i]=a[i*n+j];
        }
    }
}

void InputMatrix(int *a, int m, int n)
{
    int i,j;
    printf("Input %d*%d matrix:\n",m,n);
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i*n+j]);
        }
    }
}
void PrintMatrix(int *at, int n, int m)
{
    int i,j;
    printf("The transposed matrix is:\n");
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%d\t",at[i*m+j]);
        }
        printf("\n");
    }
}

  • 问题4:
    编程用链表方法实现堆栈数据结构。堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加。堆栈结构可用链表实现。设计一个链表结构需包含两个成员:一个存放数据,一个为指向下一个节点的指针。当每次有一个新数据要放入堆栈时,称为“压入堆栈”,这时动态建立一个链表的节点,并连接到链表的结尾;当每次从堆栈中取出一个数据时,称为“弹出堆栈”,这意味着从链表的最后一个节点中取出该节点的数据成员,同时删除该节点,释放该节点所占的内存。
    请将下面程序补全。
    这种情况一般是某个地方没有加换行符
typedef struct stack
{
    int data;
    struct stack *next;
} STACK;
STACK *head, *pr;
int nodeNum = 0;                            /* 堆栈节点数寄存器 */
STACK *CreateNode(int num);
STACK *PushStack(int num);
int PopStack(void);
int main()
{
    int pushNum[5] = {111, 222, 333, 444, 555}, popNum[5], i;
    for (i = 0; i < 5; i++)
    {
        PushStack(pushNum[i]);
        printf("Push %dth Data:%d\n", i + 1, pushNum[i]);
    }
    for (i = 0; i < 5; i++)
    {
        popNum[i] = PopStack();
        printf("Pop %dth Data:%d\n", 5 - i, popNum[i]);
    }
    return 0;
}
/* 函数功能:生成一个新的节点,并为该节点赋初值,返回指向新的节点的指针 */
STACK *CreateNode(int num)
{
    STACK *p;
    ......
    return p;
}
/*  函数功能:将整型变量num的值压入堆栈,返回指向链表新节点的指针 */
STACK *PushStack(int num)
{
    ......
    return pr;
}
/*  函数功能:将当前栈顶的数据弹出堆栈,返回从堆栈中弹出的数据 */
int PopStack(void)
{
    STACK *p = head;
    int result;
    ......
    return result;
}
  • 问题4的解决方案:
#include <stdio.h>
 
typedef struct stack
{
    int data;
    struct stack *next;
} STACK;
 
STACK *head, *pr;
int nodeNum = 0;                            /* 堆栈节点数寄存器 */
 
STACK *InitStack (void);
STACK *CreateNode(int num);
STACK *PushStack(int num);
int PopStack(void);
 
int main(void)
{
    int pushNum[5] = {111, 222, 333, 444, 555}, popNum[5], i;
    for (i = 0; i < 5; i++)
    {
        PushStack(pushNum[i]);
        printf("Push %dth Data:%d\n", i + 1, pushNum[i]);
    }
    for (i = 0; i < 5; i++)
    {
        popNum[i] = PopStack();
        printf("Pop %dth Data:%d\n", 5 - i, popNum[i]);
    }
    return 0;
}
 
/* 函数功能:生成一个新的节点,并为该节点赋初值,返回指向新的节点的指针 */
STACK *CreateNode(int num)
{
    STACK *p;
    p = (STACK *)malloc (sizeof (STACK));
 
    if (p == NULL)
    {
        printf ("Error!");
 
        exit (1);
    }
 
    p -> data = num;
    p -> next = NULL;
 
    return p;
}
/*  函数功能:将整型变量num的值压入堆栈,返回指向链表新节点的指针 */
STACK *PushStack(int num)
{
    if (nodeNum == 0)
    {
        head = CreateNode (num);
 
        pr = head;
    }
    else
    {
        pr -> next = CreateNode (num);
        pr = pr -> next;
 
    }
 
    nodeNum ++;
 
    return pr;
}
/*  函数功能:将当前栈顶的数据弹出堆栈,返回从堆栈中弹出的数据 */
int PopStack(void)
{
    STACK *p = head;
 
    int result;
 
    while (1)
    {
        if (p -> next == NULL)
        {
            break;
        }
        else
        {
            pr = p;
            p = p -> next;
 
            nodeNum --;
        }
    }
 
    pr -> next = NULL;
 
    result = p -> data;
 
    free (p);
 
    return result;
}
  • 问题5:
    13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。
    输出提示 "出圈成员及顺序:" 格式 "%3d"
    输出提示 "\n最后的成员是:" 格式 "%3d"

程序的运行示例如下:
出圈成员及顺序: 3 6 (后面以此类推,抱歉这里的输出结果保密,暂不公开,注意最后一个人是不出圈的哦)
最后的成员是: (抱歉这里的输出结果保密,暂不公开)
我的思路错误:只局限于结构体,并没有想到用链表来解决问题

  • 问题5解决方案:
#include <stdio.h>
#include <stdlib.h>
 
struct Person{                                   //定义结构体
    int num;
    struct Person *next;
};
int main()
{
    struct Person per[13];                              //定义结构体变量数组
    int i;
    for (i=0; i<13; i++){                        //此循环给13个人标注序号,1对应第一个人,以此类推,同时实现循环链表,当到达链表最后一个时,地址指向开头。
        per[i].num=i+1;
        if (i==12) per[i].next=&per[0];
        else per[i].next=&per[i+1];
    }
    struct Person *p,*p1;
    for (p=per, i=1; p->next!=p; p=p->next){    //循环报号,当每次报到第3个人时,next指针直接跳过下一个变量,指向下下个变量,当next指针指向自己时结束循环。
        i++;
        if (i==3){
            p1=p->next;
            printf("%d ", p1->num);
            p->next=p->next->next;
            i=1;
 
        }
    }
    printf("\nThe number is %d\n", p->num);       //输出结果
    system("pause");
    return 0;
}

运行结果:

上周考试错题总结

其他(感悟、思考等)

学习进度条

博客量(新增/累计) 代码行数(新增/累计) 学习时间(新增/累计) 重要成长
目标 70 3000 300
第一周 2/2 0 10/10 开始学习写博客
第二周 1/3 300/300 20/30 学习如何自主预习,初识信息安全专业
第三周 6/9 250/550 20/50 各种进制表数方法
第四周 1/10 50/600 15/65 逻辑电路
第五周 3/13 100/700 10/75 博客排版和编辑走上正轨
第六周 1/14 100/800 10/85 解决问题的Polya新思想 ,选择结构
第七周 1/15 300/1100 20/105 抽象数据类型,循环结构
第八周 2/17 150/1250 20/125 函数的定义,不同范型的编程语言
第九周 1/18 300/1550 20/145 数组,函数,操作系统,文件系统和目录
第十周 1/18 300/1850 10/155 二维数组
第十一周 1/19 500/2350 10/165 指针
第十二周 1/20 300/2650 10/175 字符串,字符数组
第十三周 1/21 700/3350 20/195 结构体与链表
第十四周 1/22 500/3850 20/215 文件操作

标签:10,int,void,printf,next,2022,2023,20221320,STACK
From: https://www.cnblogs.com/feng-tairui/p/16933084.html

相关文章