C语言第二次实验作业

 

题目:计算天数,编写程序计算某年某月某日是该年的第几天(11-3)

思路:相方法将从一月一日开始加到输入的年月日,计算天数;

方法:使用数组,把每一个月份的对应天数存储到矩阵中,再通过循环计算出总天数;

源程序:#include <stdio.h>
                int main(){
        int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
        int y,m,d,k,flag=0;
        scanf("%d/%d/%d",&y,&m,&d);
        if(y%400==0||(y%4==0&&y%100!=0))flag=1;
        for(k=1;k<m;k++)d+=a[flag][k];
        printf("%d",d);
        return 0;
          }

遇到的问题:写时没想到能用两列分别代表闰年和非闰年,导致未想到用矩阵的方法,异常麻烦

心得:这种比叫确定的数需要相加的类型题用矩阵或数组好做;

题目:字符串转换成十进制整数(输入一个以#结束的字符串,先滤去所有的非十六进制字符,组成一个新的十六进制字符串,编写程序将该字符串转换成十进制整数输出;若在第一个十六进制字符前存在字符‘-’,则表示其为负数。(12-5)

思路:先输入一个字符串,再判断什么时候出现第一个十六进制字符,记住下标,再判断在这个下标之前的位置是否含‘-’,若有,则跳出循环且说明该数是负数,若没有,则是正数。

方法:定义一个字符数组输入字符串,记录第一个十六进制字符的下标,再利用for循环检查从k=0到k=i-1的字符是否出现‘-’;最后将新字符串转换成数字即好。

源程序

#include <stdio.h>
int main(){
  char a[80],b[80];
  int i=0,d=0,k=0,c;
  long m;
  while((a[i]=getchar())!='#'){                               //输入字符串
    i++;
  }
  for(k=0;k<i;k++){
    if((a[k]<='9'&&a[k]>='0')||(a[k]<='F'&&a[k]>='A')||(a[k]<='f'&&a[k]>='a')){
      c=k;
      k=i;
    }}                                                                    //判断第一个十六进制字符出现的位置
  for(k=0;k<c;k++){
    if(a[k]=='-'){
      printf("-");
      k=c;
    }
  }                                                                       //判断是否为负数
  for(k=0;k<i;k++){
    if((a[k]<='9'&&a[k]>='0')||(a[k]<='F'&&a[k]>='A')||(a[k]<='f'&&a[k]>='a')){
     b[d]=a[k];
     d++;
    }}                                                                     //建立一个新字符串
   for(k=0;k<d;k++){
   if(b[k]<='9'&&b[k]>='0')m=m*16+b[k]-'0';
   else if(b[k]<='F'&&b[k]>='A')m=m*16+b[k]-'A'+10;
   else if(b[k]<='f'&&b[k]>='a')m=m*16+b[k]-'a'+10;
    }                                                                    //将字符串转化为对应的整数
    printf("%ld",m);

  return 0;
}

遇到的问题:写程序时未想到直接将负号输出,一直想着保存在数组里,导致出错;

心得:很多题目也许看着复杂,但静下心来想一下并不会很复杂;

题目使用函数选择法排序,要求实现一个用选择法对整数数组进行简单排序的函数13-4

思路使用两个循环,一个循环用以计算循环次数,一个循环用以数组遍历比较;

方法使用循环嵌套,外循环计数,内循环用以比较出最小的数

源程序

#void sort( int a[], int n ){

  int i,min,index,k;

  for(i=0;i<n;i++){

    min=i;

    for(k=i+1;k<n;k++){

      if(a[k]<a[min])min=k;

    }

    index=a[i];

    a[i]=a[min];

    a[min]=index;

  }

}

遇到的问题外循环和内循环的下标联系未搞清楚;

心得C语言题目很锻炼思维,能使思路更清晰

题目给字符串排序,给输入的五个字符串按从小到大排序14-8

思路数类似数组元素的选择排序

方法 调用strcmp函数和strcpy函数

源程序

#include<stdio.h>

#include<string.h>

int main(void)

{

    int i,j;

    char a[5][80], t[80];//改大了点,不然字符串太长会超出数组范围

    

    for (i = 0; i < 5; i++)

    {

        scanf("%s",a[i]);

    }

    for (i = 1; i < 5; i++)

    {

        for (j =0; j < 5-i ;j++)

        if (strcmp(a[j], a[j+1]) > 0)

        {

        strcpy(t,a[j]);

        strcpy(a[j], a[j + 1]);

        strcpy(a[j + 1], t);

        }

    }

    printf("After sorted:\n");

    for (i = 0; i < 5; i++)

    puts(a[i]);

    return 0;

}遇到的问题对字符串函数的调用不是很理解;

心得C语言中有很多函数用了后很方便,我们要学习的有很多

 题目求链式表表长15-4

思路从表头开始,计算链表中有效节点的个数;

方法 利用指针

源程序

 int Length( List L ){

  int len=1;

  if(L==NULL)return 0;

  else {

    while(L->Next!=NULL){

      len++;

      L=L->Next;

    }

    return len;

  }

}

遇到的问题define不是很理解,对函数名看不大懂;

心得学习一门课程要理解性学习;

 

posted on 2018-01-26 09:15  松岛菜  阅读(295)  评论(0编辑  收藏  举报