C语言-思路与编程1

1、根据输入字符的ASCII码来判别字符的类别。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

答:

(1)由ASCII码表可知ASCII值小于32的为控制字符,在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母,在“a”和“z”之间为小写字母,其余则为其它字符。 1)先从键盘接收一个字符。2)根据ASCII码表判断字符的类别。3)输出字符的类别。

(2)代码如下:

#include <stdio.h>
#include <string.h>

int main() {
    char c;
    printf("Input a character:\n");
    fflush(stdout);
    c = getchar();
    if (c < 32) {
        printf("This is a control character\n");
    } else {
        if (c >= '0' && c <= '9') {
            printf("This is a digit\n");
        } else {
            if (c >= 'A' && c <= 'Z') {
                printf("This is a capital letter\n");
            } else {
                if (c >= 'a' && c <= 'z') {
                    printf("This is a small letter\n");
                } else {
                    printf("This is an other character\n");
                }
            }
        }
    }
    return 0;
}

2、利用指针变量自增的方式输出一维数组中的所有元素。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

答:

(1)1)定义一个一维数组b,指针变量p,并初始化一维数组b。2)利用for循环实现指针变量自增的方式输出一维数组中的所有元素。

(2)代码如下:

#include <stdio.h>

#define SIZE 3 // 定义了一个宏SIZE,代表字符3

int main() {
    int i, b[] = {1, 2, 3}; // 定义整型变量i,整型数组b,并进行了初始化
    int *p; // 定义了整型指针变量p
    for (p = b; p < b + SIZE; p++) {
        printf("*p=%d\n", *p); // 利用只恨变量自增的方式依次打印数组元素
    }
    return 0;
}

3、输入一个八进制数并转换为十进制数。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

答:

(1)八进制转换为十进制数的方法是按权相加,即将八进制每位上的数乘以位权,然后相加之和即是十进制数,利用数组存放八进制数的各位数码。1)先从键盘接收一个八进制数。2)将八进制数转化为十进制数。3)输出对应的十进制数。

(2)代码如下:

#include <stdio.h>

#define N 6 // 定义了一个宏N,代表字符6

int main() {
    int n, temp;
    char s[N], *p = s;
    printf("请输入八进制数:");
    fflush(stdout);
    gets(p);
    for (n = 0; (*p) != '\0'; p++) { // 判断p所指向的字符是不是空字符
        temp = *p - '0';
        n = n * 8 + temp; // 八进制数转十进制数
    }
    printf("对应的十进制数:%d\n", n);
    return 0;
}

4、键盘输入一整数,显示与之对应的星期值,当输入-1时结束。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

答:

(1)1)定义枚举类型,用枚举常量来对应星期值。2)从键盘接收一个整数,利用do-while循环和switch语句来实现:当用户输入1~7时,对应mon,tue, wed, thu, fri, sta, sun,即输出对应的星期值;当用户输入-1时,结束循环;当用户输入其他时,提示用户输入错误。

(2)代码如下:

#include <stdio.h>

int main() {
    enum week_type { // 定义枚举类型week_type,枚举常量对应星期值
        mon = 1, tue, wed, thu, fri, sta, sun
    } workday; // 定义枚举变量workday
    int i;
    do {
        printf("Please input integer(end:-1)\n");
        fflush(stdout);
        scanf("%d", &i); // 从键盘接收一个整型值
        workday = (enum week_type) i; // 把i赋值给枚举变量workday
        switch (workday) {
            case sun:
                printf("Sunday\n");
                break;
            case mon:
                printf("Monday\n");
                break;
            case tue:
                printf("Tuesday\n");
                break;
            case wed:
                printf("Wednesday\n");
                break;
            case thu:
                printf("Thursday\n");
                break;
            case fri:
                printf("Friday\n");
                break;
            case sta:
                printf("Saturday\n");
                break;
            default:
                printf("Input error\n");
                break;
            case -1:
                printf("Goodbye!\n");
        }
    } while (i != -1);
    return 0;
}

5、请设计一个程序,完成从屏幕上输入日期(年、月、日),计算其为该年的第几天的功能。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

答:

(1)1)将年月日定义成一个结构体类型;2)从键盘接收日期;3)统计天数,如果是闰年,天数要多一天;4)输出日期对应的天数。

(2)代码如下:

#include <stdio.h>

