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

一、PTA实验作业

题目1(7-8)

(1).本题PTA提交列表

(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)代码截图



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

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

题目2(7-9)

(1).本题PTA提交列表

(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)代码截图


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

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

题目3 (7-10)

(1).本题PTA提交列表

(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)代码截图



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

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

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

PTA排名

四、本周学习总结

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.本周的内容,你还不会什么?

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

  • 二维数组的使用方法
  • 不是能很好的能在不给题目的情况下理解程序的用意
  • 不是很懂伪代码要怎么写
posted @ 2017-11-26 20:19  那就这个名字  阅读(299)  评论(5编辑  收藏  举报