五一C语言作业

五一C语言作业

做了好多次作业,最后发现不总结对自己的编程进步很有限,所以以后每次作业都把题目思路代码发到博客上,加油!

7-1 参考书

某次考试是开卷考试。老师规定,纸质的资料(以下统一称为参考书)可以随便带,或者说只要你背得动想带多少本参考书都行。于是同学们就开始准备参考书了。就在考试前一天,老师觉得大家准备的参考书实在是太多了,就突然改了主意。新规则规定,所带所有参考书的总页数不能超过1000页。这下小明同学犯愁了,因为他准备的参考书总页数远远超过1000。现在请你写一段C程序帮小明算一下他这次考试最多能带几本参考书。

输入格式:

共2行,第1行一个整数n(5<n<100),代表小明同学准备的参考书的总数,第2行是n个用空格分隔的整数,分别代表小明同学每本参考书的页数(每本书的页数大于0,小于1000,测试数据保证所有书的总页数超过1000)。

输出格式:

只有1行,一个整数,表示小明最多可以带的参考书的本数。

输入样例:

10
100 125 200 234 300 321 400 487 500 526

输出样例:

5

思路:

从页数最小的书开始带,按照有小到大开始排序,排完再加和判断有几本。

代码:

 

#include <stdio.h>

int main(){
    int n=0;
    scanf("%d",&n);
    int num[100]={0};

    int i=0;
    for(i=0;i<n;i++){
        scanf("%d",&num[i]);
    }
    int j=0;
    for(i=0;i<n;i++){//冒泡排序记得是最大的数跑最后边去了
        for(j=0;j<n-1-i;j++){
            if(num[j]>num[j+1]){
                int temp=num[j+1];
                num[j+1]=num[j];
                num[j]=temp;
            }
        }
    }
    int page=0;
    int book=0;
    while(page<1000){
        page+=num[book];//最后打印book,如果刚好page==1000要分情况
        if(page<=1000){
            book++;
        }

    }
    printf("%d",book);
    return 0;
}
 

7-2 九宫格密码

随着智能手机的普及,各种应用也层出不穷,安卓的九宫格密码就是其中之一。安卓的九宫格密码可以看做是3×3点阵中的一条路径,只要你在画的时候,不经过重复的点,同时不跳过途中必须要经过的点,那么这条路径几乎是无所不能的。

9.jpg

现在就请你写一段程序将这条路经转换成相应的密码。我们这里做一个限制,就是在画这条路经时,从一个点到另一个点,无论是横向还是纵向每次最多移动一个格。也就是说如果我们按程序设计的习惯用(0,0)表示左上角的点,那么从它出发可能的移动只有三个,即可以移动到(0,1)、(1,0)和(1,1)三个点,而不能像真实的九宫格密码那样可以移动到(1,2)(2,1)等点。

输入格式:

为两行,第一行为两个整数,代表起始点坐标,其中(0,0)代表左上角,(0,1)代表第一行中间,(0,2)代表右上角,(1,0)代表第二行最左等等,其余以此规律类推。第二行为长度最长为8的字符串,代表每次移动的方向。字符串中仅可能含有 ‘1’、 ‘2’、 ‘3’、 ‘4’、 ‘6’、 ‘7’、 ‘8’、 ‘9’八种字符,其中‘1’代表向左下移动、‘2’代表向下移动、‘3’代表向右下移动,‘4’代表向左移动,‘6’代表向右移动、‘7’代表向左上移动、‘8’代表向上移动、‘9’代表向右上移动。输入保证合法,不存在移到九宫格以外的可能。

输出格式:

仅一行,为上述输入的路径所代表的密码。其中每个点所代表的数字同手机键盘,也就是说(0,0)点为1,(0,1)点为2,(0,2)点为3,(1,0)点为4等等。

输入样例:

0 0
661166

输出样例:

在这里给出相应的输出。例如:

1235789

思路:

将1-9代表的运动路径用switch或设置一个函数表示出来,然后依次判断操作

要定义两个函数,一个移动xy,一个判断xy在哪;

做的时候先是指针赋值搞不定,就直接传参做了

然后xy的关系又搞错了,x代表是行,y代表列,于是交换了一下,就过了

菜狗是我!

代码:

 

#include <stdio.h>
#include <string.h>
void judge(int* a, int* b) {
    int n = 0;
    int *x=NULL;
    int *y=NULL;
    x=a;
    y=b;
    if (*x == 0) {
        if (*y == 0)
            n = 1;
        else if (*y == 1)
            n = 4;
        else if (*y == 2)
            n = 7;
    }
    else if (*x == 1) {
        if (*y == 0)
            n = 2;
        else if (*y == 1)
            n = 5;
        else if (*y == 2)
            n = 8;
    }
    else if (*x == 2) {
        if (*y == 0)
            n = 3;
        else if (*y == 1)
            n = 6;
        else if (*y == 2)
            n = 9;
    }
    printf("%d", n);

}
void pos(int* a, int* b, char c) {
    int *x=NULL;
    int *y=NULL;
    x=a;
    y=b;
    //judge(x, y);
    switch (c) {
    case '1':
        *x = *x - 1;//*解引用,&取地址
        *y = *y + 1;
        break;
    case '2':
        *x = *x;
        *y = *y + 1;
        break;
    case '3':
        *x = *x + 1;
        *y = *y + 1;
        break;
    case '4':
        *x = *x - 1;
        *y = *y;
        break;
    case '6':
        *x = *x + 1;
        *y = *y;
        break;
    case '7':
        *x = *x - 1;
        *y = *y - 1;
        break;
    case '8':
        *x = *x;
        *y = *y - 1;
        break;
    case '9':
        *x = *x + 1;
        *y = *y - 1;
        break;
    }
    judge(x, y);
    //printf("%c", n);
}