struct date_type { // 定义一个结构体类型
    int year; // 年
    int month; // 月
    int day; // 日
};

int main() {
    int days = 0, i;
    struct date_type date; // 定义结构体变量date
    int mon_day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 定义整型数组,对应每个月的天数
    printf("请输入日期(年 月 日):\n");
    scanf("%d%d%d", &date.year, &date.month, &date.day);
    for (i = 1; i < date.month; i++) {
        days = mon_day[i - 1] + days;
    }
    days = days + date.day;
    // 判断是不是闰年,如果是闰年,则天数要多加1天
    if (((date.year % 4 == 0) && (date.year % 100 != 0) || (date.year % 400 == 0) && (date.month >= 3))) {
        days = days + 1;
    }
    printf("请输入日期是该年第%d天\n", days);
    return 0;
}

6、定义一个矩阵a,计算矩阵上三角阵(不包括对角线元素)各元素之和,并8行2列输出矩阵 a。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

答:

(1)1)定义二维数组a,并初始化;2)利用两层for循环判断二维数组中元素是否为矩阵上三角阵(不包括对角线元素)的元素,如果是则进行累加,并赋值到t;3)8行2列输出矩阵a。

(2)代码如下:

#include <stdio.h>

int main() {
    int a[4][4] = {{2, 3, 4},
                   {5, 6, 7},
                   {8, 9, 1}};
    int i, j, t = 0;
    for (i = 0; i < 4; i++) { // 判断二维数组的某一行
        for (j = i + 1; j < 4; j++) { // 判断是不是上三角元素
            t += a[i][j];
        }
    }
    printf("矩阵上三角阵(不包括对角线元素)各元素之和t=%d\n", t);
    // 8行2列打印数组
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            printf("%3d", a[i][j]);
            if ((j + 1) % 2 == 0) {
                printf("\n");
            }
        }
    }
    return 0;
}

7、现将已输入的字符串中的非数字字符剔除,并将数字字符在屏幕上显示(如输入“ab*12cx_3Y”,输出“123”) 。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

答:

(1)1)定义一个字符数组s,存入从键盘接收到的字符串;2)用for循环字符串中的数字记录下来;3)将已输入的字符串中的数字字符输出。

(2)代码如下:

#include <stdio.h>
#include <string.h>

int main() {
    char s[100];
    int i, j;
    gets(s);
    for (j = i = 0; s[i]; i++)
        if (s[i] >= '0' && s[i] <= '9')
            s[j++] = s[i];
    s[j] = '\0';
    printf("%s\n", s);
    return 0;
}

8、甲学院获a项,乙学院获b项。从键盘上分别给变量a、b输入甲乙奖励数,在计算机交换a、b变量值,在屏幕上输出较大值。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)1)定义整型变量a,b,从键盘中接收a,b的值;2)用C语言中的三目运算符判断a,b的中的较大值;3)在屏幕上输出较大值。

(2)代码如下:

#include <stdio.h>

int main() {
    int a,b;
    scanf("a=%d,b=%d",&a,&b);
    printf("a,b中的较大值是:%d\n",(a>b) ? a: b);
    return 0;
}

9、从终端上接收 C语言源程序,删去程序中的注释(/*…*/)后再输出。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)1)定义一个子函数in_comment(),通过getchar()从键盘接收字符,如果不是/*…*/就把d赋值给c;2)主函数中,通过getchar从键盘接收一个字符,首先判断是不是结束符,如果不是就判断是不是为'/’,如果不是就输出;如果是‘/’,就判断下一个是不是‘*’,是就调用子函数in_comment(),如果不是‘*’,就输出。

(2)代码如下:

#include <stdio.h>

void in_comment() {
    int c, d; // 定义整型变量c,d
    c = getchar();  // 通过getchar()函数,从键盘接收一个字符c
    d = getchar(); // 通过getchar()函数,从键盘接收一个字符d
    while (c != '*' || d != '/') {
        c = d;
        d = getchar();
    }
}

int main() {
    char c, d;
    while ((c = getchar()) != EOF) { // 通过getchar()函数,从键盘接收一个字符c,并判断是不是结束符
        if (c == '/') { // 判断是不是'/'字符
            if ((d = getchar()) == '*') {
                in_comment();
            } else { // 如果接下来没有'*'字符就输出
                putchar(c);
                putchar(d);
            }
        } else { // 如果不是'/'字符就输出
            putchar(c);
        }
    }
    return 0;
}

