C言語なら俺に聞け( ..
[2ch|▼Menu]
331:プリンがー
07/10/24 12:53:45
>>318
プログラムってどこで実行できるんすか??


332:デフォルトの名無しさん
07/10/24 12:54:43
NG

333:takumi
07/10/24 14:13:59
XPでvisualstudioを使ってます。
問題:長さ100のint型配列 int a[100]がある。a[0]〜a[99]には整数が収められているする。
この100個の中で一番小さい数を求め、画面に出力するプログラムを作成せよ。
出力形式は「ans.=???」とせよ。???の部分は答え。

なんですが、全くわからないので教えて下さい。。

334:デフォルトの名無しさん
07/10/24 15:08:21
宿題スレへ
スレリンク(tech板)l50

335:デフォルトの名無しさん
07/10/24 16:24:03
コテ付目欄空欄…
どこの中学生掲示板だよ

336:デフォルトの名無しさん
07/10/24 17:59:26
つか入力がわかっているのになぜscanfを使う必要あるんだよ。

337:デフォルトの名無しさん
07/10/24 21:19:58
未経験ということでソフトウェア開発企業に入社したんだけど、whileのところで早速詰まった('A`
0〜9 までの数字を、0 から1個ずつ増やしながら 10行表示しなさいっていうプログラムを作るんだけど、
0
01
012
0123
01234
012345・・・
とはならずに
0
1
2
3
4
ってなっちゃいます。というかそういう風に書いてるのもわかるんですが、
#include <stdio.h>
int main(void)
{
int a = 0;

a = 0;
while(a < 10)
{
printf("%d\n" ,a);
a++;
}

return 0;
}
↑whileの中をどうすればいいんでしょう・・・。

338:デフォルトの名無しさん
07/10/24 21:26:55
while(a < 10)
{
int b = 0;
while(b <= a)
{
printf("%d", b);
b++;
}
printf("\n");
}

339:デフォルトの名無しさん
07/10/24 21:29:01
#include <stdio.h>
int main(void)
{
int a,b;

for(a=0;a<10;a++)
{
for(b=0;b<=a;b++)printf("%d" ,b);
printf("\n");
}

return 0;
}

340:デフォルトの名無しさん
07/10/24 21:32:40
>>338
ああああありがとうございます!
whileの中にwhile使うとは盲点。
流れも理解できましたありがとうございます!

341:デフォルトの名無しさん
07/10/24 21:35:51
>>340 for文を使ったほうがベター

342:デフォルトの名無しさん
07/10/24 21:38:14
そこまで出来ないでよく仕事になるな 入って2週間以内とかか? それならいい

343:デフォルトの名無しさん
07/10/24 21:38:43
>>341
そうなんですよね。
他にもwhileを使って、2個入力した文字列が、同じ文字列かどうか判断するプログラムを作ったんですが、
ifelse使った方が手っ取り早かったり、一応基本中の基本ということで頑張ってますが、
とりあえずとことん覚えてみようと思います。

344:デフォルトの名無しさん
07/10/24 21:40:48
>>342
まだ3日目です('A`)('A`)('A`)
初日はOSインスコとかパソコンに関する事を教わって(というか何回もやってきた事なので余裕でした)
二日目は%dやらfloat=小数点やら、long=スゲーでかい数とか、配列とかを覚えて
本日三日目でif else for を覚えたんですが、whileがなんかスゴイ曲者というか、問題がクセものでてんてこ舞いです。。。

345:デフォルトの名無しさん
07/10/24 21:44:45
>>343
実戦力高めるならSTLだな
たとえば2つの文字列比較するならこうやればいい

#include <iostream>
#include<string>
using namespace std;

main(){
string a,b;
a="こんにちは"; b="こんばんわ";
cout<<a<<" と "<<b<<"は ";
if(a==b)cout<<"一致"; else cout<<"違う";
}

346:デフォルトの名無しさん
07/10/24 21:59:46
行列を計算するときにライブラリって使えるの?
固有値を求めたいんだけど。

347:デフォルトの名無しさん
07/10/24 22:09:40
>>345
初心者(それも++じゃなくてCっぽい)にそんなこと教えたら、
同じ文字列が入ったchar配列を==比較して「あれ? 同じのはずなのに……」てことになるぞ

348:デフォルトの名無しさん
07/10/24 22:16:49
>>346
標準ライブラリーにはない
特殊な科学技術計算用のライブラリーを手に入れるか、自作するか

349:デフォルトの名無しさん
07/10/25 08:26:44
>>346
clapack

350:デフォルトの名無しさん
07/10/25 22:25:22
typedef struct{
int hoge;
int hage;
int hige;
int huge;
} HOGE;
と言う構造体があるとして、hoge = 1; hage = 0; hige = 1; huga = 1;となっているとします。
その構造体の中で、値が"1"になっている物を見付けたいのですが、そういうことはできないですか?
構造体内の変数の値を調べ、それが条件にあっていれば別々の処理をしたいです。


351:デフォルトの名無しさん
07/10/25 22:28:28
Cじゃムリ。
リフレクションのある言語ならできる。

352:デフォルトの名無しさん
07/10/25 22:39:37
意味がわからんぽ

メンバ名で参照したくないって事?
構造体先頭からのオフセットでアクセスするとかかな

353:デフォルトの名無しさん
07/10/25 22:50:11
>>350
配列にしない(できない)理由はあるの?

typedef union{
struct{
int hoge;
int hage;
int hige;
int huge;
}
int array[4];
} HOGE;

354:350
07/10/25 22:57:44
>>353
なんですかそれは…
始めてみました。 意味がちょっとわかりません…
その形にしておいて、
HOGE u_hoge;
....
u_hoge.array[0]にしたら、hogeにアクセスできるって事ですかね?

355:デフォルトの名無しさん
07/10/25 22:58:37
共用体でググってくるんだ!

356:デフォルトの名無しさん
07/10/25 23:55:24
だんだんと解ってくると、プログラム書くのが面白くなってくるなぁと思った超初心者な俺。

357:デフォルトの名無しさん
07/10/26 00:26:59
fgetsで入力した後'\n'を消す方法はありますか?
あまりポインタは使いたくないんですが・・・

358:aho
07/10/26 00:29:26
>>350
構造体のポインタを利用してみました。

#include <stdio.h>

typedef struct{
int hoge;
int hage;
int hige;
int huge;
}HOGE;

int main(){
HOGE* hogep = NULL;
try{
hogep = new HOGE();
}catch(...){
printf("new error!\n");
}
/* メンバ変数の初期化 */
hogep->hoge = 1;
hogep->hage = 0;
hogep->hige = 1;
hogep->huge = 1;

printf("%d\n", hogep->hoge);

return 0;
}

359:デフォルトの名無しさん
07/10/26 00:40:51
>>357
fgets(buf, n, fp);
if (buf[strlen(buf) - 1] == '\n') {
buf[strlen(buf) - 1] = '\0';
}

・・・?

360:デフォルトの名無しさん
07/10/26 00:44:21
>>357
fgets(buff, sizeof buff, stdin);
for(i=0; buff[i]; i++) if(buff[i]=='\n') { buff[i] = '\0'; break;}

361:デフォルトの名無しさん
07/10/26 01:39:24
C++Compiler / Turbo Debugger をzipから解凍したらフォルダに何も入ってなかったんだけど・・・
どこでパス入力するの?

362:教えてください
07/10/26 03:23:34
C言語についての質問です。
下記の素数か素数でないか調べるコードで、
@変数名にis_primeとありますが、isは何を意味しているのですか?
Ais_prime = 1;とするのがわかりません。
B以下、return 0; まで、どういう流れかわかりません
よろしければ1行ずつ教えてもらえるとうれしいです。

#include <stdio.h>

int main(void)
{
int num, i, is_prime;

printf("判定したい数を入力してください: ");
scanf("%d", &num);

/* 約数があるかどうか調べる */
is_prime = 1;
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;

if(is_prime==1 && num > 1) printf("素数です");
else if (num > 1) printf("素数ではありません");

return 0;
}

363:デフォルトの名無しさん
07/10/26 03:44:59
num is_prime なんだろ

364:デフォルトの名無しさん
07/10/26 08:08:18
>>362
適当な数字入れて処理追いかけてみろよ。

365:デフォルトの名無しさん
07/10/26 08:13:38
なんにもわかってないってことかよw

366:デフォルトの名無しさん
07/10/26 11:02:57
>>362
You is fool.

367:デフォルトの名無しさん
07/10/26 11:26:14
>>361
解凍しなおしてみたら?

368:デフォルトの名無しさん
07/10/26 12:54:26
You are Shock!

369:デフォルトの名無しさん
07/10/26 13:24:17
atofとか解読できなさそうだな

370:デフォルトの名無しさん
07/10/26 13:55:39
数値計算において
不等号の>>と>の判別ってプログラム的にどうすべきですかね?

計算は対数でするんだけど。

371:デフォルトの名無しさん
07/10/26 14:35:43
差が閾値を越えるかどうかで判定
もしくは比が閾値を越えるかで判定

372:デフォルトの名無しさん
07/10/26 15:09:54
その問題では>>と>=で計算方法違うんだよ。
今計算してみると対数の値をexpかけてみて値をみていくと
値がかわってくるのが差が10から15あたりのときみたいだから
閾値を15で計算をかえてみることにするわ。


373:デフォルトの名無しさん
07/10/26 15:49:02
for(;loc<100;loc++){
if(loc<100){
 printf("氏名を入力して下さい(空白で終了):\n");
 fgets(data[loc].namae,39,stdin);←この行
 if(!*data[loc].namae)break;
 printf("電話番号を入力して下さい:\n");
 fgets(data[loc].denwa,39,stdin);
 printf("市外局番を入力して下さい:\n");
 fgets(str,9,stdin);
 data[loc].sigai=atoi(str);
}
}
上の行のfgetsをgetsに変えるとEnterでbreakするんですけど
fgetsのままでは動作しません。どうすればfgetsのままで動作しますか?

374:デフォルトの名無しさん
07/10/26 16:10:04
>>367
何回解凍しなおしてもダウンロードしなおしても空…
zipファイルはちゃんと容量あるのに解答してできたフォルダには容量が全くなくなる。

375:デフォルトの名無しさん
07/10/26 16:15:36
>>374
解凍ソフトは何?
パス付きに対応してないやつなんじゃね?

376:デフォルトの名無しさん
07/10/26 16:17:32
>>373
fgetsは改行も取り込むから、

fgets(data[loc].namae,39,stdin);
if(data[loc].name[0] == '\n') break;
これでおk

377:デフォルトの名無しさん
07/10/26 16:26:35
>>376
出来ました。ありがとうございます。

378:デフォルトの名無しさん
07/10/26 16:30:47
fgetsの解説ですが
URLリンク(ohmoriws1.ms.kagu.tus.ac.jp)
ここは間違ってる?もしくは誤解される様な感じなのですか・・?

一度参考にしたんですが・・。

379:デフォルトの名無しさん
07/10/26 16:46:34
>>378
'\n'を取り除くとも書いてないから間違いとは言えない。
しかし、その直後のfputs()の説明が間違っているから信用できない。

380:デフォルトの名無しさん
07/10/26 17:20:43
すいません超絶初心者な僕に教えて頂きたいことがあるます

1行64バイトのファイル(行数可変)のデータに何回も文字列の検索を行ういアウトプットするプログラムを作っています。
fgetsを使い何回もファイルを読み込んで一行ずつ比較するというようにできたにはできたのですが、
行数可変で多い場合100000行超えたりするファイルに対してはえらい時間がかかります。

メモリにぶちこんでそこから何回も検索を行いたいと思うのですが、どう組んだらいいでしょうか。

381:これ参考に
07/10/26 17:37:47
#include <stdio.h>
#include <time.h>
#include <string.h>
int N;
void serch(char* x,char* str,int* adr){
char t[256];int n,M,k,su=0;
for(M=0;;M++)if(str[M]=='\0')break;
for(n=0;n<256;n++)t[n]=M;
for(n=1;n<=M;n++){k=(unsigned char)str[M-n];if(t[k]==M)t[k]=n;}
n=0;while(1){
for(k=0;k<M;k++)if(str[k]!=x[n+k]) break;
if(k==M){adr[su]=n;su++;n+=M;}
else {k=(unsigned char)x[n+M];n+=t[k];}
if(n+M>=N){adr[su]=-1;return;}}}

main(){
N=18000000;char *x=new char[N];N=0;
char buf[120],k,n;
FILE *fp=fopen("2ch.txt","rb");
while(k=fread( buf,1,100,fp)){
for(n=0;n<k;n++)x[N+n]=buf[n];N+=k;}
fclose(fp);
printf("データロード完了!\n測定中です・・・\n");
int adr[30000];
char str[]="名無し";
serch(x,str,adr);
}

382:デフォルトの名無しさん
07/10/26 18:07:20
>>381
変数の使い方、変数の名前が気持ち悪い

>>380
malloc,realloc使うべし

383:デフォルトの名無しさん
07/10/26 18:08:40
あ、いや、バイナリならftellとfseekでサイズが分かるから、
reallocはいらないやも

384:デフォルトの名無しさん
07/10/26 18:24:22
>>381さん
ありがとうございます

>>382さん
mallocを使った場合どのように組めばいいでしょうか?

385:デフォルトの名無しさん
07/10/26 18:35:14
一番簡単な方法おしえてやる

386:デフォルトの名無しさん
07/10/26 18:36:04
>>375
ありがとう。
解凍ソフト変えたらできた。

387:デフォルトの名無しさん
07/10/26 18:53:06
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
fstream fp("test.txt");
string str,buf;
do{
fp >> buf;
str+=buf;
}while((!fp.eof()));
int n=str.find("会議");
cout << n;
}

388:デフォルトの名無しさん
07/10/26 18:53:49
>>381
だからその入力ロジックを何とかしろって

389:デフォルトの名無しさん
07/10/26 19:06:04
>>384
適当に書いた例だけど

FILE *fp;
char *data;
... //省略
data = (char*)malloc(sizeof(char) * 128); /とりあえずchar128個分確保
if(data==NULL) return 1; //エラー処理
int i=0,size=128;
while((data[i] = getchar()) != EOF){
if(++i >= size){
char *tmp;
tmp = realloc(data,sizeof(char) * (size + 50)); //50ずつ拡張
if(tmp == NULL){
/* reallocは元の領域を解放するが、失敗時は解放せずにNULLを返す
そのため、失敗時に解放できるように、別変数で一度戻り値を受けてから、エラーチェックする */
free(data); //mallocやreallocで確保した領域は必ず解放する
return 1;
} else {
data = tmp;
size += 50;
}
}
}
free(data) //必ず解放

390:デフォルトの名無しさん
07/10/26 20:26:58
#include<stdio.h>

int A;
int B;
void X(int a[],int b[]){
printf("%d",a);
printf("%d",b);
}

void main(void){

//省略

X("A","B");

質問させてください
変数A Bを引数使って表示させたいんですけど、コマンドプロンプト?で実行させると警告がでてちゃんと表示されません。
どうすればいいでしょうか?

説明不足ですみませんがよろしくお願いします

391:デフォルトの名無しさん
07/10/26 20:29:39
関数の引数としてポインタを渡して、そのポインタの変数に値をいれているのですが、
関数を呼び出す時によって、値をいれる必要が無いときがあります。
不要な値のために変数を宣言したくないのですが、変数を宣言しないでいい方法などはありませんか?

hoge( &x, &y, &height, &width);
と呼び出すのですが、&heightと&widthの結果を使わないときもあるので、
int x, y; だけ宣言して、heightとwidthは変数宣言したくないと思っています。

392:デフォルトの名無しさん
07/10/26 20:30:26
型がヘンすぎる 勉強不足

393:デフォルトの名無しさん
07/10/26 20:31:42
>>391
C++は入れない場合も同じ名前に出来る 2つ書けばいい

394:デフォルトの名無しさん
07/10/26 20:33:40
int hoge( a, b, c, d);を定義して
たとえばcとdを使わないなら、hoge( a, b) { return hoge( a, b , 0 , 0);}

395:デフォルトの名無しさん
07/10/26 20:34:45
>>391
NULL を使えばいいと思うよ

>>393
ここはC言語のみ
C++なら誘導してからにしてください

396:391
07/10/26 20:39:55
>>393
すみません、C言語です。

>>394
すみません。 私が関数ではないため動作が変えれないのと、不必要な値は6この引数のうち、
1, 2, 5が不要になったりする場合もあります。

>>395
すみません。
NULLを使うと言うのは、どのようにすればいいのでしょうか?
型を、castするという意味でしょうか?

397:391
07/10/26 20:48:00
連続投稿失礼します。
hoge( &x, &y, NULL, NULL);
とすれば、コンパイルは通ったのですが、これは正しいのでしょうか?

簡単に動作を説明して頂けるとありがたいです。

398:デフォルトの名無しさん
07/10/26 20:50:47
>>397
動作はNULLで通るように自分で書かなければ行けない

399:391
07/10/26 21:26:43
>>398
> 自分で書かなければいけない
と言うのは、関数をそのように修正すると言うことでしょうか?
関数は自分で作ったもので修正はできないと思います。

400:デフォルトの名無しさん
07/10/26 21:27:56
>>399
NULL の指す先を読み書きしないようにするだけ

401:デフォルトの名無しさん
07/10/26 22:00:33
>>399
hoge()の仕様がわからないと、引数でNULLを渡していいかどうかは判断できない。

402:デフォルトの名無しさん
07/10/26 22:44:08
heightとwidthは>>391が使わないというだけでhogeは内部で値を設定しようとするからNGだと予測する俺エスパー

403:デフォルトの名無しさん
07/10/26 22:51:54
まともな関数ならチェックしてるだろうけど・・・

404:デフォルトの名無しさん
07/10/27 00:01:40
昔はチェックしてたけど不定値渡されて以来チェックするのをやめた

405:デフォルトの名無しさん
07/10/27 00:10:28
>>404
あなたが hoge() か

406:デフォルトの名無しさん
07/10/27 00:15:31
#include <stdio.h>

int f(int &x){
if(&x==NULL)
return -1;
return x+10;}


int main(){
int x=0;
printf("%d\n",f(x));}

407:デフォルトの名無しさん
07/10/27 00:23:05
>>406
それじゃポインタ渡した意味な(ry

408:デフォルトの名無しさん
07/10/27 00:29:32
-1がreturnされることってある?

てか参照渡しってCで使えるの?

409:デフォルトの名無しさん
07/10/27 00:38:22
#include <stdio.h>

int f(int *x){
if(x==NULL)
return -1;
return *x+10;}


int main(){
int x=0;
printf("%d\n",f(NULL));}

410:デフォルトの名無しさん
07/10/27 00:42:57
それがどうしたと言わざるをえない

411:デフォルトの名無しさん
07/10/27 00:45:11
assert(p != NULL); で十分。

412:デフォルトの名無しさん
07/10/27 00:50:42
assertと引数チェックは違うんだぜ・・・

413:デフォルトの名無しさん
07/10/27 01:30:01
引数チェックが一番の使いどころだろ > assert()

414:デフォルトの名無しさん
07/10/27 01:34:02
>>413
へぇ、永遠のデバッグビルドか

415:デフォルトの名無しさん
07/10/27 09:58:07
>>414
sunも引数チェックにassert使えって言ってるよ。

416:デフォルトの名無しさん
07/10/27 10:40:38
それは引数を渡す方も一緒に開発してる時だろ
内部的なエラーでも無い限りNULLになる事はありえない前提

417:デフォルトの名無しさん
07/10/27 11:38:55
自分で作ってるライブラリじゃなくても、仕様にNULLを渡した時の動作が書いてなかったら、
NULLを渡すなんてありえない。

418:デフォルトの名無しさん
07/10/27 16:10:15
引数チェックはやって当然。

419:デフォルトの名無しさん
07/10/27 16:15:39
両方書いておけばおk

420:デフォルトの名無しさん
07/10/27 16:20:57
ポインタで渡される引数のチェックって
NULL比較?

421:デフォルトの名無しさん
07/10/27 17:39:12
mallocとかポインタがわけわかりません。

図とかでイメージしやすく解説してください


422:デフォルトの名無しさん
07/10/27 17:44:10
>>391
カリー化

423:デフォルトの名無しさん
07/10/27 17:45:58
>>421
本読め

424:デフォルトの名無しさん
07/10/27 17:46:25
mallocって
char *str;

/* 文字列のためのメモリを確保 */
str = (char *)malloc(100);

こんな感じに書いてるけど

char str[100]

ってやった方が楽じゃん。なんでmallocなんて使うの?

425:デフォルトの名無しさん
07/10/27 17:49:17
>>391
型が分からなかったので適当に決めた
int hoge_wrap(int *x, int *y, int *width, int *height){
int dummy=0;
if(x==NULL) x=&dummy;
if(y==NULL) y=&dummy;
if(width==NULL) width=&dummy;
if(height==NULL) height=&dummy;
return hoge(x, y, width, height);
}

426:デフォルトの名無しさん
07/10/27 17:50:10
>>424
必要ないなら無理して使わなくても良い物です

427:デフォルトの名無しさん
07/10/27 17:52:55
>>426
無理して使えるようになるためにおせーてよ
何か新天地が開けるかもしれないじゃん


というか教えてくださいお願いしますガンダム見ませんから

428:デフォルトの名無しさん
07/10/27 17:56:59
newやvectorつかえば十分 性能も変わらない

429:デフォルトの名無しさん
07/10/27 17:58:13
char型で考えるから分かりにくいことになる。

430:デフォルトの名無しさん
07/10/27 18:00:08
char だと領域確保に制限がある new mallocは巨大なのが出来る

431:デフォルトの名無しさん
07/10/27 18:00:14
newやvectorがわからないっす

432:デフォルトの名無しさん
07/10/27 18:04:55
>>427
char array[100]; のかわりにchar *p; p=(char*)malloc(100);を使うとき

1.配列のサイズが未定のとき
  実行時にしかか配列のサイズ(この場合100)がわからないとき
2..配列のサイズが大きすぎて内部変数として確保できないとき
  外部変数を使うという手もある

433:デフォルトの名無しさん
07/10/27 18:05:28
ここって C++ ありだっけ?

434:デフォルトの名無しさん
07/10/27 18:09:53
char型だと巨大配列を確保できない

#include <iostream>
#include <vector>
using namespace std;
#define N 10000000

main(){

int *x;
x=new int[N];

vector<int> y;
y.reserve(N);

// char z[N];z[0]=1;

for(int n=0;n<N;n++)x[n]=y[n]=1;
printf("%d",x[0]);}

435:デフォルトの名無しさん
07/10/27 18:10:55
>>433
なし

436:デフォルトの名無しさん
07/10/27 18:11:16
mallocとnewに性能の違いはなく、vectorはちょっと高性能でちょっと動作に負担がかかる

437:デフォルトの名無しさん
07/10/27 18:30:06
(ノ∀`) アチャー

438:デフォルトの名無しさん
07/10/27 18:58:41
>>418
状況による。
たまにいる、必ずやるってやつは素人。

439:デフォルトの名無しさん
07/10/27 19:23:20
>>424
配列サイズが分からなかったり、途中で増える可能性がある時に使う

440:デフォルトの名無しさん
07/10/27 19:35:21
>>438
やらないとLintに叱られます

441:プリンがー
07/10/27 19:55:12
問題を解く時、まず問題を見て引数があるかないかってどうやって分かります?


442:デフォルトの名無しさん
07/10/27 20:02:57
問題ってのが仕事上の問題なのか学校で先生に出された問題なのかによる

443:デフォルトの名無しさん
07/10/27 20:03:16
エスパー!! エスパー!!

444:デフォルトの名無しさん
07/10/27 20:07:27
>>440
そんなlintありません。

445:デフォルトの名無しさん
07/10/27 20:21:30
>>434
スタックサイズを増やせばおk
ま、普通はポインタにして malloc するがな

446:デフォルトの名無しさん
07/10/27 20:37:47
>>424

char str[100] の[]の中に変数を入れるとコンパイルエラーになるが、
mallocだとそれができます。

447:デフォルトの名無しさん
07/10/27 20:42:54
コンパイラによってはエラーにならないけどな

448:デフォルトの名無しさん
07/10/27 20:55:01
C99

449:プリンがー
07/10/27 22:06:09
>>442
学校で先生に出された問題ってか演習問題とか


450:デフォルトの名無しさん
07/10/27 23:11:41
>>449
コンピュータじゃないんだから人間的に考えればいいと思うよ

451:デフォルトの名無しさん
07/10/27 23:16:35
入力として必要なものは引数なんじゃね

452:デフォルトの名無しさん
07/10/28 00:19:56
1 getchar() を用いて 1 文字入力を行い、Ctr+Z が入力されるまで次の処理を繰り返しなさい。
  大文字、小文字に関係なく、アルファベットを入力した場合には、それぞれの入力した個数を数えなさい。
2. 1. の処理終了後、アルファベットをそれぞれ何個ずつ入力したか出力しなさい。
これなんですがどう頑張っても意味不明です・・・
ヒントとして
?入力アルファベットの個数を数えるカウンタは大きさ 26 の配列で用意。
最初に、配列の 26個の要素すべてを0クリアすること。
?A〜Z、a〜z は ASCIIコードの 65〜90、97〜122 に該当することを考えれば、配列の何番目をカウントUP するかは計算で求められるはず。
実行結果
入力文字
14abcaaabccdzzgk(リターン)
aabc147cab8cc3c(リターン)
CTRL+Z(リターン)
とすると
a = ○○個 b = ○○個 c = ○○個 改行
d = ○○個 e = ○○個〜〜〜 と一覧を出力させたいんです。
とあるんですが、どう書いたらいいんでしょうか・・・('A`
switch使ってみたりしたんですが、イマイチ意味がわからなくなってきました・・・。
ちなみに今まで習った事は、
if if else for while break continue goto 算術関数 strcpy等、 等の初歩的なことだけです。。。

453:デフォルトの名無しさん
07/10/28 00:22:10
>>452
宿題スレ行け

454:デフォルトの名無しさん
07/10/28 00:25:32
どこがわからないのかが分からないが

65-65は0
90-65は25

97-97は0
122-97は25
ってことじゃね

455:デフォルトの名無しさん
07/10/28 00:25:45
今まで習った事の中にgotoがあるのが気になる・・・
普通初心者にgotoは教えないだろ

456:デフォルトの名無しさん
07/10/28 00:25:56
>>152
宿題スレに行け……と言いたいところだがヒントをやろう

'a'-'a' == 0
'z'-'a' == 25
'A'-'A' == 0
'Z'-'A' == 25

457:デフォルトの名無しさん
07/10/28 00:29:12
goto嫌いな人ってbreakとかcontinueとかも嫌い?

458:デフォルトの名無しさん
07/10/28 00:30:44
goto が嫌いな理由は goto に過剰反応する人を呼ぶ事

459:デフォルトの名無しさん
07/10/28 00:33:50
gotoが嫌いというよりは、(gotoを)初心者に教えるのが嫌い

460:デフォルトの名無しさん
07/10/28 00:56:35
あーいえA=65とかで、考え方としては、
scanfで変数cに文字を入れた場合、変数cから65を引いた数、例えばAなら65で0となり、Cなら67で2となり、
配列a[26]の[]内をcとして、そこに+1づつカウントしていく というのはわかるんですが、
どう書いていいのかチンプンカンプンなんです・・・。
そもそもgetcharって1文字入力なのに演習問題の実行例には
abcdddef14(return)
afijjgjkk(return)
CTRL+Zってなっててなんで文字列での入力になってるんだろうとか思ったり('A`

ちなみにgotoは多段ループから強制的に抜けたい場合にのみ使ったほうがいいかもしれないけどオススメはできないとも書いてありました。

461:デフォルトの名無しさん
07/10/28 01:01:19
あ、ちょっと頑張って書いてみます。
なんとなくわかりかけたかも・・・?
ちなみにC言語学んでからまだ5日目です('A`

462:デフォルトの名無しさん
07/10/28 01:03:27
getcharで一文字ずつ取り出す
意味のある文字はアルファベットとCTRL+Z。
それ以外の(return)とか数字とかは無視すればいいんじゃね?
CTRL+Zはなんだっけ・・・EOT?

463:デフォルトの名無しさん
07/10/28 01:09:23
>>462
whileでのgetcharでのループから抜け出すための CTRL+Z=EOF っす。
a と入力して、画面に a = 1個 と入力させるのはかけるんですが、
abcと入力した場合は配列使うと思うんですが、まずそもそも
getcharでabcの場合 while ((c = getchar()) != EOF) //cは配列 配列に入力 CTRL+Zを押すとwhile終了。
でc[]にc[0]=a c[1]=b c[2]=cとなる・・・の?あれ理解しかけてきました。
ずっとc[0]にabcとなると思ってました・・・。
文字列の場合はgetsになるんですね、このすぐ先に習う項目にgetsあってみてみたら文字列って書いてあってアッーって思いました。

464:デフォルトの名無しさん
07/10/28 01:10:57
勘違いしてるっぽい

465:デフォルトの名無しさん
07/10/28 01:12:50
・「abcと入力した場合」でもgetcharは「a」を入力した時点で抜けてくる
・c = getchar()のcは配列である必要ない

のはず・・・

466:デフォルトの名無しさん
07/10/28 01:20:45
ナンダッテー!
見た目的には a と打ち込むだけでは エンターを押さない限り文字入力待機画面になってるんですけど、(上記問題の場合はwhileなので文字→エンター→入力待機→文字→エンター→入力待機となるのはわかります)
内部的には処理されているということですか?
aだけ押す、エンターは押さない→画面には入力待機状態であるが、内部的には処理されている?
ちょっとやってみまつ。

467:デフォルトの名無しさん
07/10/28 01:24:39
内部的にどのタイミングで処理してても、変わらないんだが。

468:デフォルトの名無しさん
07/10/28 01:26:04
ということはgetcharでabcdefと入力した場合は
aからfまで順に1つ1つ処理していくということになるんですか?

469:デフォルトの名無しさん
07/10/28 01:30:56
while ((c = getchar()) != EOF) {
puts("なんか入力された\n");
}

470:デフォルトの名無しさん
07/10/28 01:34:00
エンターを押した時点で処理が開始されるが、文字列をまとめてじゃなくて一文字ずつ読み込む

471:デフォルトの名無しさん
07/10/28 01:35:44
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF) {
printf("%d\n" ,c);
}
return 0;
}

出力した結果、>>470さんの言ったとおり、例えばAAA(リターン) の場合綺麗に65656510と表示されました!
これで問題に取り組んでみたいと思います!
ありがとうございます!!!

472:デフォルトの名無しさん
07/10/28 01:37:46
あれ?Enter待ちになるのか/(^o^)\
引っ込んでようorz

473:デフォルトの名無しさん
07/10/28 01:40:34
いえいえ、協力してくれようとしてくれただけでも感謝感激雨霰です。
皆さん本当にありがとうございました。

474:デフォルトの名無しさん
07/10/28 01:41:46
霰が霧に見えた orz

475:デフォルトの名無しさん
07/10/28 09:44:07
goto嫌いな人が do{}while(0) で break を使っているのを見て泣けた。

476:デフォルトの名無しさん
07/10/28 11:44:11
VisualStudio2008で作ったプログラムなんですが、
重複したシンボルがある(?)とか怒られてて困っています
原因がわかる方いませんか?おねがいします

URLリンク(www.uploda.org)
一応ファイルをうpしました

477:デフォルトの名無しさん
07/10/28 11:56:55
>>476
マルチうざい

478:デフォルトの名無しさん
07/10/28 13:19:04
>>476
どのシンボルが重複してるかまで表示されてるだろ?
それが重複してるんだよ。

479:デフォルトの名無しさん
07/10/28 13:41:16
>>478
ありがとうございました。よく見たら書いてました。

480:デフォルトの名無しさん
07/10/28 15:03:31
2バイト文字の扱いがよくわからないです
例えば、配列の中身を順に表示させようと思っても文字化けします
array[11] = {"しーげんご"};
Shift-Jisとかに変換してから使うんですか?

481:デフォルトの名無しさん
07/10/28 15:17:35
>>480
> 配列の中身を順に・・・
1バイトずつの表示はできない。

482:デフォルトの名無しさん
07/10/28 15:30:49
>>481
そうなんですか・・・
じゃあ半角英字みたいに平仮名でも文字コードに数字を足して
次の文字へ!みたいな処理はできますか

483:デフォルトの名無しさん
07/10/28 15:54:37
なんの文字コードを使っているのかわからないが、
いちど使用している文字コードの文字コード表を見ることを薦める。

ちなもに、S-JISでは、「あ」「い」「う」は,それぞれ,0x82a0, 0x82a2, 0x82a4

484:デフォルトの名無しさん
07/10/28 16:02:41
>>483
調べてみたんですが、SーJISで「あ」を表示させるには
%cを2回と0x82,0xa0をつかって表示させると書いてありました。
ほかの表示方法は見つけられなかったのですが、ありますか?

485:452
07/10/28 17:12:30
無事できました!
が、次の問題で一点引っかかる事が('A`
終了条件eまたはEってどういう風に記述するんですか?
while(gets(str) != ○○)
の○○にeかEを入力した場合で終了という風にしたいのですが・・・。
'e' とか'E'は駄目みたいです。

486:デフォルトの名無しさん
07/10/28 17:13:57
なんでgetsになってんの?

487:デフォルトの名無しさん
07/10/28 17:17:56
あ、ごめんなさい。
習う順番でgetchar+putchar → gets+putsという風になってて
問題が、
gets() を用いて、テストの点数を文字列として入力しなさい。
上記処理中、eかEを入力した場合は下記処理をスキップさせ、内容を出力せよ っていう問題なんです。
考え方としては、今まで習ってきたように ○○が入力されるまでは処理を続けるというwhileループでの処理だと思うんですが・・・。

488:デフォルトの名無しさん
07/10/28 17:21:55
文字列の中に'e'か'E'があるかどうかをチェックする

489:デフォルトの名無しさん
07/10/28 17:33:29
ありがとうございます><
int変数aというものを新たに用意し、
getsで入力した中に、a = 'e' か a='E' での判定を入れたら無事とおりました><

490:デフォルトの名無しさん
07/10/28 19:18:39
どうしてもwhile内で済ませたかったら、
while(gets(str)[0] == 'E')
とか? 試してないけど

NULLが返ってきた時に危険だなw

491:デフォルトの名無しさん
07/10/28 19:42:10
URLリンク(a-draw.com)
できたました!
こんな長い(すごい短いんだろうけど・・・)の書いたの初めてです・・・。

492:デフォルトの名無しさん
07/10/28 19:47:06
3つの整数値を読み込んでそれらの値がすべて等しければ「3つの値は等しいです」と、
どれか2つの値が等しければ「2つの値が等しいです」と、そうでなければ「3つの値が異なります」と表示するプログラムをつくりなさい
   

#include <stdio.h>
int main(void)
{
int n1,n2,n3;
printf("整数A"); scanf("%d", &n1);
printf("整数B"); scanf("%d", &n2);
printf("整数C"); scanf("%d", &n3);
if(n1==n2==n3)printf("3つの値は等しいです");
else if(n1==(n2||n3))
printf("2つの値は等しいです");
else if(n2==(n1||n3))
printf("2つの値は等しいです");
else if(n3==(n2||n1))
printf("2つの値は等しいです");
else printf("3つの値は異なります");
return(0);
}
このように組んで整数Aに1整数Bに2整数Cに3を代入すると2つの値は等しいですと表示されてしまいます
問題点を教えてください><

493:デフォルトの名無しさん
07/10/28 19:53:17
n1==n2==n3 は n1==(n2==n3) で、意味が違う。
n2||n3 n2||n1 n1||n3 は、それぞれ両方0のとき0、それ以外だと1になる。

494:デフォルトの名無しさん
07/10/28 19:55:04
#include <stdio.h>
int main(void)
{
int n1,n2,n3,k=0;
printf("整数A "); scanf("%d", &n1);
printf("整数B "); scanf("%d", &n2);
printf("整数C "); scanf("%d", &n3);

if(n1==n2)k++;
if(n1==n3)k++;
if(n2==n3)k++;

if(k==3)printf("3つの値は等しいです");
else if(k==1)printf("2つの値は等しいです");
else printf("3つの値は異なります");
}

495:デフォルトの名無しさん
07/10/28 19:56:48
問題点を聞かれてるのに、俺プログラムを自慢されても困る

496:492
07/10/28 20:05:56
>>493-494
ありがとうございました。||の使い方をかんちがいしていました。。。

497:デフォルトの名無しさん
07/10/28 20:33:46
>>491
なんか無駄が多い気がするが、まあそれは眼をつむっておこう


だがgetsの入力先配列が要素数2てのは……誤入力もあるだろうし、せめて256くらい確保した方が良い気がする

というか、要素数2だとヌル文字入らないじゃん(というか100も入らないし)
atoiってヌル文字入らないと変な動作になることあるはず

498:デフォルトの名無しさん
07/10/28 21:06:24
>>497
むむ、
getsでの取得は 例えば入力が50なら、charだから配列[0]に50 で配列[1]に\0が入る=2個で足りるってことじゃないですか?
もしgetsでの取得変数がintの場合なら点数最大100(つまり3桁)は最低でも[4]になるのはわかります。

まぁでも、教えてもらっている人にも、配列は無駄でもいいから多く取った方がいいと教わりましたので、多くとる事を、この先心がけていきます!
ありがとうございました!

499:デフォルトの名無しさん
07/10/28 21:21:49
ごめんなさいボクが馬鹿でした。
ためしにcharでの変数aに入力したものを、出力させるのかいてみて
a[0]をやったら、最初の1文字しか出力されませんでした。
本当にありがとうございました。

500:デフォルトの名無しさん
07/10/28 22:56:33
int *foo
int* foo
の違いを教えてください><

今までint *foo しか使ってなくて
いきなりint* fooが出てきてわけわかりません><

501:デフォルトの名無しさん
07/10/28 22:57:42
>>500
次は int * foo だ

502:デフォルトの名無しさん
07/10/28 23:00:18
宣言時のアヌスの位置くらい自由にさせてあげてください

503:デフォルトの名無しさん
07/10/28 23:03:21
いまだにforの無限ループを見ると悲しくなる( ; ; )

504:デフォルトの名無しさん
07/10/28 23:04:11
>>501
そんなのもあるのですか

ソース解読してる途中にこんなの出てきてわけわからんのです
すいませn助けてください。ほんと

何でグぐれ場いいのかもわからなくて
すんません、マジで

505:デフォルトの名無しさん
07/10/28 23:07:39
>>504
int *foo;
int* foo;
int * foo;
は全部一緒

506:デフォルトの名無しさん
07/10/28 23:09:54
ありがとうございます

なんでこんな風に書き方分けてるのか

507:デフォルトの名無しさん
07/10/28 23:14:35
*は型名にも変数名にも使えないから問題ない

508:デフォルトの名無しさん
07/10/28 23:35:53
初歩的な質問なのですが

for(int i = size >> 1 ; ; i >>= 1)

というループがあったのですが
size >> 1 や i >>= 1 というのはどういう意味なのですか?




509:デフォルトの名無しさん
07/10/28 23:37:41
int*foo;もいけるんじゃない?

510:デフォルトの名無しさん
07/10/28 23:40:19
>>508
ビットシフト

511:デフォルトの名無しさん
07/10/28 23:44:55
>>508のだとiをビットシフトするとどうなるんでしょう

あとforの2つ目のところが空白なのもわけがわかりません

512:デフォルトの名無しさん
07/10/28 23:46:35
i >>= 1 すると i の各ビットが右へ 1 桁ずつずれる

forの2つめが空白の場合は条件なしの繰り返し=無限ループ

513:デフォルトの名無しさん
07/10/28 23:53:43
>>511
iが10(2進数で1010)だとすると5(101)になる
5だとすると2(10)になる。その次はもう予想できるよな?

514:デフォルトの名無しさん
07/10/29 00:07:56
>>512-513
ありがとうお兄ちゃんたち!

515:デフォルトの名無しさん
07/10/29 01:18:22
>>506
俺は
int* foo;
のほうが好きかな
「int型へのポインタを返す」ってのをあらわしてる感じで

516:デフォルトの名無しさん
07/10/29 01:35:28
俺は
int *foo;
のほうが好きかな
int *foo, *bar;
みたいに複数いっぺんに宣言するときわかりやすいし

517:デフォルトの名無しさん
07/10/29 01:35:53
しかしそれだと、2個目以下に*付け忘れる可能性がある。

518:デフォルトの名無しさん
07/10/29 01:37:09
517は>>515

519:デフォルトの名無しさん
07/10/29 02:21:33
大きな配列の初期化って
どうしていくべきですか?
100X100くらいの配列の

520:デフォルトの名無しさん
07/10/29 02:23:34
あんな風にしていくべきだと俺は思っている
だがそういう風にするとああいうことも起きるわけでいちがいに
どちらがいいとは判断しかねるな

521:デフォルトの名無しさん
07/10/29 06:11:01
ど素人におすすめの参考書を教えてください。

522:380
07/10/29 11:19:52
先週質問させていただいた者ですが、mallocでどうしても組めません。
mallocでメモリに格納→格納した文字列を検索後抜き出す動作をもう一度ご教示いただけないでしょうか。

523:デフォルトの名無しさん
07/10/29 12:46:28
>>522
先ずは試しにfgets()版を見せてくれ。

524:380
07/10/29 13:16:03
>>523
void Hairetsu(void) {
FILE *read;
char fnameread[90];
char charline[90];
char KensakuName[20];
strcpy(fnameread, "*****.txt");
strcpy(KensakuName, "C3 10237");
StartTime = clock();
printf("%d\n", StartTime);
while(KensakuCount < 10) {
read = fopen(fnameread, "r");
if (read == NULL) {
printf("ファイルがオープンできません\n");
exit(1);
}
while(1) {
fgets(charline, 90, read);
if (strcmp(charline, "ENDDATA\n") == 0){
***ファイルは必ず最後の行にENDDATAと記載されています
break;
}
if (strncmp(charline, KensakuName, 16) == 0) {
***ここで検索に引っかかった行から新たな要素を取り出して再度同ファイル内で検索をかけます
***その際にまた先頭行から読み直してfgetsを用いて検索をしこれをこのif内で3回程度繰り返えします。
}
}
fclose(read);
}
}

525:デフォルトの名無しさん
07/10/29 13:31:08
>>524=380
「えらい時間」とあるけど、どれくらい掛かるの?
試しに>524相当のロジックを書いて10万と1行のファイルで動かしてみたが、1秒も掛からないんだが。

526:380
07/10/29 13:37:22
>>525
これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。
それで更にその中に計算式が組み込まれていますので・・・・

527:デフォルトの名無しさん
07/10/29 13:45:24
>これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。
>524からこれは読み取れないわけだがw
つーか、それはそもそもアルゴリズムに問題がないか?
オンメモリでもそれだけアクセスすればそれなりに遅いと思うぞ。

528:デフォルトの名無しさん
07/10/29 13:49:43
どうでもいいが、10万行^5は10^25だな。
仮に1nsで処理できる凄まじいコンピュータがあったとして、ざっと3億年掛かる計算だが。

529:デフォルトの名無しさん
07/10/29 14:58:18
ポインタ配列のキューに文字列を挿入するプログラムを作っているのですがうまくいかないです。
挿入後に現在入っているキューを全部表示するようにしたいのですが、最後に挿入した文字列しか表示されないです。
ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、
char型だとなぜこうなってしまうのでしょう?

実行結果(変数opがchar)
Operation(0:enqueue 2:quit)0
input string : a
String Queue : [a]
head[0] tail[1]
Operation(0:enqueue 2:quit)0
input string : b
String Queue : [b]
head[0] tail[1]
Operation(0:enqueue 2:quit)

実行結果(変数opがint)
Operation(0:enqueue 2:quit)0
input string : ab
String Queue : [ab]
head[0] tail[1]
Operation(0:enqueue 2:quit)0
input string : bc
String Queue : [ab] [bc]
head[0] tail[2]
Operation(0:enqueue 2:quit)

次レス以降にソースを書きます

530:1/2
07/10/29 14:58:49
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

struct structQ { char Q[5];};

int next (int x){
if(x==4) return 0;
else return x+1;
}

void enqueue(char *s, int head, int *tail, structQ *AllQ){
if(next(*tail)==head) printf("OVERFLOW!\n");
else
{
strcpy(AllQ[*tail].Q, s);
*tail = next(*tail);
}
}

void printQueue(int head, int tail, structQ *AllQ){
int h;
printf("String Queue : ");
for(h=head; h!=tail; h =next(h))
printf("[%s] ", AllQ[h].Q);
printf("\n");
}


531:2/2
07/10/29 14:59:25
int main (void){
structQ *AllQ;
AllQ = (structQ *)malloc( sizeof(structQ)*(5) );
int head =0, tail =0;
char *s, str[100];
char op;
// int op;
while(1){
printf("Operation(0:enqueue 2:quit)");
scanf("%s", &op);
if(op == '0')
// scanf("%d", &op);
// if(op == 0)
{
printf("input string : ");
scanf("%s", str);
s = (char *)malloc( sizeof(char)*(strlen(str)+1) );
strcpy(s,str);
enqueue(s, head, &tail, AllQ);
free(s);
printQueue(head, tail, AllQ);
}
else if(op == '2')
// else if(op == 2)
break;//終了
else
printf("invalid ope number!\n");
printf("head[%d] tail[%d]\n", head, tail);
}
free(AllQ);
return 0;
}

532:デフォルトの名無しさん
07/10/29 15:05:00
>>529
STL使っておけ

vector< string > x;

x.push_back("文字列");
x.push_back("名無しです");

x[0],x[1]で文字列にアクセスできる

533:デフォルトの名無しさん
07/10/29 15:09:27
>scanf("%s", &op);

文字列を入力したいんなら、char じゃだめだろ
char には 1 文字しか入らない
char の配列にしないと

534:デフォルトの名無しさん
07/10/29 15:11:49
>>532
突っ込みどころだらけ。

>#include "stdio.h"
cの規格にあるインクルードファイルは""で括ってはいけません。
また、一般的にプロジェクトローカルなもの以外は<>で括るべきです。

>ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、
%d指定で整数値を入力する場合、入力に失敗した場合は変数が更新されないので、「0と認識してしまう」というのは間違い。

>scanf("%s", &op);
文字型への%s指定は行なってはいけません。%sはあくまでも、文字列入力です。
この呼び出しで恐らくスタック領域の破壊が起こり、他の変数の値がおかしくなったせいでキュー登録に失敗した可能性があります。

535:デフォルトの名無しさん
07/10/29 15:12:45
>>532
cにはSTLなどありません。スレタイも読めないくらい頭が回らないのであれば、無理に回答しなくて宜しいかと。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5264日前に更新/251 KB
担当:undef