类scanf函数中%[*]type的巧用场景

2011-02-24 wcdj

 

%[*]type,此问题对scanf和fscanf通用。关于*号用法的解释如下。
%[*][width][modifiers]type
* —— An optional starting asterisk indicates that the data is to be retrieved from stdin but ignored, i.e. it is not stored in the corresponding argument.

应用场景1:
将文件中的数据读入到指定的变量中,文件中数据的格式为:(每行第一个数为行号,后三个数为int型,再后三个数为double型)
1 1,2,3,1.2,3.4,5.5
2 22,31,100,1.0,2.2,-3.5
……

 

 

结论:使用%*d可以跳过第一列的序号。

应用场景2:
从文件中逐个读出能读的浮点数,比如"1.0,3.5,2.2 ……"
题目来源:
http://topic.youkuaiyun.com/u/20110218/12/E039E736-CA2F-4168-B06A-14D386D511C5.html
http://topic.youkuaiyun.com/u/20110223/15/3fd75e15-fe7d-432b-8b6c-c048ddec20a0.html?38465

 

测试数据:
1 1,2,3,1.2,3.4,5.5
2 22,31,100,1.0,2.2,-3.5
wcdj 2011 hello123.456world #123&456*789!

输出:
[1]==1
[2]==1
[3]==2
[4]==3
[5]==1.2
[6]==3.4
[7]==5.5
[8]==2
[9]==22
[10]==31
[11]==100
[12]==1
[13]==2.2
[14]==-3.5
[15]==2011
[16]==123.456
[17]==123
[18]==456
[19]==789

 

 

 

 

为什么我错了?题目是6-1 求排列数 分数 15 作者 颜晖 单位 浙大城市学院 本题要求实现一个计算阶乘的简单函数,使得可以利用该函数,根据公式P n m ​ = (n−m)! n! ​ 算出从n个不同元素中取出m个元素(0<m≤n)的排列数。 函数接口定义: double fact( int n ); 其中n是用户传入的参数,函数返回n的阶乘。 裁判测试程序样例: #include <stdio.h> double fact( int n ); int main(void) { int m, n; double result; scanf("%d%d", &m, &n); if(m > 0 && n > 0 && m <= n){ result = fact(n)/fact(n-m); printf("result = %.0f\n", result); } return 0; } /* 请在这里填写答案 */ 输入样例: 2 14 输出样例: 在这里给出相应的输出。例如: result = 182 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB我的答案是#include <stdio.h> double fact( int n ); int main(void) { int m, n; double result; scanf("%d%d", &m, &n); if(m > 0 && n > 0 && m <= n){ result = fact(n)/fact(n-m); printf("result = %.0f\n", result); } return 0; } double fact( int n ){ double i,final=1; for(i=1;i<=n;i++){ final=i*final; } return final; }PTA编译显示a.c:22:5: error: redefinition of ‘main’ 22 | int main(void) | ^~~~ a.c:5:5: note: previous definition of ‘main’ with type ‘int(void)’ 5 | int main(void) | ^~~~ a.c: In function ‘main’: a.c:10:5: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 10 | scanf("%d%d", &m, &n); | ^~~~~~~~~~~~~~~~~~~~~ a.c: In function ‘main’: a.c:27:5: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 27 | scanf("%d%d", &m, &n); | ^~~~~~~~~~~~~~~~~~~~~
10-03
函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); 其中List结构定义如下: typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; 各个操作函数的定义为: List MakeEmpty():创建并返回一个空的线性表; Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR; bool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;否则,如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false; bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 5 #define ERROR -1 typedef enum {false, true} bool; typedef int ElementType; typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); int main() { List L; ElementType X; Position P; int N; L = MakeEmpty(); scanf("%d", &N); while ( N-- ) { scanf("%d", &X); if ( Insert(L, X, 0)==false ) printf(" Insertion Error: %d is not in.\n", X); } scanf("%d", &N); while ( N-- ) { scanf("%d", &X); P = Find(L, X); if ( P == ERROR ) printf("Finding Error: %d is not in.\n", X); else printf("%d is at position %d.\n", X, P); } scanf("%d", &N); while ( N-- ) { scanf("%d", &P); if ( Delete(L, P)==false ) printf(" Deletion Error.\n"); if ( Insert(L, 0, P)==false ) printf(" Insertion Error: 0 is not in.\n"); } return 0; } /* 你的代码将被嵌在这里 */ 输入样例: 6 1 2 3 4 5 6 3 6 5 1 2 -1 6 输出样例: FULL Insertion Error: 6 is not in. Finding Error: 6 is not in. 5 is at position 0. 1 is at position 4. POSITION -1 EMPTY Deletion Error. FULL Insertion Error: 0 is not in. POSITION 6 EMPTY Deletion Error. FULL Insertion Error: 0 is not in.
05-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值