10、将两个升序数组合并。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)1)定义数组三个数组分别为a,b,c,对数组a,b进行初始化为升序数组,数组c用于存放a,b数组合并后的元素;2)定义三个整型变量i,j,k用于实现将a,b升序数组合并到数组c。

(2)代码如下:

#include <stdio.h>

int main() {
    int a[10] = {2, 4, 5, 7, 9, 10, 14, 16, 18, 19};
    int i, j, k, c[15], b[5] = {1, 5, 11, 17, 21};
    i = 0;
    j = 0;
    k = 0;
    while (i < 10 && j < 5) {
        if (a[i] > b[j]) {
            c[k++] = b[j++];
        } else {
            c[k++] = a[j++];
        }
    }
    // 判断b中是否还有元素没有插入c中
    while (j < 5) { c[k++] = b[j++]; }
    // 判断a中是否还有元素没有插入c中
    while (i < 10) { c[k++] = a[i++]; }
    // 打印输出数组c
    for (i = 0; i < k; i++)printf("%4d", c[i]);
    printf("\n");
    return 0;
}

11、输出Fibonaci数列的前20项:1,1,2,3,5,8,…。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)1)定义整型变量i,a,b,c,n,并给n初始化为20,因为要输出Fibonaci数列的前20项;2)先给a,b赋值为1,并输出;3)利用for循环,从第3项开始,到第20项结束,将a+b赋值给c,并输出,接着将b赋值给a,将c赋值给b,每10个数输出为一行。

(2)代码如下:

#include <stdio.h>

int main() {
    int i, a, b, c, n = 20;
    a = 1;
    b = 1;
    printf("%6d%6d", a, b);
    for (i = 3; i <= n; i++) {
        c = a + b;
        printf("%6d", c);
        if (i % 10 == 0) {
            printf("\n");
        }
        a = b;
        b = c;
    }
    return 0;
}

12、删除一行文字中的某个字符,文字及字符由键盘输入。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)1)定义长度都为100的字符数组str1,str2,字符变量ch,整型变量i,k,并将i和k初始化为0;2)提示用户从键盘输入一行文字,在while条件表达式中,通过getchar()从键盘接收字符存入数组str1中,接收完毕后,把str1中有效字符后的数组元素置为字符串结束符'\0';3)提示用户从键盘输入待删除的字符,并用for循环遍历str1,如果不是待删除字符,就拷贝到str2中,如果是待删除字符,就用变量k累计被删除字符的个数。4)最后输出已删除指定字符的文字及字符。

(2)代码如下:

#include <stdio.h>

int main() {
    char str1[100], str2[100], ch;
    int i = 0, k = 0;
    printf("Please input a phase:\n");
    while ((str1[i] = getchar()) != '\n') {
        i++;
    }
    str1[i] = '\0';
    printf("Delete?");
    fflush(stdout);
    scanf("%1s", &ch);
    for (i = 0; str1[i] != '\0'; i++) {
        if (str1[i] != ch) {
            str2[i - k] = str1[i];
        } else {
            k = k + 1;
        }
    }
    str2[i - k] = '\0';
    printf("\n%s\n", str2);
    return 0;
}

13、从键盘输入 4名学生学号、姓名、成绩,通过指针方法找出成绩最高的学生。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)1)将学生学号、姓名、成绩定义为一个结构体类型;2)定义一个指向结构体类型的指针变量p;3)用for循环将指针变量p指向学生数组的首地址,从键盘接收4名学生学号、姓名、成绩;4)通过指针方法找出成绩最高的学生,把对应的下标i记录下来,并让p指向它的地址,最后用指针变量、指向运算符、成员将其学号、姓名、成绩输出。

(2)代码如下:

#include <stdio.h>

struct student {
    int num;
    char name[20];
    float score;
};

int main() {
    struct student stu[4];
    struct student *p;
    int i, temp = 0;
    float max;
    for (p = stu; p < stu + 4; p++) {
        scanf("%d%s%f", &p->num, p->name, &p->score);
    }
    for (max = stu[0].score, i = 1; i < 4; i++) {
        if (stu[i].score > max) {
            max = stu[i].score;
            temp = i;
        }
    }
    temp = i;
    p = stu + temp;
    printf("\nThe maximum score:\n");
    printf("No.%d\nname:%s\nScore:%4.1f\n", p->num, p->name, p->score);
    return 0;
}

