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

本文解析了三个PTA编程实验题目,包括变量定义、循环结构、条件判断等,并分享了调试过程中的问题及解决方法。

一、PTA实验作业

题目1(7-8)

(1).本题PTA提交列表

1235979-20171126104703375-940439945.png

(2)设计思路

char tozero(char ch)函数(功能为使ch最后值为'\n'){
  • for( ;ch不等于'\n'时;)
    将输入的值记入ch;
  • 返回ch;

}

主函数
  • 定义字符变量ch、大循环次数repeat、标志变量flag;
  • 输入repeat
    while( repeat大于0时 ){
    flag每次初始化为0;
    输入ch;
    if( ch满足是字母或下划线 ){
    for(;ch不等于'\n'时;){
    if( ch满足是字母或下划线或数字 )flag=1;
    else flag为0;
    if( flag等于0){
    输出NO,并调用tozero函数,去到循环末尾的repeat自减;
    }
    再输入ch;
    }
    else 调用tozero函数;
    if( flag等于0)输出NO;
    else 输出YES;
    }

(3)代码截图

1235979-20171126124025437-158645656.png
1235979-20171126124119625-312377309.png
1235979-20171126124158453-728547394.png

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

  • 1235979-20171126144751593-807537177.png
  • 1235979-20171126145102906-1726252375.png
  • 1235979-20171126145243156-542247416.png
  • 1235979-20171126145318359-603016359.png
  • 可以看到此处ch的值首先为'\n',所以才会输出NO,并且,在随后的调试中,发现1num的四个字符都被判断了一遍,所以才会输出超限。
  • 于是在输入repeat后又加一句getchar()使ch值不为'\n',再写一个可以将ch的值循环到为'\n'为止的自定义函数,再加入标志变量flag保证当这一串字符中有一个不满足条件就直接输出NO,并调用函数使ch为'\n',且要直接跳到循环末尾的自减。

题目2(7-9)

(1).本题PTA提交列表

1235979-20171126104722515-460036180.png

(2)设计思路

  • 定义两个字符变量front 、ch ,标志变量flag初始化为1;
  • 输入ch;
  • while( ch不等于'\n'时 ){

  • if( ch等于+或-且flag等于1) { 

    则输出ch, flag为0,记入下一个ch,进入下一个循环;
    }

  • else if( ch等于-){

if( front等于( )输出ch;
else if( front为数字)换行输出ch再换行;
else 输出ch再换行;
}

  • else if( ch是数字或“.” )输出ch;
  • else {
    if( front为数字)换行输出ch再换行;
    else 输出ch再换行;
    }
    使flag为0;
    将ch值赋给front;
    }

(3)代码截图

1235979-20171126124405703-1693767572.png
1235979-20171126124530484-1338760720.png

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

  • 1235979-20171126190939156-993300181.png
  • 格式错误,原因在于我第一次写的代码只将数字整个输出,只考虑了负数在括号里的情况,而没有考虑到若有小数、正负号在前的第一个数的情况,
  • 1235979-20171126191442593-930258186.png
  • 运行超时的原因在于若输入了正号在前的数之后,程序会运行到这个位置,然后本应该由ch接收的值被next抢了,导致可以接着输入一串新字符。
  • 1235979-20171126192202515-764215110.png
  • 尝试在程序中加入对于next的判断,结果发现部分符号重复输出
  • 1235979-20171126192508078-967982352.png
  • 发现是因为这一段判断的原因导致next输出两遍。
  • 然后就修改了程序,把next用front代替,记入前一位字符,用来比较,这样只需在循环末尾将ch的值放入front里,而不在需要像next记入下一个字符一样麻烦。

题目3 (7-10)

(1).本题PTA提交列表

1235979-20171126104744390-702263403.png

(2)设计思路

  • 定义字符型变量ch 、整型变量:下一串数字next、计算并存放数值的total、标志变量flag初始化为1
  • 输入开头的数值(total);输入字符(ch)
  • while( 当ch不等于=时){

while( ch是数字){
total就加上ch-‘0’之后的数;
记入下一个字符ch;
}

if ( ch 等于=)跳出循环;

if ( ch为四则运算符号 ){
switch (ch){
ch 为“+”:{
用%d的scanf记入next;
total加上next;
记入下一个ch;
跳出判断;
}
ch为“-”:{
用%d的scanf记入next;
total减去next;
记入下一个ch;
跳出判断;
}
ch为“ * ”:{
用%d的 scanf 记入next;
total等于 total 乘next;
记入下一个ch;
跳出判断;
}
ch为“ / ”:{
用%d的scanf记入next;
if (next等于0){ 标志变量flag改为0;去到大循环外;
total等于 total 除next;
记入下一个ch;
跳出判断;
}
}
}

else if (ch不为= ){
输出"ERROR";
跳出循环;
}
}

if (ch正常等于=)
输出total的值;

if( flag不为1 )
输出"ERROR";

(3)代码截图

1235979-20171126124626515-140638865.png
1235979-20171126124655656-1117002030.png
1235979-20171126124719953-1718306693.png

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

  • 1235979-20171126195759015-1512192037.png
  • 发现当输入非法字符,已经输出了ERROR,但是后面的total还是输出了,是一个需要特定条件来控制的输出。
  • 1235979-20171126200410828-74166002.png
  • 1235979-20171126200944265-1285100497.png
  • 只输入5=的情况,运行输出了ERROR和5。
  • 提交列表上的部分正确都是因为这两个错误。
  • 改正方法就是当循环正常结束时才输出total;修改当非法字符出现时的做法。

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

PTA排名

1235979-20171124161801656-276305907.png

四、本周学习总结

1.你学会了什么?

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

  • 定义一维数组要存放的数的变量类型,[]中放数组中数的个数;
  • 初始化时要如a[]={}这样,大括号中的数用逗号隔开,大括号中的数从数组的0下标开始放,未存放数的为随机数

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

  • 一组连续的地址
  • 数组在内存中的首地址

1.3 为什么用数组?

  • 在需要输入并使用大量数据时可用数组来代替过多的定义变量,同时使程序更加简洁和有可读性

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

选择法
  • 除定义数组外还定义记号变量k,定义两个循环变量i,j,一个中转变量t
for ( i初始化为0;当i小于n-1时;i每循环一次加一 ){
        k每次都等于i;
        for( j等于i+1;当j小于n时;j++)
                若a[k]大于a[j],则使k=j;
        若i!=k,则交换a[i]与a[k]的值;
}
冒泡法
  • 比起选择法少了记号变量k
for( i初始化为0;i小于n-1时;i循环加一)
        for( j初始化为i+1;j小于n时;j循环加一)
                若a[i]大于a[j],则交换a[i]与a[j]的值
直接插入排序
for i=1 to n
    temp=a[i];
    if a[i]小于a[i-1]{ 
        for j=i-1 to j>=0且a[j]>temp
            将a[j]赋给a[j+1];

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

  • 找到两端的数,取它们的中间数,判断是否等于要查找的数,若小于要查找的数,则将这个中间数作为新的左端,再取中间数,再做判断
  • 顺序查找法可能需要将整个数组轮一遍才能找到,对于较庞大的数组可能耗时更久;而二分查找法对于较庞大的数组则只需要判断几遍就能找到。
  • 区别在于两者的查找方法和查找速度

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

  • 定义类型和一维数组相同,但是它需要有两个量作为行数和列数,如a[][],其中第一个是行数,第二个是列数,行数可以省略(如果后面的大括号中有初始化数组),但列数不可省略。
  • 初始化比一维数组不同的地方在于它可以在大括号中再用大括号。

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

  • 中转变量t,i=j=0;t=a[i+1][j];a[i+1][j]=a[j+1][i];a[j+1][i]=t
  • 下三角:i大于等于j;上三角:i小于等于j;对称矩阵:a[i][j]==a[j][i]

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

  • 对需要同时记入多个变量的位置的情况有特殊优势

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

详细罗列不明白地方,甚至课堂派作业不会做的地方请都详细列出。

  • 二维数组的使用方法
  • 不是能很好的能在不给题目的情况下理解程序的用意
  • 不是很懂伪代码要怎么写

转载于:https://www.cnblogs.com/linyue711/p/7891147.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值