int main() {
    int a = 0;
    int b = 0;
    int* x = NULL;

    int* y = NULL;
    char move[10] = {0};
    scanf("%d %d", &a, &b);
    x = &a;
    y = &b;
    //getchar();
    scanf("%s", move);

    int len = strlen(move);
    int i = 0;
    judge(y,x);
    for (i = 0; i < len; i++) {
        pos(y, x, move[i]);
    }
    printf("\n");
    return 0;
}
 

7-3 实验7_10_数组交换

设有整数数组A和B,它们长度均为n。A数组中的元素为任意整数,不超过int型数据范围。B数组中元素的值互不相同,且取值介于0至n-1之间。现要求按数组B的内容调整A中数据的次序,比如当B[0]=9时,则要求将A[0]的内容与A[9]互换。

输入格式:

首先输入一个整数n(0<n<=10),代表数组A、B元素的个数。然后输入n个整数代表数组A中的元素。最后输入 n个整数代表数组B中的元素,注意B中元素的要求。

输出格式:

调整后A数组的内容,数与数之间用空格分开,注意第n个数后没有空格而是换行符。

输入样例:

10
5 10 3 9 4 12 8 7 11 2
1 3 6 9 2 7 0 8 5 4

输出样例:

3 9 4 2 5 12 10 11 7 8

思路:

第n个数后没有空格,第一个不打印空格,后面的前边是空格

两个数组关系 A[B[i]]=A[i]

代码:

#include <stdio.h>
int main(){
    int n=0;
    scanf("%d",&n);
    int a[10]={0};
    int b[10]={0};
    int i=0;
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++){
        scanf("%d",&b[i]);
    }
    for(i=0;i<n;i++){
        int temp=a[b[i]];
        a[b[i]]=a[i];
        a[i]=temp;
    }
    for(i=0;i<n;i++){
        if(i==0)
            printf("%d",a[i]);
        else
            printf(" %d",a[i]);
    }


    return 0;
}
 

7-4 实验9_1_括号匹配

任意给定一个字符串,字符串中包含除了空格、换行符之外的任意字符。你的任务是检测字符串中的小括号是否配对,即“(”与“)”是否配对。如字符串“((a+b)* (c+d))”中小括号是配对的,而“((a+b)*) c+d))”则不配对。

程序运行效果:

Sample 1: ((a+b)*(c+d)) ↙

parentheses match!↙

Sample 2:

((a+b)*)c+d)) ↙

parentheses do not match!↙

输入格式:

一个长度不超过100的非空字符串,该字符串中不会出现空格、换行符。

输出格式:

见程序运行效果。

输入样例:

((a+b)*(c+d)) 

输出样例:

parentheses match!

思路:

可以看到,左括号总要和右括号相等,且左括号先出现,不能是右括号先出现,

所以,左括号出现加一,右括号出现减一,这个数不能为负数,

注意,这种记数的问题,往往记数过程中可能会出现不符合的情况

这里是flag<0

所以再设置一个count记录

代码:

#include <stdio.h>
#include <string.h>
int main(){
    char a[101]={0};
    scanf("%s",a);
    int len=strlen(a);
    int i=0;
    int count=0;
    int flag=0;
    for(i=0;i<len;i++){
        if(a[i]=='(')
            flag=flag+1;
        else if(a[i]==')')
            flag=flag-1;
        if(flag<0)
            count=1;

    }
    if(flag==0 && count==0)
        printf("parentheses match!");
    else
        printf("parentheses do not match!");
    return 0;
}
 

7-5 17进制

请写一段程序将17进制数转换为10进制。

输入格式:

为一个只包含小写字母的字符串(其中a代表17进制的0,b代表17进制的1,以此类推直到q代表17进制的16),字符串以’\n’结束。

输出格式:

是一个整数,转换后的10进制数。测试用例保证合法,且转换后的整数可以用int存储。

输入样例:

caa

输出样例:

578

思路:

 p进制转q进制,p进制先转10进制,10进制再转q进制

算法笔记93页写的很详细

代码:

#include <stdio.h>
#include <string.h>
int main(){
    char num[100]={0};
    scanf("%s",num);
    int len=strlen(num);
    int i=len-1;
    int y=0;
    int p=1;
    while(i>=0){
        y=y+(num[i]%97)*p;
        i--;
        p=p*17;
    }
    printf("%d",y);
    return 0;
}

作业完成!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值