五一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点阵中的一条路径,只要你在画的时候,不经过重复的点,同时不跳过途中必须要经过的点,那么这条路径几乎是无所不能的。
现在就请你写一段程序将这条路经转换成相应的密码。我们这里做一个限制,就是在画这条路经时,从一个点到另一个点,无论是横向还是纵向每次最多移动一个格。也就是说如果我们按程序设计的习惯用(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;
}
作业完成!
标签:10,进制,int,样例,作业,C语言,num,else,五一 来源: https://blog.csdn.net/keepgoingYi/article/details/116330334