C程序设计 第四版(谭浩强)-学习笔记-第七天

/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:用筛选法求100以内的素数 
    位置:C程序设计(第四版)2010年6月第四版 168页习题1 
*/
#include<stdio.h>
#include<math.h> 
int main()
{
    int i,j,n,a[101];//101个元素 
    for(i=1;i<=100;i++)//不要a0 
        a[i]=i;//a1-a100分别赋值1-100 
    a[1]=0;//先挖掉a1 
    for(i=2;i<sqrt(100);i++)//除数 
        for(j=i+1;j<100;j++)//被除数 
        {
            if(a[i]!=0 && a[j]!=0)//当被挖掉以后为0的时候不用除 
                if(a[j]%a[i]==0)
                    a[j]=0;//挖掉素数 
        }
    for(i=2,n=0;i<=100;i++)
    {
        if(a[i]!=0)//输出没有挖掉的数 
        {
            printf("%5d",a[i]);
            n++;
        }
        if(n==10)//每10个数换行 
        {
            printf("\n");
            n=0;
        }   
    }
    printf("\n");
    return 0;
}
/*Dev-c++输出结果: 
        2    3    5    7   11   13   17   19   23   29
       31   37   41   43   47   53   59   61   67   71
       73   79   83   89   97  100
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:用选择法对10个整数排序 
    位置:C程序设计(第四版)2010年6月第四版 168页习题2 
*/
#include<stdio.h>
int main()
{
    int i,j,min,temp,a[11];
    printf("enter data:\n");
    for(i=1;i<=10;i++)//输入10个整数 
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }
    printf("\n");
    printf("The orginal numbers:\n");
    for(i=1;i<=10;i++)//将输入的整数直接输出 
        printf("%5d",a[i]);
    printf("\n");
    for(i=1;i<=9;i++)//将输入的整数排序(小到大) 
    {
        min=i;
        for(j=i+1;j<=10;j++)//将后面的数和当前啊a[min]比较,小于的的赋值给min 
            if(a[min]>a[j])
                min=j;//获取最小整数的下标 
            temp=a[i];//中间变量temp,以下三行是交换 
            a[i]=a[min];
            a[min]=temp; 
    }
    printf("\nThe sorted numbers:\n");
    for(i=1;i<=10;i++)//按从小到大输出 
        printf("%5d",a[i]);
    printf("\n");
    return 0;
}
/*Dev-c++输出结果: 
    enter data:
    a[1]=10
    a[2]=9
    a[3]=8
    a[4]=7
    a[5]=6
    a[6]=5
    a[7]=4
    a[8]=3
    a[9]=2
    a[10]=1

    The orginal numbers:
       10    9    8    7    6    5    4    3    2    1

    The sorted numbers:
        1    2    3    4    5    6    7    8    9   10
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:求一个3*3的整型矩阵对角线元素之和 
    位置:C程序设计(第四版)2010年6月第四版 168页习题3
*/
#include<stdio.h>
int main()
{
    int a[3][3],sum=0;//三行三列的数组
    int i,j;
    printf("enter data:\n");
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            scanf("%d",&a[i][j]);//输入最大三位数,防止数据超过变量 
        for(i=0;i<3;i++)
            sum=sum+a[i][i];//其实是a[0][0]+a[1][1]+a[2][2],不是求对角线全部和(对角线有两条,这里只求出其中一条的和) 
        printf("sum=%6d\n",sum); 
    return 0;
}
/*Dev-c++输出结果: 
    enter data:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sum=    15
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中 
    位置:C程序设计(第四版)2010年6月第四版 168页习题4
*/
#include<stdio.h>
int main()
{
    int a[11]={1,4,6,9,13,16,19,28,40,100};//定义并初始化升序数组,最后的a[10]=0 
    int temp1,temp2,number,end,i,j;
    printf("array a:\n");
    for(i=0;i<10;i++)
        printf("%5d",a[i]);
    printf("\n");
    printf("insert data:");
    scanf("%d",&number);
    end=a[9];
    if(number>end)//跟最后一个数比较 
        a[10]=number;
    else
    {
        for(i=0;i<10;i++)
        {
            if(a[i]>number)//直到有一个a[i]比number大 
            {
                temp1=a[i];//将这个数给中间变量 
                a[i]=number;//number代替a[i]
                for(j=i+1;j<11;j++)//后面的数组每位都加一 
                {
                    temp2=a[j];//下面三行都是用中间变量temp2进行数据交换 
                    a[j]=temp1;
                    temp1=temp2;
                }
                break;//找到了就不用再看后面的数(关键) 
            }
        }
    }
    printf("Now array a:\n");
    for(i=0;i<11;i++)
        printf("%5d",a[i]);
    printf("\n");
    return 0;
}
/*Dev-c++输出结果: 
    array a:
        1    4    6    9   13   16   19   28   40  100
    insert data:50
    Now array a:
        1    4    6    9   13   16   19   28   40   50  100
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:将一个数组中的值按逆序重新存放。例如,原来循序为8,6,5,4,1。要求改成1,4,5,6,8。 
    位置:C程序设计(第四版)2010年6月第四版 168页习题5
*/
#include<stdio.h>
#define N 5
int main()
{
    int a[N],i,temp;
    printf("enter array a:\n");
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    printf("array a:\n");
    for(i=0;i<N;i++)
        printf("%4d",a[i]);
    for(i=0;i<N/2;i++)//只要将前一半和后一半交换就行,单数则中间一项不变 
    {
        temp=a[i];
        a[i]=a[N-i-1];//将对应的项赋值(后一半赋值给前一半) 
        a[N-i-1]=temp;// 将对应的项赋值(前一半赋值给后一半) 
    }
    printf("\nNow array a:\n");
    for(i=0;i<N;i++)
        printf("%4d",a[i]);
    printf("\n");
    return 0;
}
/*Dev-c++输出结果: 
    enter array a:
    8
    6
    5
    4
    1
    array a:
       8   6   5   4   1
    Now array a:
       1   4   5   6   8
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:输出以下的杨辉三角形(要求输出10行) 
    位置:C程序设计(第四版)2010年6月第四版 168页习题6
*/
#include<stdio.h>
#define N 10
int main()
{
    //杨辉三角规律:a[i][j]=a[i-1][j]+a[i-1][j-1];每一行的首尾是1,其他数=上一行同列+上一行前列 
    int i,j,a[N][N];
    for(i=0;i<N;i++)
    {
        a[i][i]=1;//尾数为1 
        a[i][0]=1;//头数为1
    }
    for(i=2;i<N;i++)//从第三行开始 
        for(j=1;j<=i-1;j++)
            a[i][j]=a[i-1][j]+a[i-1][j-1];// 其他数=上一行同列+上一行前列 
        for(i=0;i<N;i++)//输出杨辉三角 
        {
            for(j=0;j<=i;j++)
                printf("%6d",a[i][j]);
            printf("\n");
        }
    printf("\n");
    return 0;
}
/*Dev-c++输出结果: 
         1
         1     1
         1     2     1
         1     3     3     1
         1     4     6     4     1
         1     5    10    10     5     1
         1     6    15    20    15     6     1
         1     7    21    35    35    21     7     1
         1     8    28    56    70    56    28     8     1
         1     9    36    84   126   126    84    36     9     1
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为8 1 6 3 5 7 4 9 2
          要求输出1~n^2的自然数构成的魔方阵 
    位置:C程序设计(第四版)2010年6月第四版 168页习题7
*/
#include<stdio.h>
int main()
{
    int a[15][15],i,j,k,p,n;
    p=1;
    while(p==1)
    {
        printf("enter n(n=1--15):");
        scanf("%d",&n);
        if((n!=0) && (n<=15) && (n%2!=0))//输入1~15的奇数 
            p=0;
        //初始化
        for(i=1;i<=n;i++)//这个数组时从a[1][1]开始
            for(j=1;j<=n;j++)
                a[i][j]=0;//初始化为0 
        //建立魔方阵
        j=n/2+1;//中间列下标 
        a[1][j]=1;//第一行中间列赋值1 
        for(k=2;k<=n*n;k++)
        {
            i=i-1;//每一个数存放比前一个数的行数减一 (正常情况) 
            j=j+1;//每一个数存放比前一个数的列数加一 (正常情况) 
            if((i<1) && (j>n))//当上一个数是第一行第n列时,则把下一个数放到上一个数的下面 
            {   
                i=i+2; 
                j=j-1;
            }
            else
            {
                if(i<1)
                    i=n;//如果上一个数的行数为1,则下一行数为n 
                if(j>n)
                    j=1;//如果上一个数的列数为n,则下一列数为1 
            }
            if(a[i][j]==0)
                a[i][j]=k;//这个地方没有数据 
            else
            {//这个地方有数据,则把下一个数放到上一个数的下面 
                i=i+2;
                j=j-1;
                a[i][j]=k; 
            }
        }
        //输出魔方阵
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
                printf("%5d",a[i][j]);
            printf("\n");
        }       
    } 
    return 0;
}
/*Dev-c++输出结果: 
    enter n(n=1--15):5
       17   24    1    8   15
       23    5    7   14   16
        4    6   13   20   22
       10   12   19   21    3
       11   18   25    2    9
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点。 
    位置:C程序设计(第四版)2010年6月第四版 169页习题8
*/
#include<stdio.h>
#define N 4
#define M 5 
int main()
{
    int i,j,k,a[N][M],max,maxj,flag;
    printf("please input matriz:\n");
    for(i=0;i<N;i++)
        for(j=0;j<M;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<N;i++)//遍历每一行 
    {
        max=a[i][0];//假设每一行第一个数为最大 
        maxj=0;
        for(j=0;j<M;j++)//遍历一行中每一个数 
            if(a[i][j]>max)//找出一行中最大的值 给max,下标给maxj 
            {
                max=a[i][j];
                maxj=j; 
            }
        flag=1;//标记有鞍点 
        for(k=0;k<N;k++)//遍历一列中每一个数 
            if(max>a[k][maxj])//如果找到该列中的数比max大 
            {
                flag=0;//标记没有鞍点 
                continue;//结束本次循环(有没有都可以吧?break;呢?不是更好吗??) 
            }
        if(flag)//存在鞍点,输出 
        {
            printf("a[%d][%d]=%d\n",i,maxj,max);
            break;
        }
    }
    if(!flag)//不存在鞍点 
        printf("It is not exis!\n");
    return 0;
}
/*Dev-c++输出结果: 
    please input matriz:
    1 2 3 4 5
    6 7 8 9 10
    11 12 13 14 15
    16 17 18 19 20
    a[0][4]=5
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素。如果该数不在数组中,则输出“无此数” 
    位置:C程序设计(第四版)2010年6月第四版 169页习题9
*/
#include<stdio.h>
#define N 15
int main()
{
//时间复杂度:int(log2n)+1 
    int i,number,top,bott,mid,loca,a[N],flag=1,sign;
    char c;
    printf("enter data:\n");
    scanf("%d",&a[0]);//输入一个数 
    i=1;
    while(i<N)//输入剩下的14个数 
    {
        scanf("%d",&a[i]);
        if(a[i]>=a[i-1])//如果输入的数比上一个数小i++否则重新输入覆盖原来的值 
            i++;
        else
            printf("enter this data again:\n");
    }
    printf("\n");
    for(i=0;i<N;i++)//输出所有数 
        printf("%5d",a[i]);
    printf("\n");
    while(flag)//查找开始 
    {
        printf("input number to look for:");
        scanf("%d",&number);//输入要查找的数 
        sign=0;//未查找到 
        top=0;//查找区间起始位置 
        bott=N-1;//查找区间最末位置 
        if((number<a[0]) || (number>a[N-1]))// 小于最小大于最大,则不在该数组内,返回-1 
            loca=-1;//无法找到返回-1 
        while((!sign) && (top<=bott))//折半查找算法 
        {
            mid=(bott+top)/2;//取折中数 
            if(number==a[mid])
            {
                loca=mid;
                printf("Has found %d,its position is %d\n",number,loca+1);//数组从0开始,所以位置要加1 
                sign=1;//标记找到了 
            }
            else if(number<a[mid])
            {
                bott=mid-1;//将尾部赋值给bott 变成top~mid-1 
            }
            else
                top=mid+1;//将头部赋值给top 变成mid+1~bott 
        }
        if((!sign || loca==-1))
            printf("cannot find %d.\n",number);//无法找到 
        printf("continue or not(Y/N)?");//继续吗? 
        scanf(" %c",&c);
        if(c=='N' || c=='n')//输入N OR n结束否则继续 
            flag=0;//结束 
    }
    return 0;
}
/*Dev-c++输出结果: 
enter data:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

        1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
    input number to look for:16
    cannot find 16.
    continue or not(Y/N)?y
    input number to look for:17
    cannot find 17.
    continue or not(Y/N)?y
    input number to look for:7
    Has found 7,its position is 7
    continue or not(Y/N)?n
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能: 有三行文字每行80字符,统计英文大写字母,英文小写字母,数字,空格以及其他字符的个数 
    位置:C程序设计(第四版)2010年6月第四版 169页习题10
*/
#include<stdio.h>
int main()
{
    int i,j,upp,low,dig,spa,oth; 
    char text[3][80];
    upp=low=dig=spa=oth=0;//初始化大写,小写,数字,空格,其他为0
    for(i=0;i<3;i++)
    {
        printf("please input line %d:\n",i+1);
        gets(text[i]);
        for(j=0;j<80 && text[i][j]!='\0';j++)
        {
            if(text[i][j]>='A' && text[i][j]<='Z')
                upp++;
            else if(text[i][j]>='a' && text[i][j]<='z')
                low++;
            else if(text[i][j]>='0' && text[i][j]<='9')
                dig++;
            else if(text[i][j]==' ')
                spa++;
            else
                oth++;
        }
    } 
    printf("\nupper case:%d",upp);
    printf("\nlower case:%d",low);
    printf("\ndigit :%d",dig);
    printf("\nspace :%d",spa);
    printf("\nother :%d\n",oth);
    return 0;
}
/*Dev-c++输出结果: 
    please input line 1:
    i am a student
    please input line 2:
    123456
    please input line 3:
    ASDF*&

    upper case:4
    lower case:11
    digit :6
    space :3
    other :2
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:输出以下图案 
    位置:C程序设计(第四版)2010年6月第四版 169页习题11
*/
#include<stdio.h>
int main()
{
    int a[5]={'*','*','*','*','*'};
    int i,j,k;
    char space=' ';
    for(i=0;i<5;i++)
    {
        printf("\n");
        printf(" ");
        for(j=1;j<=i;j++)//输出空格 
            printf("%c",space);
        for(k=0;k<5;k++)//输出*号 
            printf("%c",a[k]);
    }
    printf("\n");
    return 0;
}
/*Dev-c++输出结果: 

     *****
      *****
       *****
        *****
         *****  
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:翻译密码,第1个字母变成第26个字母,第i个字母变成第26-i+1个字母 
    位置:C程序设计(第四版)2010年6月第四版 169页习题12
*/
#include<stdio.h>
int main()
{
//方法一:用两个字符数组分别存放原文和密码
//如果ch[j]是大写字母则它是第(ch[j]-64)个大写字母,转换成第(26-i+1)个大写字母,而26-i+1=26-(ch[j]-64)+1=91-ch[j],转换成第(91-ch[j])个字母
//因此这个字母为91-ch[j]+64=155-ch[j]
//如果ch[j]是小写字母则它是第(ch[j]-64)个大写字母,转换成第(26-i+1)个大写字母,而26-i+1=26-(ch[j]-64)+1=91-ch[j],转换成第(91-ch[j])个字母
//因此这个字母为26+96-ch[j]+1+96=219-ch[j]
//  int j,n;
//  char ch[80],tran[80];
//  printf("input cipher code:");
//  gets(ch);
//  printf("\ncipher code:%s",ch);
//  j=0;
//  while(ch[j]!='\0')
//  {
//      if((ch[j]>='A') && (ch[j]<='Z'))
//          tran[j]=155- ch[j];
//      else if((ch[j]>='a') && (ch[j]<='z'))
//          tran[j]=219-ch[j];
//      else
//          tran[j]=ch[j];
//      j++;
//  }
//  n=j;
//  printf("\noriginal text:");
//  for(j=0;j<n;j++)
//      putchar(tran[j]);
//  printf("\n");
//  return 0;

//方法二:只用一个字符数组
    int j,n;
    char ch[80];
    printf("input cipher code:");
    gets(ch);
    printf("\ncipher code:%s",ch);
    j=0;
    while(ch[j]!='\0')
    {
        if((ch[j]>='A') && (ch[j]<='Z')) 
            ch[j]=155- ch[j];
        else if((ch[j]>='a') && (ch[j]<='z'))
            ch[j]=219-ch[j];
        else
            ch[j]=ch[j];
        j++;
    }
    n=j;
    printf("\noriginal text:");
    for(j=0;j<n;j++)
        putchar(ch[j]);
    printf("\n");
    return 0;
}
/*Dev-c++输出结果: 
    input cipher code:abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ

    cipher code:abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ
    original text:zyxwvutsrqponmlkjihgfedhbaZYXWVUTSRQPONMLKJIHGFEDHBA
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:将两个字符串连接起来,不要用strcat 
    位置:C程序设计(第四版)2010年6月第四版 169页习题13
*/
#include<stdio.h>
int main()
{
    char s1[80],s2[40];
    int i=0,j=0;
    printf("input string s1:");
    scanf("%s",s1);
    printf("input string s2:");
    scanf("%s",s2);
    while(s1[i]!='\0')//获取s1 
        i++; 
    while(s2[j]!='\0')//获取s2 
        s1[i++]=s2[j++];//在s1后追加s2 
    s1[i]='\0';//最后添加结束符 
    printf("\nThe new string is:%s\n",s1);
    return 0;
}
/*Dev-c++输出结果: 
    input string s1:iama
    input string s2:student

    The new string is:iamastudent
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:将两个字符串s1和s2比较,若s1>s2输出一个正数,若s1=s2输出0,若s1<s2输出一个负数,不要用strcpy函数
          两个字符串用gets函数读入,输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值 
    位置:C程序设计(第四版)2010年6月第四版 169页习题14
*/
#include<stdio.h>
int main()
{
    int i,resu;
    char s1[100],s2[100];
    printf("input string1:");
    gets(s1);
    printf("\ninput string2:");
    gets(s2);
    i=0;
    while((s1[i]==s2[i]) && (s1[i]!='\0'))//当s1和s2的字母一样并且s1没有结束的时候 
        i++;
    if(s1[i]=='\0' && s2[i]=='\0')//如果相等返回0 
        resu=0;
    else//否则比较他们的差值  
        resu=s1[i]-s2[i];
    printf("\nresult:%d\n",resu); 
    return 0;
}
/*Dev-c++输出结果: 
    input string1:And

    input string2:Aid

    result:5
*/


/*  创建时间:20171227
    创建人:fangweijun(773714759@qq.com)
    功能:将字符数组s2中的全部字符赋值到字符数组s1中,不用strcpy,复制时'\0'也要复制过去,后面的不用复制 
    位置:C程序设计(第四版)2010年6月第四版 169页习题15
*/
#include<stdio.h>
#include<string.h> 
int main()
{   
    char s1[80],s2[80];
    int i;
    printf("input s2:");
    scanf("%s",s2);
    for(i=0;i<strlen(s2);i++)//strlen返回字符串长度,并根据长度逐一赋值到s1字符串中,完成复制 
        s1[i]=s2[i];
    printf("s1:%s\n",s1);
    return 0;
}
/*Dev-c++输出结果: 
    input s2:iamastudent
    s1:iamastudent
*/
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值