C语言博客作业--数据类型

一、PTA实验作业

题目1:7-4 打印菱形图案

1. 本题PTA提交列表

2. 设计思路

  • 定义变量n,s,i,j,n表示菱形长度
  • 输入n;s=n/2+1;
  • 上半部分菱形for(i=1;i<=s;i++) //从1到s行;
    for(j=0;j<s-i;j++) //第i行,输入的空格数与s和i的关系,注意每次输出两个空格;
    printf(" ");
    for(j=0;j<i2-1;j++) //输入星号与i的关系,格式为星号+空格
    printf("
    ");
  • 每次循环结束后换行;
  • 下半部分菱形for(i=1;i<=n/2;i++) //余下n/2行另外算
    for(j=0;j<i;j++)
    printf(" ");
    for(j=0;j<(n/2-i)2+1;j++)
    printf("
    ");

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 提交列表显示格式错误和部分正确,在Dev c上运行,输出的菱形不对称;
  • 用#号代替空格观察菱形的格式,发现输出*号之前输出的空格数不对,在第s行开头应该没有空格输出,将j<=s-i和j<=i改为j<s-i和j<i
  • 发现输出*号前输出的空格数还是不对,少了一倍,所以将每次输出一个空格改为每次输出两个空格,得到正确结果

题目2:7-7 发红包

1. 本题PTA提交列表

2. 设计思路

  • 定义数组a[7]={100,50,20,10,5,2,1}表示面值,数组b[7]={0}表示各面值的张数,定义变量money表示面值,定义i;
  • 输入money
  • for(i=0; i<7;i++) 此循环用于计算各面值的张数
    {
    b[i]=money/a[i]; 计算面值a[i]的张数,并记录在b[i]
    money-=a[i]*b[i]; 减去已取的金额,money为下一次循环的金额
    printf("%3d元:%3d张 ", a[i], b[i]);
    }

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 一开始没有用数组进行编程,而是用了七个for语句,提交结果显示运行超时,Dev c上也运行不了;
  • 改用数组做,提交显示格式错误,编译器上运行结果排版错误,题目要求严格按个位对齐;
  • 将输出语句该为%3d,每个数值占三位,得到正确结果

题目3:7-10 简单计算器

1. 本题PTA提交列表

2. 设计思路

  • 定义变量char ch='0' ,int i,sum,flag=0,flag用于判断被除数为零和非法字符
  • 输入初始数值sum
  • 进入循环while(ch!='='){ 输入ch
    如果ch'=',循环结束;
    输入数值i;
    如果ch
    '+',sum=sum+i
    如果ch'-',sum=sum-i
    如果ch
    '',sum=sumi
    如果ch=='/',当i!=0时,sum=sum/i,否则flag=1
    否则flag=1
  • 如果flag=1,输出ERROR;否则输出sum

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 提交多次部分正确,提示错误为非法字符的处理不正确,在Dev c上运行结果也不对;

  • 发现自己用的都是if语句,忽略了非法字符的判断,最后改用if , else if的结构,在判断完加减乘除的后面,用else判断非法字符,若为非法字符,flag=1
    得到正确答案;

二、截图本周题目集的PTA最后排名

三、本周学习总结

1.你学会了什么?

1.1 一维数组如何定义、初始化?

  • 定义数组:一般形式为 类型名 数组名 [数组长度]
  • 数组的初始化:类型名 数组名 [数组长度]={初值表},从下标为0开始逐一对应,静态数组没有初始化,所有元素均为0

1.2 一维数组在内存中结构?可画图说明。数组名表示什么?

  • 一维数组:
  • 数组名是一个地址常量,存放数组内存空间的首地址

1.3 为什么用数组?

  • 数组是最基本的构造类型,它是一组相同类型数据的有序集合。在程序中使用数组,可以让一批相同类型的变量使用同一个数组变量名,用下标加以区分,它的有点是表达简洁,可读性好,便于使用循环结构

1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.

  • 选择排序法:1)输入n,数组a[n]
    2)for(k=0;k<n-1;k++){
    index=k; //index用于存放最小值所在下标
    for(i=k+1;i<n;i++) //寻找最小值所在下标
    if(a[i]<a[index]) index=i
    temp=a[index];a[index]=a[k];a[k]=temp; } //最小元素与下标为k的元素交换
    3)依次输出n个数组元素的值
  • 冒泡排序法:1)输入n,数组a[n]
    2)for (k=0; k< n-1; k++) {
    for (i=0; i<n-k-1; i++) { //比较相邻元素
    if a[i]>a[i+1]) { //如果前面大于后面,下标不变,交换元素的值
    temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp;}}
    3)依次输出n个数组元素的值
  • 直接插入排序法:1)输入n,数组a[n]
    2)for (k=1; k< n; k++) {
    temp=a[k]; //用来临时保存将要进行插入操作的元素temp
    for (i=k-1; i>=0&&a[i]>temp; j--) { //寻找插入位置并移动元素
    a[i+1]=a[i];}
    a[i+1]=temp; } 将tmp插入到寻找到的位置i+1
    3)依次输出n个数组元素的值

1.5 介绍什么是二分查找法?它和顺序查找法区别?

  • 二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
  • 区别:顺序查找的特点就是从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败;而二分查找法是从中间开始查找,逐步缩小范围,对于大数据的处理比较适用,减少了循环次数,效率更高;

1.6 二维数组如何定义、初始化?

  • 二维数组的定义:类型名 数组名 [行长度] [列长度]
  • 初始化:分行赋初值:类型名 数组名 [行长度] [列长度]={ {初值表0},..... ,{初值表k},...... },把初值表k中的数值依次赋给第k行;
    顺序赋值法:类型名 数组名 [行长度] [列长度]={初值表},依次赋值;

1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?

  • 矩阵转置:for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    if(i<=j){
    temp=a[i][j];a[i][j]=a[j][i];a[j][i];}
  • 下三角:i>=j 上三角:i<=j 对称:ij 或 i+jN-1

1.8 二维数组一般应用在哪里?

  • 有一系列元素时用一维数组,如果这些元素有一定的位置逻辑,如矩阵,就用二维数组

2.本周的内容,你还不会什么?

  • pta题目中第九题切分表达式——写个tokenizer吧还不会做,我的做法是首先用循环输入一个合法表达式,直到输入=,接着再用循环拆分表达式并输出,但是,在输出完数字之后怎么换行不会,所以每次输出完之后还会再输出一个字符,再换行,问题还没有解决;以下我的代码,望大佬帮忙
  • 还有这次期中测试,发现很多计算机基本理论和一些逻辑运算还不懂,尤其是位运算,与、或、异或等等;
  • 对二位数组的应用还不太了解,与循环结合常用于解决那些问题?
原文地址:https://www.cnblogs.com/mayifang/p/7891869.html