21Winter\ C语言程序设计第六章

C语言程序设计 第六章

expr 2.1

#include<stdlib.h>
#include<stdio.h>
int main(){
    int i,n;
    scanf("%d",&n);
    for(i = 2; i<=n;i++){
        while(n!=0){
            if(n%i==0){
                printf("%d*",i);
                n /= i;
            }
            else{
                break;
            }
        }
    }
    putchar('\b');
    return 0;
}

在这个代码之中,因为有for循环对于i变量进行着范围的约束,所以说只要是n!=0就可以了,可以不用考虑最后n=1,i一直累加进入死循环的情况。(可以与实验六之中的my_fun()函数进行比较)

因为在实验六之中,质因数的分解是在同一个while循环中完成的,所以说只用了一层的循环。而且并没有对i进行范围的限制,所以导致如果在“1”的情况之下不break会出现死循环。

void fun(int m){
    int i = 2;
    printf("%d = 1",m);
    while(m>1){			//在这里对1进行约束,防止出现1一直除不尽,所以一直i++的情况。
        if(m%i==0){
            m/=i;
            printf("*%d",i);
        }
        else i++; 
    }
}

expr 2.2

#include<stdio.h>
#include<stdlib.h>
int datoi(char str[]){
    int value = 0, i = 0;
    while(str[i]!='\0'){
        value = value*10 + str[i] - '0';
        i++;
    }
    return value;
}
int main(){
    char *str = "9999";
    printf("%d",datoi(str)*10+9);
    return 0;
}

注意,在做这个实验的时候不可以

#include<stdlib.h>

因为atoi这个函数在stdlib.h这个库之中已经存在了,相当于是对于这个函数进行复写,所以会导致报错。

expr 2.3

#include<stdio.h>
void maxval(int (*num)[4]){
    int i, j, max, row =0, col = 0;
    max = num[0][0];
    for(i=0; i<4; i++)
        for(j=0; j<4;j++)
            if(max<num[i][j]){
                max = num[i][j];
                row = i;
                col = j;
            }
    printf("the maxium value lies in %d row, %d column, equals to %d",row, col, max);
}
int main(){
    int num[4][4]= {1,2,3,4,4,3,2,1,9,8,7,6,6,7,8,9};
    maxval(num);
    return 0;
}

expr 2.9

注意插入排序!!

#include<stdio.h>
#include <stdlib.h>
void insert(float* num,float new){
    int i = 11;
    num[12] = new;
    while( i>=0 && num[i]<num[i+1]){	//这个是针对题目之中所给的条件“递减数列”得来的。
        new = num[i+1];
        num[i+1] = num[i];
        num[i] = new;
        i--;
    }
}
int main(){
    float *num = (float*)malloc(sizeof(float)*13);
    for(int i=0;i<12;i++)   num[i] = -i*i;
    float new;
    scanf("%f",&new);
    insert(num,new);
    for(int i=0;i<13;i++)   
        printf("%f\t",num[i]);
    return 0;
}

expr 2.10

#include<stdio.h>
#include <stdlib.h>
int mycmp(char *p1, char* p2){
    while(*p1 && *p2 && *p1 == *p2){
        p1++, p2++;
    }
    return *p1 - *p2;
}
int main(){
    char *p1, *p2;
    p1 = (char*)malloc(sizeof(char)*20);
    p2 = (char*)malloc(sizeof(char)*20);
    gets(p1);
    gets(p2);
    printf("%d",mycmp(p1,p2));
    return 0;
}

Equivalent Solution:

int mycmp(char *p1, char* p2){
    while(*p1 && *p2 && *p1++ == *p2++);
    return *(--p1) - *(--p2);
}

expr 3.3

#include<stdio.h>
#include <stdlib.h>
void ss(char*s, char t){
    while(*s){
        if(*s==t)
            *s = t -'a' +'A';
        s++;
    }

}
void main(void){
    char str1[100] = "abcddfefdbd", c = 'd';
    ss(str1,c);
    puts(str1);
}

The code in Line 6 search for a particular character that is equal to the input char t, and return a Capitalized character in the string.

expr 3.6

#include<stdio.h>
#include <stdlib.h>
void sort(int a[], int n){
    int i,j,t;
    for(i = 0; i<n-1; i++)
        for(j = i+1; j<n; j++)
            if(a[i]<a[j]){
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
}
void main(void){
    int aa[10] = {1,2,3,4,5,6,7,8,9,10},i;
    sort(&aa[3],5);
    for(i =0; i<10; i++){
        printf("%d\t",aa[i]);
    }
}

上述的代码的核心原理是,以输入的int型指针a为起点,以a+n-1指针为终点,进行降序的排序。

从a[3]开始,长度为5的子列进行一个降序的排序。

expr 3.7

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void sort(char **str, int n){
    char * tmp;
    int i, j;
    for(i=0; i<n-1; i++)
        for(j=0; j<n-i-1;j++)
            if(strcmp(str[j],str[j+1])>0){
                tmp = str[j], str[j] = str[j+1], str[j+1] = tmp;
            }
}
int main(){
    char **ps, *str[3] ={"BOOK", "COMPUTER", "CHINA"};
    int i;
    ps = str;
    sort(str,3);
    for(i=0;i<3;i++)
        puts(str[i]);
    return 0;
}

expr 5.2

#include<stdio.h>
#include<stdlib.h>
int prime(int x){
    int flag = x;
    for(int i = 2;i<x;i++)
        if(x%i ==0){
            flag = 0;
            break;
        }
    return flag;
}
int main(){
    int n,sum=0;
    scanf("%d",&n);
    for(int i=2; i<=n; i++)
        sum+=prime(i);
    printf("%d",sum);
    return 0;
}

expr 5.10

#include<stdio.h>
#include<stdlib.h>
int sort(short *num, int n){
    int p;
    short temp;
    for(int i=0;i<n-1;i++){
        int p = i;
        for(int j = i+1;j<n;j++)
            if(num[p]<num[j])
               p = j;
        if(p!=i)
            temp = num[p],num[p] = num[i], num[i] = temp;
    }
    return 0;
}
int main(){
    short* num = (short*)malloc(sizeof(short)*30);
    for(int i=0;i<20;i++) 
         num[i]= (rand()%1000)/7; 
    sort(num,20);
    for(int i=0;i<20;i++)
        printf("%d\t",num[i]);
    return 0;
}
上一篇:Python 运算符练习 not and or


下一篇:【记录】Windows host配置域名