14、输入 n个国家名,按字母先后顺序排列并输出。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)1)定义一个长度为30的字符数组str,二维数组name[20][30],整型变量i,j,k,n,n;2)从键盘接收待输入国家名的数量n,再通过for循环和gets()函数接收国家名,并放入二维数组name中;3)用三层for循环,先比较每个国家名的首字符,如果小于,说明已经排好序,就退出循环;如果大于,说明还没排好序,就用strcpy()函数进行交换;4)用for循环打印输出按字母先后顺序排列国家名。

(2)代码如下:

#include <stdio.h>
#include "string.h"

int main() {
    char str[30], name[20][30];
    int i, j, k, n = 10;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        gets(name[i]);
    }
    for (i = 0; i < n; i++) {
        for (j = i + 1; j < n; j++) {
            if (name[i][k] < name[j][k]) {
                break;
            } else {
                if (name[i][k] > name[j][k]) {
                    strcpy(str, name[j]);
                    strcpy(name[j], name[i]);
                    strcpy(name[i], str);
                    break;
                }
            }
        }
    }
    for (i = 0; i < n; i++) {
        printf("\n%s", name[i]);
    }
    return 0;
}

15、编写程序,把560分钟换算成用小时和分钟表示,然后输出。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)

(2)代码如下:

#include "stdio.h" 

void main() {
    int a=560,b=60,c,d; 
    c=a/b; 
    d=a%b;  
    printf("560分钟=%d小时%d分钟",c,d);      
}  

16、编写程序,输入两个整数:1500350,求出它们的商和余数并进行输出。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)

(2)代码如下:

#include "stdio.h" 

void main() {
    int a,b,c,d; 
    printf("Input two numbers:"); 
    scanf("%d%d",&a,&b); 
    c=a/b; 
    d=a%b;  
    printf("c=%d,d=%d\n",c,d);    
}  

17、编写程序,读入三个双精度数,求出它们的平均值并保留此平均值小数点后一位数,对小数点后的第二位数进行四舍五入,最后输出结果。 

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)

(2)代码如下:

#include "stdio.h" 

void main() {
     double a,b,c,ave; 
     printf("Enter three numbers:"); 
     scanf("%lf%lf%lf",&a,&b,&c); 
     ave=(a+b+c)/3;  
     printf("(1)ave=%f\n",ave); 
     ave=(int)(ave*10+0.5)/10.0; 
     printf("(2)ave=%f\n",ave);      
}  

18、编写程序,读入三个整数给abc,然后交换它们中的数,把a中原来的值给b,把b中原来的值给c,把c中原来的值给a,然后输出abc

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)

(2)代码如下:

#include "stdio.h" 

void main() {
    int a,b,c,m,n,t; 
    printf("Enter three numbers:"); 
    scanf("%d%d%d",&a,&b,&c);  
    printf("a=%d,b=%d,c=%d\n",a,b,c); 
    m=a;
    n=b;
    t=c; 
    b=m;
    c=n;
    a=t;  
    printf("a=%d,b=%d,c=%d",a,b,c);      
}  

19、编写程序,输入一位学生的生日(年:y0、月:m0、日:d0),并输入当前的日期(年:y1、月:m1、日:d1),输出该生的实际年龄。 

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)

(2)代码如下:

#include "stdio.h" 

void main()  {
 int y0,m0,d0,y1,m1,d1,age; 
 printf("请输入该学生的生日:"); 
 scanf("%d%d%d",&y0,&m0,&d0);  
 printf("该学生的生日是%d年%d月%d日\n",y0,m0,d0); 
 printf("请输入当前日期:"); 
 scanf("%d%d%d",&y1,&m1,&d1);  
 printf("当前日期是%d年%d月%d日\n",y1,m1,d1); 
 age=y1-y0;  
 if(m1<m0||m1==m0 && d1<d0)  
 age--;  
  printf("该学生实际年龄为%d岁\n",age);  
}  

20、编写程序,输入一个整数,打印出它是奇数还是偶数。

(1)写出上述编程思路。

(2)根据(1)思路编程序。

(1)

(2)代码如下:

#include "stdio.h" 

void main() {
    int a; 
    printf("Input a number:"); 
    scanf("%d",&a);  
    if(a%2==0) printf("a是偶数\n"); 
    else printf("a是奇数\n");  
}   
  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值